我如何在lwjgl 3D Java应用程序中制作相机?
我尝试使用glRotate
和glTranslatef
,但这仅移动对象,并且我需要移动场景。
我尝试使用
glLoadMatrixf(new float[]{
50, 50, 50, 50,
50, 50, 50, 50,
-75, 50, 50, 50,
100, 100, 100, 100
});
但是我不太了解它是如何工作的,并且我看到了白屏
我可以为我的任务使用什么装饰?
答案 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);
视图空间是本地系统,由场景上的视点定义。 视图的位置,视线和视图的向上方向定义了相对于世界坐标系的坐标系。场景的对象必须相对于视图坐标系绘制,以便从查看位置“看到”。视图坐标系的逆矩阵称为视图矩阵。该矩阵从世界坐标转换为视图坐标。
此外,您还需要一个Orthographic或Perspective投影矩阵。
前一个矩阵可以由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.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);