2016-06-12 2 views
0

최근에 먼지 방출기를 시도하는 동안 입자 효과에 사용하기 위해 볼륨 렌더링 시스템을 만들었습니다. 입자 위치가 완전히 잘못되었음을 알았습니다. 나는 위치를 설정하기 위해 각각의 입자에 공급되는 시드 난수를 생성합니다. 정상적으로 디버깅을 시작하면 입자는 두 위치에서 서로 위로 스폰합니다. 중단 점을 적용하고 한 번에 하나의 입자를 루프 한 다음 계속할 때 각 입자는 지정된 임의의 위치에있었습니다. 이 외에도 대형 파티클에서 문제를 테스트하는 동안 특정 숫자의 루프를 깨기 위해 히트 카운트를 사용했으며,이 경우에만 위에서 언급 한 두 가지 위치 중 하나로 초기화합니다. 무엇이 이것을 일으킬 수 있습니까?시동시 생성자 값이 적용되지 않음

VolumetricDust::VolumetricDust(string type, Transform* transform, ID3D11Device* pDevice, int width, int height, int depth, bool instanceFlag, int instanceCount) 
{ 

    for (int i = 0; i < POOL_SIZE; i++) 
{ 
    // PROBLEM LOOP 
    particles_[i] = new ParticleVolume("Resources\\nucleon.raw", transform, width, height, depth, instanceFlag, instanceCount); 
    particles_[i]->Initialise(pDevice); 

    srand((unsigned int)time(NULL)); 
    int test = (rand() % 100 + 1); 
    int test1 = rand() % 30 + 1; 
    int test2 = rand() % 50 + 1; 

    particles_[i]->SetVelocity(XMFLOAT3(0.0f, (float)test, 0.0f)); 
    particles_[i]->GetTransform()->SetPosition((float)test, (float)test1, (float)test2); 


    } 

posReset = transform; 
_transform = transform; 

mWidth = width; 
mHeight = height; 
mDepth = depth; 

isInstance = instanceFlag; 
instanceNum = instanceCount; 

_currentTime = 0.0f; 
_spawnTime = 5.0f; 
_newTime = 0.1f; 
_dustTime = 0.0f; 
particleTime = 5.0f; 
_type = type; 
_pd3dDevice = pDevice; 
} 

void VolumetricDust::SpawnEmitter() 
{ 

for (int i = 0; i < POOL_SIZE; i++) 
{ 
    if (!particles_[i]->GetParticleOn()) 
    { 

     particles_[i]->SetParticleOn(true); 
     break; 
    } 

} 

} 

void VolumetricDust::Update(float dt, Camera* cam) 
{ 
_transform->Update(); 
_currentTime += dt; 
_dustTime += dt; 


for (int i = 0; i < POOL_SIZE; i++) 
{ 
    SpawnEmitter(); 

    if (particles_[i]->GetParticleOn()) 
    { 

     //posReset->SetPosition(XMFLOAT3(0.0f, 0.0f, 0.0f)); 

     particles_[i]->Update(dt, cam, posReset->GetPosition()); 
    } 

    if (_transform) 
    { 
     _transform->Update(); 
    } 

} 



} 

void VolumetricDust::Draw(ID3D11DeviceContext * _pImmediateContext, ConstantBuffer3D & cb, ID3D11Buffer* _pConstantBuffer) 
{ 
for (int i = 0; i < POOL_SIZE; i++) 
{ 
    if (particles_[i]->GetParticleOn()) 
    { 
     particles_[i]->Draw(_pImmediateContext, cb, _pConstantBuffer); 
    } 

} 

} 

답변

4

srand으로 전화해야합니다.

이와 같이 루프에서 호출하면 확률이 매우 높아서 매 회마다 동일한 시간 값을 얻을 수 있습니다. 그러면 난수가 다시 설정되고 모든 점수는 아니더라도 대부분의 경우 동일한 결과가 나타납니다.

디버거를 중지하면 time에 대한 호출간에 실시간 변경이 이루어지며 이제 시드가 달라 지므로 별도의 임의 값을 얻습니다.

+0

정말 고마워요! 나는 최근에 srand를 사용하기 시작했고, 나는 이것을 인식하지 못했습니다! – MrPurple

+2

레거시''rand'' /''srand'' 함수 대신 [] (http://en.cppreference.com/w/cpp/numeric/random)을 사용하는 것을 고려해야합니다 –