美文网首页
OpenGL中的不同角度的移动

OpenGL中的不同角度的移动

作者: 卡布奇诺_95d2 | 来源:发表于2020-08-15 15:38 被阅读0次

    在OpenGL中观察一个物体的移动,一般可以通过两种方式:

    • 观察者不动,移动物体
    • 物体不动,移动观察者

    观察者不动,物体移动

    image.png
    1. 设置观察者的位置
    //表示离屏幕之间的距离,负数:往屏幕后面移动;正数:往屏幕前面移动
    cameraFrame.MoveForward(-10.0f);
    
    1. 将移动绕X轴旋转
    viewFrame.RotateWorld(m3dDegToRad(-15), 1, 0, 0);
    

    此时可以看到,观察者矩阵和物体矩阵都发生了变换。因此,若要获得最后所需的ModelView矩阵,则需要依次对观察者矩阵、物体矩阵按顺序进行矩阵相乘。
    注意,由于矩阵的特性是不满足交换律的,因此对矩阵相乘的时候一定得严格按照先与观察者矩阵相乘,再与物体矩阵相乘的顺序。
    矩阵相乘的代码如下:

    //将视图矩阵堆栈压入一个单元矩阵,便于后继做相乘操作
    modelViewMatix.PushMatrix();
    
    //获取观察者矩阵,并将视图矩阵堆栈中的栈顶矩阵(此处为前面压入的单元矩阵)与观察者矩阵进行相乘得到新的观察者矩阵,将新的观察者矩阵压入视图矩阵堆栈中
    M3DMatrix44f mCammer;
    cameraFrame.GetCameraMatrix(mCammer);
    modelViewMatix.MultMatrix(mCammer);
    
    //获取物体矩阵,并将视图堆栈矩阵中的栈顶矩阵(此处为前面步骤得到的新视图矩阵)与物体矩阵相乘
    M3DMatrix44f mObject;
    viewFrame.GetMatrix(mObject);
    modelViewMatix.MultMatrix(mObject);
    

    通过以上代码就可以达到观察者固定位置后不再移动,而物体移动的效果。

    物体不动,观察者移动

    image.png
    1. 设置观察者的位置
    cameraFrame.MoveForward(10.0f);
    
    1. 移动观察者
    cameraFrame.RotateWorld(m3dDegToRad(-15), 1, 0, 0);
    

    此时可以看到,整个移动过程只有观察者在动而物体是不动的。因此,若要获得最后所需要的ModelView矩阵,只需要在对模型视图矩阵堆栈压栈时候,将观察者矩阵压入即可。

    modelViewMatix.PushMatrix(cameraFrame);
    

    观察者矩阵中包含了观察者所有的变换,包括位置的移动,观察者的旋转等,矩阵的相乘操作会在变换管道中进行,最后通过变换管理获得最终所需的MVP矩阵。

    总结

    观察者动物体不动和观察不动物体动最后实现的效果是一样的,至于如何选择可根据实际项目的需要。
    观察者不动物体动的时候要注意矩阵相乘的顺序,严格按照先乘观察者矩阵,再乘物体矩阵的顺序

    相关文章

      网友评论

          本文标题:OpenGL中的不同角度的移动

          本文链接:https://www.haomeiwen.com/subject/yjdadktx.html