我正在尝试创建一个可以在3d空间中移动的摄像头,并且在设置它时遇到了一些问题。我这样做是Java,显然使用gluPerspective和gluLookAt会产生冲突(屏幕开始像疯了一样闪烁)。
gluPerspective设置如下:
gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(50.0f, h, 1.0, 1000.0);
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
然后我创建了一个相机矩阵,利用眼睛坐标,前向和向上矢量(http://people.freedesktop.org/~idr/glu3/form_4.png)(假设相机的代码是正确的。
最后,在我画任何东西之前:
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glMultMatrixf(camera.matrix);
然后我调用我的绘图例程(通过调用glRotatef和glTranslatef自己进行一些平移/旋转)。
如果没有调用glMultMatrixf,相机会显示我需要在屏幕中央看到的项目。然而,使用glMulMatrixf,我得到的只是一个黑屏。我尝试使用glLoadMatrixf而它也没用。难道我做错了什么?我把东西放在一边吗?如果没有,这就是它应该如何完成让我知道,我会发布一些可能造成冲突的相机代码。
编辑:这是相机矩阵创建代码:
private void createMatrix()
{
float[] f = new float[3]; //forward (centre-eye)
float[] s = new float[3]; //side (f x up)
float[] u = new float[3]; //'new up' (s x f)
for(int i=0;i<3;i++){
f[i] = centre[i]-eye[i];
}
f = Maths.normalize(f);
s = Maths.crossProduct(f,upVec);
u = Maths.crossProduct(s,f);
float[][] mtx = new float[4][4];
float[][] mtx2 = new float[4][4];
//initializing matrices to all 0s
for (int i = 0; i < mtx.length; i++) {
for (int j = 0; j < mtx[0].length; j++) {
mtx[i][j] = 0;
mtx2[i][j] = 0;
}
}
//mtx = [ [s] 0,[u] 0,[-f] 0, 0 0 0 1]
//mtx2 = [1 0 0 -eye(x), 0 1 0 -eye(y), 0 0 1 -eye(z), 0 0 0 1]
for(int i=0;i<3;i++){
mtx[0][i] = s[i];
mtx[1][i] = u[i];
mtx[2][i] = -f[i];
mtx2[i][3]=-eye[i];
mtx2[i][3]=-eye[i];
mtx2[i][3]=-eye[i];
}
mtx[3][3] = 1;
mtx2[0][0]=1;mtx2[1][1] = 1;mtx2[2][2] = 1;mtx2[3][3] = 1;
mtx = Maths.matrixMultiply(mtx,mtx2);
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
// this.mtx is a float[16] for glMultMatrixf
this.mtx[i*4+j] = mtx[i][j];
}
}
}
我正在跳这个错误是在这段代码的某个地方,如果没有,我会看看我的数学函数,看看有什么事情发生..
EDIT2:虽然我应该提到至少初始向量(眼睛,中心,向上)是正确的并且确实把相机放在应该的位置(使用gluLookAt但是有闪烁的问题)。
答案 0 :(得分:5)
使用glRotatef,glTranslatef和glFrustum创建相机可能更简单,虽然你的数学对我来说似乎很好(只要实际定义了UpVec)。在我所做的大部分3D图形中,你并没有真正想要跟踪的已定义对象。在我最终确定之前,我使用gluLookAt进行了各种3D相机的实现。
以下是我倾向于定义相机的方法:
当我创建或初始化我的相机时,我使用glFrustum设置投影矩阵。如果您愿意,可以使用glPerspecive:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(left, right, down, up, near, far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
清除渲染过程的颜色和深度缓冲区后,我调用
glLoadIdentity();
glRotated(orientation.x, 1.0, 0.0, 0.0);
glRotated(orientation.y, 0.0, 1.0, 0.0);
glRotated(orientation.z, 0.0, 0.0, 1.0);
glTranslatef(position.x, position.y, position.z);
定位和定位相机。最初,您将位置和方向设置为{0},然后在按下某个键时添加或减去位置,并在移动鼠标时添加或减去orientation.x和orientation.y(我通常不会'混乱方向.z)
干杯。
答案 1 :(得分:1)
修正了它的种类。问题是使用glMultMatrix(float []矩阵,int?ofset?)...出于某种原因,如果我只使用glMultMatrix(FloatBuffer矩阵)它工作正常..
我正在制作的转换存在一些问题,但我应该能够解决这些问题......感谢您提供的意见。