我正在尝试使用OpenGL创建一个烟火(我必须在位置(0,0,0)中放置100个粒子)
Particle *p[100];
void Build()
{
for (int i = 1; i <= 100; i++)
{
p[i]->pos.x = 0.0;
p[i]->pos.y = 1.0;
p[i]->pos.z = 5.0;
p[i]=AddParticle(*p[i]);
}
}
但是我收到以下错误:
ass.exe中0x771b15de处的未处理异常:0xC0000005:访问冲突写入位置0x00000000。
这是代码的其余部分:
class Particle
{
public:
Vector3 pos; // current position
Vector3 vel; // velocity
Vector3 restPos; // rest (initial) position
Vector3 oldPos; // previous position
Vector3 acc; // acceleration
Particle()
{
oldPos = restPos = pos = Vector3(0, 0, 0);
Init();
}
Particle(float x, float y, float z)
{
oldPos = restPos = pos = Vector3(x, y, z);
Init();
}
Particle(const Vector3 & _p)
{
oldPos = restPos = pos = _p;
Init();
}
void Init()
{
acc = Vector3(0, 0, 0);
vel = Vector3(0, 0, 0);
}
void Update(const float & time_step)
{
Verlet(time_step);
}
// integration step with Verlet
void Verlet(const float & time_step)
{
Vector3 temp = pos;
pos += vel * time_step + acc * time_step * time_step ;
vel = (temp - oldPos) / time_step;
oldPos = temp;
}
};
# endif // _PARTICLE__
using namespace std;
class ParticleSystem
{
vector<Particle> _particles; // the particles
Vector3 m_vGravity; // gravity force applied to the particles system
float m_fTimeStep; // time step
Vector3 attractor;
public:
ParticleSystem()
{
m_vGravity = Vector3(0, -9.81f, 0);
m_fTimeStep = TIME_STEP;
attractor = Vector3(0, 0, 0);
}
void Reset()
{
_particles.clear();
}
// accessing the fields
void SetGravity(Vector3 g) { m_vGravity = g;}
void SetTimeStep(float ts) { m_fTimeStep = ts;}
// adding a particle
Particle* AddParticle(Particle _p)
{
_particles.push_back(_p);
return &(_particles.back());
}
void Build()
{
for (int i = 1; i <= 100; i++)
{
Particle p;
p.pos.x = 0.0;
p.pos.y = 1.0;
p.pos.z = 5.0;
p[i]=AddParticle(p);
}
}
void Draw()
{
// draw round points
glPointSize(4.f);
glEnable(GL_POINT_SMOOTH);
glAlphaFunc(GL_GREATER,0.5f);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
// draws the particles
glBegin(GL_POINTS);
glColor3f(1.f, 0.f, 0.f);
vector<Particle>::iterator pIt;
for(pIt = _particles.begin(); pIt != _particles.end(); pIt++)
{
Vector3& pos = pIt->pos;
glVertex3f(pos.x, pos.y, pos.z);
}
glEnd();
glEnable(GL_LIGHTING);
}
#endif // __PARTICLE_SYSTEM__
答案 0 :(得分:7)
你已经声明了一个指向粒子的指针数组,但实际上没有分配任何指针。
(正如其他人指出的那样,数组是0索引的,而不是1 - 所以你的循环总是在1之外)
目前还不完全清楚它是如何工作的,因为你似乎正在填充一个粒子结构,你传递给AddParticle(),它返回一个指向粒子的指针,你将它放回到你的数组中。我们已经试图参考。
查看您的代码,您可能只需要:
void Build()
{
for (int i = 1; i <= 100; i++)
{
AddParticle(Particle(0.f, 1.f, 5.f));
}
}
不需要数组,因为粒子类会照顾粒子。
答案 1 :(得分:1)
我认为这是因为数组从0到99 ......而不是1到100。
将for语句更改为for (int i = 0; i < 100; i++)
并记住数组以0
此外,我想我知道你要做的是什么......试着这段代码:
void Build()
{
Particle p[100];
for (int i = 0; i < 100; i++)
{
p[i].pos.x = 0.0;
p[i].pos.y = 1.0;
p[i].pos.z = 5.0;
AddParticle(p[i]);
}
}