OpenGL:创建我自己的相机

2023-12-31

我正在尝试创建一个在 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 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 一起使用,但有闪烁问题)。


使用 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)

Cheers.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL:创建我自己的相机 的相关文章

随机推荐