当前位置: 首页 > 知识库问答 >
问题:

LWJGL-OpenGL-相机旋转

翟淮晨
2023-03-14

我试图创建一个第一人称相机。我从我的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...有人能解释一下为什么会有不同的结果吗?不是同一个函数吗?

非常感谢。

共有1个答案

万德海
2023-03-14

哦,我明白了。好吧,那就不同了。最后我解决了我的问题。问题是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