启动时未应用构造函数值
Constructor values not being applied on startup
我最近制作了一个体积渲染系统,希望将它们用于粒子效果,在尝试粉尘发射器时,我注意到粒子的位置完全错误。我生成种子随机数,我将其馈送到每个单独的粒子中以设置位置。当我开始正常调试时,粒子只会在两个位置上一个接一个地生成。当应用断点并逐步通过循环时,一次一个粒子然后继续,每个粒子都在其指定的随机位置。除此之外,在大型粒子池上测试问题时,我使用了命中计数来打破某个数字的循环,发现当这种情况发生时,它只会将它们初始化为上述位置中的一个或两个。可能是什么原因造成的?
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);
}
}
}
您应该只调用 srand
一次。
当你像这样在循环中调用它时,每轮获得相同时间值的几率非常高。这会重置随机数,并且对于大多数(如果不是全部)点,您将获得相同的结果。
在调试器中停止将使对 time
的调用之间的实时发生变化,并且您将获得单独的随机值,因为种子现在不同了。
我最近制作了一个体积渲染系统,希望将它们用于粒子效果,在尝试粉尘发射器时,我注意到粒子的位置完全错误。我生成种子随机数,我将其馈送到每个单独的粒子中以设置位置。当我开始正常调试时,粒子只会在两个位置上一个接一个地生成。当应用断点并逐步通过循环时,一次一个粒子然后继续,每个粒子都在其指定的随机位置。除此之外,在大型粒子池上测试问题时,我使用了命中计数来打破某个数字的循环,发现当这种情况发生时,它只会将它们初始化为上述位置中的一个或两个。可能是什么原因造成的?
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);
}
}
}
您应该只调用 srand
一次。
当你像这样在循环中调用它时,每轮获得相同时间值的几率非常高。这会重置随机数,并且对于大多数(如果不是全部)点,您将获得相同的结果。
在调试器中停止将使对 time
的调用之间的实时发生变化,并且您将获得单独的随机值,因为种子现在不同了。