4

関数を使用して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__
4

2 に答える 2

7

Particles へのポインタの配列を宣言しましたが、実際にはどれも割り当てられていません。

(そして、他の誰かが指摘しているように、配列は1ではなく0でインデックス付けされているため、とにかくループは1で終了します)

AddParticle() に渡す粒子構造を埋めているように見えるため、これがどのように機能するかは完全には明らかではありません。これは、既に試した配列に戻す粒子へのポインターを返します。参照する。

コードを見ると、おそらく次のようなものが必要です。

void Build()
{
    for (int i = 1; i <= 100; i++)
    {
        AddParticle(Particle(0.f, 1.f, 5.f));
    }
}

パーティクル クラスがパーティクルを処理するため、配列は必要ありません。

于 2012-12-13T22:15:18.640 に答える
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]);

 }
}
于 2012-12-13T22:20:24.220 に答える