我已经在Java中使用位置矢量和三个方向矢量实现了一个摄像头,因此我可以使用gluLookAt();在“重影模式”中四处移动,但效果很好,但是我想添加碰撞检测功能。我似乎无法弄清楚如何将位置矢量转换为OpenGL在其中绘制对象的坐标。

我的绘图循环的大致草图是:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
camera.setView();
drawer.drawTheScene();


我对如何进行一无所知。查看调用和位置矢量之间的ModelView矩阵,我还没有发现任何相关性。

最佳答案

最终通过再次查看http://fly.cc.fer.hr/~unreal/theredbook/chapter03.html来弄清楚。要从眼睛空间(相机)到对象空间,您必须将该向量与ModelView矩阵的逆矩阵相乘,或者在代码中:

Vector4f vpos = new Vector4f(0, 0, 0, 1);
// (0,0,0,1) because it's relative to the cam
float mv[]=new float[16];
ByteBuffer temp = ByteBuffer.allocateDirect(64);
temp.order(ByteOrder.nativeOrder());
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, (FloatBuffer)temp.asFloatBuffer());
temp.asFloatBuffer().get(mv);
Matrix4f m4 = new Matrix4f();
m4.load((FloatBuffer)temp.asFloatBuffer());
m4.invert();
vpos = Matrix4f.transform(m4, vpos, vpos);

07-27 13:23
查看更多