在OpenGL中观察一个物体的移动,一般可以通过两种方式:
- 观察者不动,移动物体
- 物体不动,移动观察者
观察者不动,物体移动
image.png- 设置观察者的位置
//表示离屏幕之间的距离,负数:往屏幕后面移动;正数:往屏幕前面移动
cameraFrame.MoveForward(-10.0f);
- 将移动绕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- 设置观察者的位置
cameraFrame.MoveForward(10.0f);
- 移动观察者
cameraFrame.RotateWorld(m3dDegToRad(-15), 1, 0, 0);
此时可以看到,整个移动过程只有观察者在动而物体是不动的。因此,若要获得最后所需要的ModelView矩阵,只需要在对模型视图矩阵堆栈压栈时候,将观察者矩阵压入即可。
modelViewMatix.PushMatrix(cameraFrame);
观察者矩阵中包含了观察者所有的变换,包括位置的移动,观察者的旋转等,矩阵的相乘操作会在变换管道中进行,最后通过变换管理获得最终所需的MVP矩阵。
总结
观察者动物体不动和观察不动物体动最后实现的效果是一样的,至于如何选择可根据实际项目的需要。
观察者不动物体动的时候要注意矩阵相乘的顺序,严格按照先乘观察者矩阵,再乘物体矩阵的顺序
。
网友评论