Open GL 在对象上添加旋转速度

Posted

技术标签:

【中文标题】Open GL 在对象上添加旋转速度【英文标题】:Open GL Adding rotation speed on objects 【发布时间】:2011-12-12 21:22:04 【问题描述】:

我目前正在做一个迷你项目,试图在我的对象上添加一些旋转速度,以便它们可以自己旋转。 我尝试了以下但没有得到它。

这是我正在处理的代码 sn-p:

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

【问题讨论】:

【参考方案1】:

您将方向向量用作一组轴对齐的旋转。这可能不是你想要的。

您可以将旋转作为局部坐标系矩阵进行管理,并将其作为单个变换应用:

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

其中向量 [a b c]、[d e f] 和 [g h i] 表示旋转局部坐标系的 x、y 和 z 轴。当您想应用旋转时,首先,它应该表示为围绕指定轴的角度(或四元数,但我们不要超越自己)。您计算此旋转的变换矩阵,并将其应用于 M 中的每个轴向量。然后,在渲染时,在渲染对象之前应用 M 作为最右边的变换。

【讨论】:

以上是关于Open GL 在对象上添加旋转速度的主要内容,如果未能解决你的问题,请参考以下文章

使用 GLM 正确旋转 Open GL 相机

旋转速度为提升速度的一倍是啥意思

open gl 到底是个啥东西啊

在 OpenGL 中保持旋转

在OpenGL中为3D对象添加光源

Unity3D Slerp 旋转速度