【问题标题】:OpenGL 1.4. The scene shifts when I change the center of rotation using mouse pickingOpenGL 1.4。当我使用鼠标拾取更改旋转中心时,场景会发生变化
【发布时间】:2019-07-10 08:33:53
【问题描述】:

我使用以下代码来绘制场景,但是当旋转中心发生变化时,场景中的对象会向下移动(沿轴移动场景),请帮助了解如何避免这种影响。

glTranslated(m_rotationCenter.x, 0, 0);
glTranslated(0, m_rotationCenter.y, 0);
glTranslated(0, 0, m_rotationCenter.z);
glScalef( scale, scale, scale );
glTranslated(-m_rotationCenter.x, 0, 0);
glTranslated(0, -m_rotationCenter.y, 0);
glTranslated(0, 0, -m_rotationCenter.z);
glTranslated(m_rotationCenter.x-xTrans, 0, 0);
glTranslated(0, m_rotationCenter.y+yTrans, 0);
glTranslated(0, 0, m_rotationCenter.z+zTrans);
glRotated( xRot, 1.0, 0.0, 0.0 );
glRotated( yRot, 0.0, 1.0, 0.0 );
glRotated( zRot, 0.0, 0.0, 1.0 );
glTranslated(-m_rotationCenter.x+xTrans, 0, 0);
glTranslated(0, -m_rotationCenter.y-yTrans, 0);
glTranslated(0, 0, -m_rotationCenter.z-zTrans);
glTranslated( -xTrans, 0.0, 0.0 );
glTranslated( 0.0, yTrans, 0.0 );
glTranslated( 0.0, 0.0, zTrans);

使用鼠标拾取更改旋转中心。

例如,在原始中心

然后我通过鼠标点击改变中心

【问题讨论】:

    标签: c opengl


    【解决方案1】:

    首先,这段代码:

    glTranslated(m_rotationCenter.x, 0, 0);
    glTranslated(0, m_rotationCenter.y, 0);
    glTranslated(0, 0, m_rotationCenter.z);
    glScalef( scale, scale, scale );
    glTranslated(-m_rotationCenter.x, 0, 0);
    glTranslated(0, -m_rotationCenter.y, 0);
    glTranslated(0, 0, -m_rotationCenter.z);
    glTranslated(m_rotationCenter.x-xTrans, 0, 0);
    glTranslated(0, m_rotationCenter.y+yTrans, 0);
    glTranslated(0, 0, m_rotationCenter.z+zTrans);
    glRotated( xRot, 1.0, 0.0, 0.0 );
    glRotated( yRot, 0.0, 1.0, 0.0 );
    glRotated( zRot, 0.0, 0.0, 1.0 );
    glTranslated(-m_rotationCenter.x+xTrans, 0, 0);
    glTranslated(0, -m_rotationCenter.y-yTrans, 0);
    glTranslated(0, 0, -m_rotationCenter.z-zTrans);
    glTranslated( -xTrans, 0.0, 0.0 );
    glTranslated( 0.0, yTrans, 0.0 );
    glTranslated( 0.0, 0.0, zTrans);
    

    可以这样写,效果完全一样:

    glTranslated(m_rotationCenter.x, m_rotationCenter.y, m_rotationCenter.z);
    glScalef( scale, scale, scale );
    glTranslated(-xTrans, yTrans, zTrans);
    glRotated( xRot, 1.0, 0.0, 0.0 );
    glRotated( yRot, 0.0, 1.0, 0.0 );
    glRotated( zRot, 0.0, 0.0, 1.0 );
    glTranslated(-m_rotationCenter.x, -m_rotationCenter.y, -m_rotationCenter.z);
    

    但是如果你想围绕一个点(m_rotationCenter)进行旋转,那么你必须改变指令的顺序。

    注意,要绕轴旋转,您必须以这种方式平移对象,即旋转点位于原点 (0, 0, 0):

    glTranslated(-m_rotationCenter.x, -m_rotationCenter.y, -m_rotationCenter.z); 
    

    旋转对象:

    glRotated( xRot, 1.0, 0.0, 0.0 );
    glRotated( yRot, 0.0, 1.0, 0.0 );
    glRotated( zRot, 0.0, 0.0, 1.0 );
    

    最后将旋转的物体移回原来的位置:

    glTranslated(m_rotationCenter.x, m_rotationCenter.y, m_rotationCenter.z);
    

    当然,这些指令必须以相反的顺序执行,因为像glTranslatedglRotated 这样的操作定义了一个新矩阵并将其与当前矩阵相乘。

    最终代码必须是:

    glScalef( scale, scale, scale );
    glTranslated(-xTrans, yTrans, zTrans);
    
    glTranslated(m_rotationCenter.x, m_rotationCenter.y, m_rotationCenter.z);
    
    glRotated( xRot, 1.0, 0.0, 0.0 );
    glRotated( yRot, 0.0, 1.0, 0.0 );
    glRotated( zRot, 0.0, 0.0, 1.0 );
    
    glTranslated(-m_rotationCenter.x, -m_rotationCenter.y, -m_rotationCenter.z);
    

    进一步我建议先进行缩放(代码中的最后),这样更容易定义像m_rotationCenterxTrans这样的坐标,因为缩放不适用于此坐标。它应用于仅限型号:

    // move the model to its location
    glTranslated(-xTrans, yTrans, zTrans);
    
    // rotate the model around `m_rotationCenter`
    glTranslated(m_rotationCenter.x, m_rotationCenter.y, m_rotationCenter.z);
    glRotated( xRot, 1.0, 0.0, 0.0 );
    glRotated( yRot, 0.0, 1.0, 0.0 );
    glRotated( zRot, 0.0, 0.0, 1.0 );
    glTranslated(-m_rotationCenter.x, -m_rotationCenter.y, -m_rotationCenter.z);
    
    // scale the model
    glScalef( scale, scale, scale );
    

    【讨论】:

    • 请告诉我如何防止轮班?
    • @VictorC 查看答案的最后部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多