我试图创建一个第一人称相机。我从我的XNA项目中提取了一段代码,并试图将其转换为java(LWJGL)。
Matrix4f mx = Matrix4f.rotate(pitch, new Vector3f(1, 0, 0),
new Matrix4f(), null);
Matrix4f my = Matrix4f.rotate(yaw, new Vector3f(0, 1, 0),
new Matrix4f(), null);
Matrix4f rotationMatrix = Matrix4f.mul(mx, my, null);
Vector4f tmp = Matrix4f.transform(rotationMatrix, new Vector4f(0, 0,
-1, 0), null);
target = new Vector3f(position.x + tmp.x, position.y + tmp.y,
position.z + tmp.z);
GLU.gluLookAt(this.position.x, this.position.y, this.position.z,
this.target.x, this.target.y, this.target.z, 0, 1.0f, 0);
如果我移动鼠标,俯仰和偏航会增加/减少。在开始运行我的游戏时,它运行良好,但在一些动作后,我无法向下或向上看。如果我的位置是
性能良好的XNA代码:
Matrix rotationMatrix = Matrix.CreateRotationX(pitch) * Matrix.CreateRotationY(yaw);
camera.Target = Vector3.Transform(Vector3.Forward, rotationMatrix) + camera.Position;
this.viewMatrix = Matrix.CreateLookAt(this.position, this.target, Vector3.Up);
所以我发现LWJGL和XNA在旋转矩阵方面有一些不同。
Java:
Matrix4f mx = Matrix4f.rotate(1.2345f, new Vector3f(1,0,0),new Matrix4f(),null);
结果:
{1.0 0.0 0.0 0 0.0}{0.0 0.3299931-0.9439833 0.0}{0.0 0 0.9439833 0.3299931 0.0}{0.0 0 0.0 0 0.0 1.0}
XNA公司
Matrix.CreateRotationX(1.2345f)
结果:
{1,0,0,0}{0,0.3299931,0.9439833,0}{0,-0.9439833,0.3299931,0}{0,0,0,1}
区别是-0.9439833和0.9439833...有人能解释一下为什么会有不同的结果吗?不是同一个函数吗?
非常感谢。
哦,我明白了。好吧,那就不同了。最后我解决了我的问题。问题是LWJGL中的“转换”方法。这是我最后的工作代码。也许我可以优化它?
public static Matrix4f createRotationX(float pitch) {
Matrix4f mX = new Matrix4f();
mX.m00 = 1;
mX.m10 = 0;
mX.m20 = 0;
mX.m30 = 0;
mX.m01 = 0;
mX.m11 = (float) Math.cos(pitch);
mX.m21 = (float) Math.sin(pitch);
mX.m02 = 0;
mX.m03 = 0;
mX.m12 = (float) -Math.sin(pitch);
mX.m22 = (float) Math.cos(pitch);
mX.m23 = 0;
mX.m03 = 0;
mX.m13 = 0;
mX.m23 = 0;
mX.m33 = 1;
return mX;
}
public static Matrix4f createRotationY(float yaw) {
Matrix4f mY = new Matrix4f();
mY.m00 = (float) Math.cos(yaw);
mY.m10 = 0;
mY.m20 = (float) -Math.sin(yaw);
mY.m30 = 0;
mY.m01 = 0;
mY.m11 = 1;
mY.m21 = 0;
mY.m31 = 0;
mY.m02 = (float) Math.sin(yaw);
mY.m12 = 0;
mY.m22 = (float) Math.cos(yaw);
mY.m23 = 0;
mY.m03 = 0;
mY.m13 = 0;
mY.m23 = 0;
mY.m33 = 1;
return mY;
}
public static Vector3f getNewTarget(Vector3f position,float pitch, float yaw){
Matrix4f mx = MathUtil.createRotationX(pitch);
Matrix4f my = MathUtil.createRotationY(yaw);
Matrix4f rotationMatrix = Matrix4f.mul(mx, my, null);
Matrix4f def = new Matrix4f();
def.m20 = -1;
def.m00 = 0;
def.m11 = 0;
def.m22 = 0;
def.m33 = 0;
Matrix4f v4 = Matrix4f.mul(def,rotationMatrix,null);
return new Vector3f(v4.m00+position.x, v4.m10+position.y, v4.m20+position.z);
}
虽然我熟悉OpenGl(LWJGL),但我目前正在进行一个小型fps项目的测试。我这里的问题是相机的旋转不是很平稳。它从一个像素跳到另一个像素,这实际上非常明显。我怎样才能把它弄平滑呢?[链接到片段:]https://www.youtube.com/watch?v=6Hgt1hXCKKA 代码摘要:我将当前鼠标位置存储在Vector2f中; 我通过相机的相对运动增加偏航和俯仰(新位置-旧位置);
我正在使用GLFW在c中创建一个OpenGL应用程序。基于本教程,我成功地创建了类似FPS的摄影机(WASD移动-鼠标移动-俯仰-偏航)。 我使用的相机鼠标移动 这很好,但问题是我的应用程序窗口不是全屏的,所以如果我想旋转鼠标光标,它就会离开窗口,很难控制相机。 是否可以做与glfwSetCursorPosCallback相同的事情,但仅当按下左键时?我希望相机做与现在相同的事情,但仅当我按下左键
我有一个相机旋转矩阵3x3,然后我用罗德里格斯函数从旋转矩阵中得到旋转矢量,但是它给出的结果像,但是OpenGL函数需要度数。我认为是归一化的,我应该把每个元素乘以360来得到度数。但是OpenCV和OpenGL之间也有坐标系的差异。我如何在OpenGL坐标系中获得度数的旋转矢量?
我刚刚开始学习LWJGL / OpenGL来创建3D游戏,所以我从小处着手,尝试制作一条线(2D)的简单显示。窗口加载正常,大小合适,但显示器上没有绘制任何内容。有一个空白屏幕,我似乎对代码所做的任何更改都不会影响在屏幕上绘制的内容。这可能是因为我对如何正确执行此操作缺乏了解,或者这可能是我的代码/计算机中的问题。我尝试在我的初始化代码中添加和删除各种东西,如glEnable(GL_TEXTURE
假设我有一个金字塔…我知道如何绘制它,我知道如何为整个金字塔设置纹理,但如何为每面墙设置不同的纹理? 我通过在 我试图通过添加<code>GL11.glBindTexture(GL11.GL_TEXTURE_2D,TEXTURE.getTextureID())来绑定纹理 后,但
下面的LWJGL代码将在屏幕中心呈现一个蓝色正方形。相反,我得到了一个空白的白色屏幕。就像渲染根本不工作,或者我在屏幕外渲染。 我是OpenGL和LWJGL的新手,所以我力不从心。我浏览了所有内容,但似乎找不到任何可能与代码有关的问题。 OpenGLTest.scala VertexArray.scala