2010-04-19 7 views
4

소스에서 입자를 생성하고 위치를 업데이트하는 시스템이 있습니다. 현재 OpenGL에서 내 GenerateParticles(...)UpdateParticles(...)을 호출하고 출력을 표시하는 프로그램을 작성했습니다. 내 시스템에 갖고 싶은 기능 중 하나는 초당 입자 수 n입니다. GenerateParticles(...)UpdateParticles(...) 함수에서 중요한 매개 변수는 current_timedelta_time입니다. UpdateParticles(...)에서 다음 수식에 따라 입자 위치를 업데이트합니다. new_pos = curr_pos + delta_time*particle_vector. 이러한 매개 변수와 전역 변수 (또는 다른 메커니즘)를 사용하여 초당 입자 수를 n으로 어떻게 만들 수 있습니까?입자 시스템 : 입자 생성

답변

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

GenerateParticlesn * delta_time 개의 입자를 만들어야합니다.

+0

delta_time은 일반적으로 0보다 작은 두 배입니다. 입자의 일부분을 생성 할 수 없다고 가정하십시오. – Myx

+0

@Myx : 당신은 그것이 하나보다 적다는 것을 의미한다고 생각합니까? 'n * delta_time'을 누적하고'1'과 비교하는 것이 더 간단하고 빠르지 만, 실제로는 @Ron이 지적한 문제는 아닙니다 ... – Troubadour

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()을 사용할 수 있습니다.

관련 문제