소스에서 입자를 생성하고 위치를 업데이트하는 시스템이 있습니다. 현재 OpenGL에서 내 GenerateParticles(...)
과 UpdateParticles(...)
을 호출하고 출력을 표시하는 프로그램을 작성했습니다. 내 시스템에 갖고 싶은 기능 중 하나는 초당 입자 수 n
입니다. GenerateParticles(...)
및 UpdateParticles(...)
함수에서 중요한 매개 변수는 current_time
및 delta_time
입니다. UpdateParticles(...)
에서 다음 수식에 따라 입자 위치를 업데이트합니다. new_pos = curr_pos + delta_time*particle_vector
. 이러한 매개 변수와 전역 변수 (또는 다른 메커니즘)를 사용하여 초당 입자 수를 n
으로 어떻게 만들 수 있습니까?입자 시스템 : 입자 생성
4
A
답변
2
입자를 만드는 순진한 방법은 낮은 값인 n
(아마도 원하는 것은 아님)에 대해 분수 입자를 생성하게하는 데주의해야합니다. 대신 각 프레임에 delta_time
값으로 합계 된 누적 기 변수를 만듭니다. 당신은 시간 델타가 큰 경우 만을 작성하지 않도록 일부에 제한 넣어 있는지 확인
void GenerateParticles(double delta_time) {
accumulator += delta_time;
while (accumulator > 1.0/particles_per_second) {
CreateParticle(...);
accumulator -= 1.0/particles_per_second;
}
}
: 각 프레임은 적절한 양을 그 프레임을 생성하고 뺄 필요가 얼마나 많은 입자보고 그것을 확인 입자를 한 번에 기본적으로는 i
입자를 방출 할 수
double n = delta_time * frequency
int i = (int)n;
f = n - i;
:
0
GenerateParticles
에 n * delta_time
개의 입자를 만들어야합니다.
1
프레임에서 방출 된 입자의 개수가 계산 될 수있다.
부분 부분 f
은 이후 프레임에 대해 누적 될 수 있습니다. 그것은보다 큰 하나를 축적 할 때 당신은 입자의 정수를 방출 할 수있다 :
f_sum += f;
if (f_sum > 1.0) {
int j = (int)f_sum;
f_sum -= j;
i += j;
}
그러나, 다음과 같은 입자의 분수에 대한 또 다른 흥미로운 솔루션입니다. 입자가 방출되어야 하는지를 결정하기 위해, 의사 난수 생성기 (PRNG), 우리는 그것을 사용할 수를 사용함으로써
: 주파수 변화가 시간에 대하여 언제
if (f >= r()) // Assumes r() is a PRNG generating a random value in [0, 1)
i++;
이 방법은 유용하다. 또한 추가 변수를 저장할 필요가 없습니다.
이 접근법의 또 다른 장점은 파티클 시스템이 덜 균일 해 보일 것입니다. 예를 들어 빈도가 1.5이고 델타 시간이 1 인 경우 첫 번째 방법을 사용하면 프레임이 1, 2, 1, 2, ... 입자 순서로 방출됩니다. 두 번째 방법은이 패턴을 깰 수 있습니다.
게다가 부동 소수점의 정수 부분과 분수 부분을 추출하려면 modf()
을 사용할 수 있습니다.
관련 문제
- 1. XNA 입자 시스템 성능
- 2. 2d에서 입자 시스템 시작하기
- 3. cocos2d의 여러 입자 시스템
- 4. 입자 시스템 설계?
- 5. 이미지 마스킹으로 입자 생성
- 6. 체적 입자
- 7. 임의의 속도를 가진 2D 입자 시스템
- 8. 여러 텍스처를 혼합하여 입자 시스템 만들기
- 9. 입자 애니메이션이 너무 느립니다.
- 10. 이미지를 따르는 입자
- 11. cocos2d 입자 성능
- 12. uview의 입자 효과
- 13. AS3 가상 입자 배열
- 14. WebOS의 미세 입자 타이밍
- 15. iOS 용 입자 애니메이션
- 16. HTML 5 캔버스 입자
- 17. opengl 입자 엔진 모범 사례?
- 18. CCTextureCache를 사용하여 입자 텍스처 설정
- 19. AS3의 입자 시스템, 플래시를 사용하여 파티클 요소를 복사하는 문제
- 20. 아이폰에 입자 시스템을 만들고 생성 된 입자를 유지하는 방법은 무엇입니까?
- 21. CUDA 용 미세 입자 메모리 검사기?
- 22. 오픈 소스 매끄러운 입자 유체 역학
- 23. Cocos2D 입자 수명을 단축하는 방법은 무엇입니까?
- 24. AS3의 텍스트에서 입자 구조를 만드는 방법은 무엇입니까?
- 25. XML 스키마 독특한 입자 저작자 제약
- 26. 입자 이동을 시뮬레이션하는 좋은 방법은 무엇입니까?
- 27. 정지 이미지를 LSL의 입자 밖으로 만드는 방법은 무엇입니까?
- 28. 보기 기반 응용 프로그램에서 입자 효과를 사용하는 방법은 무엇입니까?
- 29. OpenGL ES 2.0 - 간단한 입자 시스템을위한 최적 경로
- 30. CCTouchesMoved에서 Cocos2D 입자 효과를 사용하는 중에 FPS가 낮추는 문제가 발생했습니다.
delta_time은 일반적으로 0보다 작은 두 배입니다. 입자의 일부분을 생성 할 수 없다고 가정하십시오. – Myx
@Myx : 당신은 그것이 하나보다 적다는 것을 의미한다고 생각합니까? 'n * delta_time'을 누적하고'1'과 비교하는 것이 더 간단하고 빠르지 만, 실제로는 @Ron이 지적한 문제는 아닙니다 ... – Troubadour