我正试图用Java/LWJGL制作一个游戏/演示,但第一人称摄像头有问题:
我使用WASD来移动眼
向量,无论发生什么奇怪的事情:
我已经成功实现了鼠标移动(环顾四周),现在相关代码片段:
(注意:Matrix4f类以列主顺序工作)
Matrix4f viewMatrix = new Matrix4f();
private void checkKeys() {
if (isKeyCurrentlyDown(Keyboard.KEY_W)) {
eye.updateTranslate(1.0f, 0.0f, 0.0f);
updateView();
}
else if (isKeyCurrentlyDown(Keyboard.KEY_S)) {
eye.updateTranslate(-1.0f, 0.0f, 0.0f);
updateView();
}
else if (isKeyCurrentlyDown(Keyboard.KEY_A)) {
eye.updateTranslate(0.0f, -1.0f, 0.0f);
updateView();
}
else if (isKeyCurrentlyDown(Keyboard.KEY_D)) {
eye.updateTranslate(0.0f, 1.0f, 0.0f);
updateView();
}
}
private void updateView() {
System.out.println("eye = " + eye);
viewMatrix.identity().viewFPS(eye, roll, yaw, pitch);
System.out.println("viewMatrix = " + viewMatrix);
Uniforms.setUniformMatrix4(UNIFORM_VIEW_MATRIX, false, viewMatrix);
}
@Override
protected void render(final double msDelta) {
super.render(msDelta);
glClearColor(0.0f, 0.25f, 0.0f, 1.0f);
glClearDepthf(1f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
program.use();
for (int i = 0; i < 24; i++) {
float fVar = i + currentTime / 1000f * 0.3f;
modelviewMatrix.identity()
.translate(0.0f, 0.0f, -8.0f)
.rotate(currentTime / 1000f * 45.0f, 0.0f, 1.0f, 0.0f)
.rotate(currentTime / 1000f * 21.0f, 1.0f, 0.0f, 0.0f)
.translate(
(float)Math.sin(2.1f * fVar) * 2.0f,
(float)Math.cos(1.7f * fVar) * 2.0f,
(float)Math.sin(1.3f * fVar) * (float)Math.cos(1.5f * fVar) * 2.0f
);
Uniforms.setUniformMatrix4(UNIFORM_MODEL_MATRIX, false, modelviewMatrix.writeToFloatBuffer(modelViewMatrixBuffer));
program.drawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
}
}
#version 440 core
layout(location = 0) in vec4 position;
out VS_OUT {
vec4 color;
} vs_out;
layout(location = 0) uniform mat4 model_matrix;
layout(location = 1) uniform mat4 view_matrix;
layout(location = 2) uniform mat4 proj_matrix;
void main() {
gl_Position = proj_matrix * view_matrix * model_matrix * position;
vs_out.color = position * 2.0 + vec4(0.5, 0.5, 0.5, 0.0);
}
public enum UniformLocation {
UNIFORM_MODEL_MATRIX(0),
UNIFORM_VIEW_MATRIX(1),
UNIFORM_PROJECTION_MATRIX(2)
;
private final int location;
private UniformLocation(final int location) {
this.location = location;
}
public int getLocation() {
return this.location;
}
}
//Column-major order
public Matrix4f viewFPS(final Vector3f eye, final float rollAngle, final float yawAngle, final float pitchAngle) {
//roll = rolling your head, Q&E
//yaw = looking left/right, mouseY
//pitch = looking up/down, mouseX
float sinRoll = (float)Math.sin(Math.toRadians(rollAngle));
float cosRoll = (float)Math.cos(Math.toRadians(rollAngle));
float sinYaw = (float)Math.sin(Math.toRadians(yawAngle));
float cosYaw = (float)Math.cos(Math.toRadians(yawAngle));
float sinPitch = (float)Math.sin(Math.toRadians(pitchAngle));
float cosPitch = (float)Math.cos(Math.toRadians(pitchAngle));
Vector3f xAxis = new Vector3f(
cosYaw * cosPitch,
sinYaw * cosPitch,
-sinPitch
);
Vector3f yAxis = new Vector3f(
cosYaw * sinPitch * sinRoll - sinYaw * cosRoll,
sinYaw * sinPitch * sinRoll + cosYaw * cosRoll,
cosPitch * sinRoll
);
Vector3f zAxis = new Vector3f(
cosYaw * sinPitch * cosRoll + sinYaw * sinRoll,
sinYaw * sinPitch * cosRoll - cosYaw * sinRoll,
cosPitch * cosRoll
);
return multiply(
xAxis.getX(), xAxis.getY(), xAxis.getZ(), -xAxis.dot(eye), //X column
yAxis.getX(), yAxis.getY(), yAxis.getZ(), -yAxis.dot(eye), //Y column
zAxis.getX(), zAxis.getY(), zAxis.getZ(), -zAxis.dot(eye), //Z column
0.0f, 0.0f, 0.0f, 1.0f //W column
);
}
我真的不知道为什么相机的行为如此奇怪,这意味着什么?
照片的一部分怎么会突然变得不可见了?
更新:这可能与viewFPS()
方法有关,因为翻译看起来有点奇怪,有人能确认吗?
注意,在viewFPS
中,旋转和平移组合在一个矩阵乘法中。
我不熟悉你构建矩阵的方式,但我可以告诉你什么对我有用。
这可能比你正在使用的方法效率低,但是让它工作然后从那里优化是很好的吗?拆分旋转轴还可以一次调试一个轴。
我使用的旋转矩阵:
其中,(phi)和(psi)是围绕X、Y和Z轴的旋转。(http://www.fastgraph.com/makegames/3drotation/)
我正在使用GLM库实现一个第一人称相机,它为我提供了一些有用的函数,可以计算透视和“注视”矩阵。我也在使用OpenGL,但这不会对代码产生影响。 在这张图片中,你可以看到四个摄像头的位置。标有1的是在运动之前,标有2的是在运动之后。红色三角形表示沿z轴笔直向前的相机。蓝色三角形代表一个相机,该相机已沿x轴(向左)旋转向后看。当我按下“向前移动键”时,相机在两种情况下都会沿z轴向前移动,而不考虑相机
我目前有一个游戏,有一个地图是480x3200,一个人从顶部掉下来。镜头跟在人的后面,随着人的下落有平台。平台需要是可触摸的,所以我可以在游戏中旋转和移动它们,所以我把它变成了一个图像,而它原本只是一个精灵。 编辑:
本文向大家介绍Unity3D实现控制摄像机移动,包括了Unity3D实现控制摄像机移动的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Unity3D实现控制摄像机移动的具体代码,供大家参考,具体内容如下 最近公司的几个项目开发内容基本相同,很多脚本直接复制过来就可以拼接项目。之前一直是代码爱好者,能自己敲的绝对不去复制粘贴。但是开发速度确实是被耽误了,所以接下来打算把开发中常用的脚本
我正在使用LWJGL和OpenGL 3.2为OpenGL编写java游戏引擎。每当移动鼠标旋转相机时,它都会添加滚动、俯仰和偏航。 摄像头代码 四元数代码
本文向大家介绍使用OpenCV在Python中进行人脸和眼睛检测,包括了使用OpenCV在Python中进行人脸和眼睛检测的使用技巧和注意事项,需要的朋友参考一下 使用的模块: python-opencv(cv2) Opencv(Open source computer vision) 是一个python库,可帮助我们解决计算机视觉问题。 下载python-opencv(cv2) 通用方式:pip
为什么我得到一个空的输出?当我删除xml中的xmlns部分时,输出是预期的,但是intellisense不再工作了。 仓库xml 仓库xsl