2012-12-13 2 views
4

나는 기능불꽃 OpenGL을

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]); 

    } 
} 

와 OpenGL을 가진 불꽃 (나는 위치 (0, 0, 0)에서 100 개 입자를 삽입해야합니다)를 만들려고 해요 그러나 나는 다음과 같은 오류가 발생합니다 :

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__ 
+1

왜를'표준 :: 벡터'? – genpfault

+0

코드에 대해 자세히 알려주십시오. 배열 요소를 어디에서 할당하고 있습니까? –

답변

7

당신은 입자에 대한 포인터의 배열을 선언하지만, 실제로 중 하나를 할당되지했습니다

코드의 나머지 부분입니다.

(그리고 다른 사람이 지적 하듯, 배열 인덱스 0이 아니라 1 - 그래서 루프 어쨌든 1에 의해입니다)

그것의 완전히 명확하지 이것은 당신이 작성 될 것으로 작동하도록되어 방법 이미 파티클을 가리키는 포인터를 반환하는 AddParticle()에 전달한 파티클 구조에서 이미 참조하려고했던 배열에 다시 넣습니다. 입자 클래스로 필요

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

없음 배열 입자 후 같습니다 코드를 보면

, 당신은 아마 뭔가를해야합니다.

+0

우리는 Particle이 무엇인지, AddParticle이 실제로 무엇을하는지 모르기 때문에 말하는 것이 까다 롭습니다. 나는 추측을했지만, 도움이되지 않는다면, 우리에게 좀 더 많은 정보를 주어야 할 것입니다. – JasonD

+0

나머지 코드를 추가했습니다 – Jen

+0

감사합니다 !! 지금 그것은 작동한다! – Jen

1

나는 배열이 0에서 99까지 1 ... 100이 아니기 때문에 생각합니다.

for (int i = 0; i < 100; i++)에 문에 대한 변경 및 배열 내가이 코드 do..try하려고하는지 알 것 같아요 또한 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]); 

} 
}