求教:我想对模型进行旋转,旋转的中心是可以看到的部分的中心位置,这个位置我求对了,
可是旋转时有时不是围绕这个中心进行,请大家看看我写的代码有问题吗?
投影是正交投影:
glOrtho OrthoLeft, OrthoRight, OrthoBottom, OrthoTop, OrthoNear, OrthoFar 
旋转代码:opermatrix是当前使用的矩阵,旋转前得到了旋转中心
Public Sub RotSceneOrtho(startp As POINTFLOAT, endp As POINTFLOAT)
    If startp.X = endp.X And startp.Y = endp.Y Then Exit Sub
    Dim vp(3) As Double
    glGetDoublev glgViewport, vp(0)
    startp.Y = vp(3) - startp.Y
    endp.Y = vp(3) - endp.Y
    Dim xaxis As New pVector, yaxis As New pVector, zaxis As New pVector
    xaxis.SetVector OperMatrix(0), OperMatrix(4), OperMatrix(8)
    yaxis.SetVector OperMatrix(1), OperMatrix(5), OperMatrix(9)
    zaxis.SetVector OperMatrix(2), OperMatrix(6), OperMatrix(10)
    xaxis.Unit
    yaxis.Unit
    zaxis.Unit
    '旋转场景
    glMatrixMode mmModelView
    glTranslated RotCenter.X, RotCenter.Y, RotCenter.z
    glRotatef 0.3 * (endp.X - startp.X), yaxis.X, yaxis.Y, yaxis.z
    glRotatef -0.3 * (endp.Y - startp.Y), xaxis.X, xaxis.Y, xaxis.z
    glTranslated -RotCenter.X, -RotCenter.Y, -RotCenter.z
    glGetDoublev glgModelViewMatrix, OperMatrix(0)
End Sub
渲染时加载opermatrix

解决方案 »

  1.   

    来个意见或代码吧弟兄们,help
      

  2.   

    楼主这是Vb的代码吧,怎么来Mfc版块里问呀。
    大概看了一下,应该是旋转前后没有保存和恢复状态,你需要Pushmatrix然后在旋转后再Popmatrix,不然位移和旋转后会改变当前矩阵,造成矩阵中心的改变。vb好久没用了,不知道对应的函数是不是也是这两个
      

  3.   

    VB代码看不太明白。。对于模型的变化,可以从模型本身的局部坐标系或是世界坐标系进行考虑,一般以局部坐标系考虑更为直观;以世界坐标系进行考虑,写代码的过程与思考过程正好相反。所以一般旋转,都是先进行平移,再进行旋转操作。在每次代码开始渲染前增加:
    glPushMatrix();渲染结束增加:
    glPopMatrix();保证上一次渲染操作不影响当前渲染的模型视图矩阵。
      

  4.   

    我的渲染代码
     glClear clrColorBufferBit Or clrDepthBufferBit
        glMatrixMode mmModelView
        glLoadMatrixd OperMatrix(0)
        dt3.Render3Dt
        SwapBuffers ghDC
    非常感谢大家的回答,我这样加载矩阵,应该不会受上次渲染的影响吧,我试着加上glPushMatrix(); glPopMatrix(); 效果也一样呀