如何制作相机?

时间:2020-01-24 10:12:47

标签: java opengl lwjgl opengl-compat

我如何在lwjgl 3D Java应用程序中制作相机? 我尝试使用glRotateglTranslatef,但这仅移动对象,并且我需要移动场景。

我尝试使用

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

但是我不太了解它是如何工作的,并且我看到了白屏

我可以为我的任务使用什么装饰?

2 个答案:

答案 0 :(得分:1)

在OpenGL中没有相机。要“移动相机”,您必须相反地移动对象。例如,您可以将对象向后移动,而不是向前移动相机。

答案 1 :(得分:1)

如果要创建第一个视图矩阵,请从gluLookAt开始。
使用此方便的Legacy OpenGL实用程序功能,您可以通过位置(eye),目标点(target)和上矢量(up)定义视图矩阵:
(另请参见Java Code Examples for org.lwjgl.util.glu.GLU.gluLookAt()

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

视图空间是本地系统,由场景上的视点定义。 视图的位置,视线和视图的向上方向定义了相对于世界坐标系的坐标系。场景的对象必须相对于视图坐标系绘制,以便从查看位置“看到”。视图坐标系的逆矩阵称为视图矩阵。该矩阵从世界坐标转换为视图坐标。

此外,您还需要一个OrthographicPerspective投影矩阵。
前一个矩阵可以由glOrtho
定义 (另请参见Java Code Examples for org.lwjgl.opengl.GL11.glOrtho()

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

,随后是gluPerspective
(另请参见Java Code Examples for org.lwjgl.util.glu.GLU.gluPerspective()

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

投影矩阵描述从场景的3D点到视口的2D点的映射。投影矩阵从视图空间转换为剪辑空间。通过除以剪辑的w分量,将剪辑空间中的坐标转换为范围(-1,-1,-1)至(1、1、1)的归一化设备坐标(NDC)坐标。

在旧版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.gluLookAtglTranslate来设置视图矩阵,而不是使用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);