我正在尝试创建一个相机,以在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)

干杯。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top