我有一个三维场景,有一个三角形和一个我想要移动的相机。我将相机转换存储为矩阵(特别是,加载了标识的Matrix4f对象)。
以下是修改该矩阵的两个方法示例:
这个在y轴上旋转负值:
public void turnRight() {
getCameraMatrix().rotate(-ROTATION_INTERVAL, new Vector3f(0, 1, 0));
}
这个翻译正确:
public void right() {
getCameraMatrix().translate(new Vector3f(TRANSLATION_INTERVAL, 0, 0));
}
我将投影矩阵设置为正交(以前称为glViewport()):
public void performProjection() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Display.getWidth(), 0, Display.getHeight(), 0, 1000);
}
每次相机移动时,在绘制场景之前更改相机位置:
public void performLook() {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLoadMatrix(
getAsFloatBuffer() //Gets the FloatBuffer from the matrix.
);
}
然而,这种转换的效果是三角形被平移和旋转,而不是相机。作为如何发生这种情况的一个例子,如果调用right()
,摄像机应该垂直于其当前方向向右移动,而不是向某个轴向下移动。
有关如何执行此操作的任何提示? (我们的任务出于某种原因禁止现代openGL 。)
修改
如果有用,三角形的坐标为:(1, 1, 1), (1, 50, 1), (50, 50, 1)
视口通话为glViewport(0, 0, Display.getWidth(), Display.getHeight());
最后,显示尺寸为640x480
如果我的问题有任何需要澄清的地方,请告诉我。感谢。
修改
相机矩阵是我代码中的模型视图矩阵。我通过创建一个新的Matrix4f对象并加载标识来构建它。所有后续变换都被添加到矩阵中,当调用performLook()时,矩阵的数据将被移动到模型视图矩阵。我现在只绘制一个原语,所以我还没有处理过世界变换的对象。
渲染步骤如下: performProjection() 2. performLook() 3.清除屏幕 4.绘制原语 5.交换缓冲区。