如何制作相机?

qv7cva1a  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(258)

如何在LWJGL3DJava应用程序中制作相机?我试着用 glRotate 以及 glTranslatef ,但这只移动对象,我需要移动场景。
和我试着用的一样

glLoadMatrixf(new float[]{
                50, 50, 50, 50,
                50, 50, 50, 50,
                -75, 50, 50, 50,
                100, 100, 100, 100
});

但我不太明白它是怎么工作的,我看到了白色的屏幕
我可以用什么方法来完成我的任务?

x759pob2

x759pob21#

如果要创建第一个视图矩阵,请从 gluLookAt .
使用这个方便的传统opengl实用程序函数,您可以通过位置定义视图矩阵( eye ),目标点( target )和一个上向量( up ):
(另请参见org.lwjgl.util.glu.glu.glulookat()的java代码示例)

GLU.gluLookAt(eye.x, eye.y, eye.z, target.x, target.y, target.z, up.x, up.y, up.z);

视图空间是由场景上的视点定义的局部系统。视图的位置、视线和视图的向上方向定义了相对于世界坐标系的坐标系。场景的对象必须相对于视图坐标系绘制,以便从观察位置“看到”。视图坐标系的逆矩阵称为视图矩阵。此矩阵从世界坐标转换为视图坐标。
此外,您还需要一个正交或透视投影矩阵。
前一个矩阵可以定义为 glOrtho (另请参见org.lwjgl.opengl.gl11.glortho()的java代码示例)

GL11.glOrtho(0, width, height, 0, 1, -1);

最后一个是 gluPerspective (另请参见org.lwjgl.util.glu.glu.glupperspective()的java代码示例)

GLU.gluPerspective(45.0f, wRatio, (float) near, (float) far);

投影矩阵描述了从场景的三维点到视口的二维点的Map。投影矩阵从视图空间变换到剪辑空间。剪辑空间中的坐标通过除以 w 剪辑坐标的分量。
在传统的opengl中存在不同的当前矩阵。投影矩阵应设置为当前值 GL_PROJECTION 矩阵和视图矩阵 GL_MODELVIEW 矩阵。看到了吗 glMatrixMode .
例如。:

float width     = ...; // width of the window
float height    = ...; // height of the window
Vector3f eye    = ...; // camera position
Vector3f target = ...; // camera target
Vector3f up     = ...; // camera up vector

float ratio = 1.0f * width / height;

GL11.glViewport(0, 0, (int) w, (int) h);

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, ratio , 0.1f, 100.0f);

GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GLU.gluLookAt(eye.x, eye.y, eye.z, target.x, target.y, target.z, up.x, up.y, up.z);

而不是 GLU.gluPerspective ,透视投影矩阵可设置如下:

float width  = ...;    // width of the window
float height = ...;    // height of the window
float fov_y  = 45.0f;  // filed of view in degrees (y axis)
float n      = 0.1f;   // near plane
float f      = 100.0f; // far plane

float a  = width / height;
float ta = Math.tan(Math.radians(fov_y) / 2.0f);

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
glLoadMatrixf(new float[]{
    1.0f/(ta*a), 0.0f,     0.0f,            0.0f,
    0.0f,        1.0f/ta,  0.0f,            0.0f,
    0.0f,        0.0f,    -(f+n)/(f-n),    -1.0f,  
    0.0f,        0.0f,    -2.0f*f*n/(f-n),  0.0f
});

而不是使用 GLU.gluLookAt 视图矩阵可以通过 glTranslate 以及 glRoatate :

float distance = 10.0f; // distance to object
float pitch    = 0.0f;  // pitch in degrees
float yaw      = 0.0f;  // yaw in degrees

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f); 
GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
GL11.glTranslatef(0.0f, 0.0f, -distance);
vsaztqbk

vsaztqbk2#

在opengl中没有摄像头。要“移动相机”,你必须把物体移到相反的方向。例如,不向前移动摄影机,而是向后移动对象。

相关问题