题
我正在尝试创建一个相机,以在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,但闪烁了问题)。
解决方案 2
修复了它。问题是使用glmultmatrix(float []矩阵,int?ofset?)...出于某种原因,如果我只使用glmultmatrix(floatBuffer矩阵),它的工作正常。
我要进行的转换存在一些问题,但我应该能够处理这些问题……谢谢您的意见。
其他提示
使用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},然后在按下键时从位置添加或减去位置,然后从entirentation.x和entirentation.y添加或减去鼠标。 t与方向混乱。z)
干杯。