2011-12-12 2 views
0

현재 미니 프로젝트에서 작업 중입니다. 오브젝트에 회전 속도를 추가하여 회전 할 수 있습니다. 다음을 시도했지만 이해하지 못했습니다. 당신은 축 정렬 회전의 집합으로 방향 벡터를 사용하는Open GL 오브젝트에 회전 속도 추가하기

ObjetDeJeu::ObjetDeJeu(glm::vec3 pPosition) 
    : mPosition(pPosition), mOrientation(0,0,0), mSpeed() 
{ 

} 
//----------------------------------------------------------------------// 
ObjetDeJeu::~ObjetDeJeu() 
{ 

} 
//----------------------------------------------------------------------// 
void ObjetDeJeu::setVitesse(glm::vec2 pVitesse) 
{ 
    mVitesse = pVitesse; 
} 
//----------------------------------------------------------------------// 
void ObjetDeJeu::addSpeed(glm::vec2 pSpeedToAdd) 
{ 
    mVitesse += pVitesseToAdd; 
} 
//----------------------------------------------------------------------// 
glm::vec3 ObjetDeJeu::getPosition_ParentSpace() 
{ 
    return mPosition; 
} 
//----------------------------------------------------------------------// 
glm::vec3 ObjetDeJeu::getOrientation_ParentSpace() 
{ 
    return mOrientation; 
} 
//----------------------------------------------------------------------// 
void ObjetDeJeu::setPosition_ParentSpace(glm::vec3 pPosition) 
{ 
    mPosition = pPosition; 
} 
//----------------------------------------------------------------------// 
void ObjetDeJeu::setOrientation_ParentSpace(glm::vec3 pOrientation) 
{ 
    mOrientation = pOrientation; 
} 
//----------------------------------------------------------------------// 
void ObjetDeJeu::rotateZ(float angleDegree) 
{ 
    mOrientation.z += angleDegree; 
    if(mOrientation.z >= 180.0f) 
    { 
     mOrientation.z -= 360.0f; 
    } 
    if(mOrientation.z < -180.0f) 
    { 
     mOrientation.z += 360.0f; 
    } 
} 
//----------------------------------------------------------------------// 
glm::mat4x4 ObjetDeJeu::getTransform_ParentSpace() 
{ 
    glm::mat4x4 lTransfo; 
    lTransfo = glm::translate(lTransfo , mPosition); 
    lTransfo = glm::rotate(lTransfo, mOrientation.z, glm::vec3(0,0,1)); 
    lTransfo = glm::rotate(lTransfo, mOrientation.y, glm::vec3(0,1,0)); 
    lTransfo = glm::rotate(lTransfo, mOrientation.x, glm::vec3(1,0,0)); 
    return lTransfo; 
} 
//----------------------------------------------------------------------// 
bool ObjetDeJeu::touche(ObjetDeJeu* obj) 
{ 
} 
//----------------------------------------------------------------------// 
void ObjetDeJeu::deplace(float dt) 
{ 
    // vitesse * temps ecoule == deplacement. 
    glm::vec3 deplacement = glm::vec3(mSpeed*dt, 0); 

    mPosition += deplacement; 

} 
//----------------------------------------------------------------------// 
void ObjetDeJeu::dessiner() 
{ 
    glBegin(GL_TRIANGLES); 
     glTexCoord2f(0.0,0.0); 
     glVertex3f(-1.0f,-1.0f, 0.0f);     

     glTexCoord2f(1.0,0.0); 
     glVertex3f(1.0f,-1.0f, 0.0f); 

     glTexCoord2f(0.5,1.0); 
     glVertex3f(0.0f, 3.0f, 0.0f); 

    glEnd(); 
} 

답변

0

:

여기에 작업 코드 임입니다. 이것은 아마도 당신이 원하는 것이 아닙니다.

당신은 변환 단일로 적용 시스템 매트릭스를 로컬 좌표로 회전을 관리 할 수 ​​있습니다

M = [a d g 0] 
    [b e h 0] 
    [c f i 0] 
    [0 0 0 1] 

어디 벡터 [ABC], [고화질] 및 [GHI] x 좌표를 나타내고, Y-을 및 회전 된 로컬 좌표계의 z 축을 포함한다. 회전을 적용하려면 먼저 지정된 축 (또는 쿼터니언)을 중심으로 각도를 표시해야하지만 먼저 회전하지 마세요. 이 회전에 대한 변환 행렬을 계산하여 M의 각 축 벡터에 적용합니다. 그런 다음 렌더링 시간에 객체를 렌더링하기 전에 맨 오른쪽 변형으로 M을 적용합니다.