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

第一人称相机胶卷

尉迟韬
2023-03-14

我正在使用LWJGL和OpenGL 3.2为OpenGL编写java游戏引擎。每当移动鼠标旋转相机时,它都会添加滚动、俯仰和偏航。

摄像头代码

public Matrix4f getViewMatrix() {
    getParent().getTransform().getWorldRot().mul(rotation, (Quaternion) null).toRotationMatrix(viewMatrix);
    viewMatrix.mul(Matrix4f.setTranslation(getParent().getTransform().getWorldPos(), null));
    return viewMatrix;
}


public boolean mouseMoved(MouseEvent event) {
    Quaternion.mul(rotation, new Quaternion((float) Math.toRadians(event.x / 1f), rotation.getUp(null)), rotation);
    Quaternion.mul(rotation, new Quaternion((float) Math.toRadians(event.y / 1f), rotation.getRight(null)), rotation);
    return true;
}

四元数代码

public Vector4f getRight(Vector4f dest) {
    if (dest == null)
        dest = new Vector4f();

    dest.x = 1.0f - 2.0f * (y * y + z * z);
    dest.y = 2.0f * (x * y - w * z);
    dest.z = 2.0f * (x * z + w * y);

    return dest;
}

public Vector4f getUp(Vector4f dest) {
    if (dest == null)
        dest = new Vector4f();

    dest.x = 2.0f * (x * y + w * z);
    dest.y = 1.0f - 2.0f * (x * x + z * z);
    dest.z = 2.0f * (y * z - w * x);

    return dest;
}

public Vector4f getForward(Vector4f dest) {
    if (dest == null)
        dest = new Vector4f();

    dest.x = 2.0f * (x * z - w * y);
    dest.y = 2.0f * (y * z + w * x);
    dest.z = 1.0f - 2.0f * (x * x + y * y);

    return dest;
}

共有1个答案

范修伟
2023-03-14

我不需要起床。

public boolean mouseMoved(MouseEvent event) {
    Quaternion.mul(rotation, new Quaternion((float) Math.toRadians(event.x / 1f), Vector4f.UP), rotation);
    Quaternion.mul(rotation, new Quaternion((float) Math.toRadians(event.y / 1f), rotation.getRight(null)), rotation);
    return true;
}
 类似资料:
  • 我正在使用GLM库实现一个第一人称相机,它为我提供了一些有用的函数,可以计算透视和“注视”矩阵。我也在使用OpenGL,但这不会对代码产生影响。 在这张图片中,你可以看到四个摄像头的位置。标有1的是在运动之前,标有2的是在运动之后。红色三角形表示沿z轴笔直向前的相机。蓝色三角形代表一个相机,该相机已沿x轴(向左)旋转向后看。当我按下“向前移动键”时,相机在两种情况下都会沿z轴向前移动,而不考虑相机

  • 我最近完成的opengl程序中有一个“相机”。然而,我注意到每当我旋转然后再次移动时,x、y和z的角度都会改变。例如,当我按下“w”键时,我沿着“z”轴向前移动。如果我然后旋转相机90度,当我按下“W”键时,我实际上会沿着“x”轴向右移动。为什么会发生这种情况是有道理的,我只是想知道为什么会发生。这是旋转函数: 键盘功能: 以及我的翻译功能: 有没有办法解决这个问题?

  • 我正在用LWJGL开发一个3D游戏,我想添加一个支持鼠标的第一人称相机。我现在有一个,但它并不顺利,一点也不好用。我真的希望窗口也能聚焦,这样鼠标就可以启动,而不是在窗口上悬停。我如何实现这一点? 以下是我当前的摄像头实现:

  • 我正在使用键盘上的箭头键实现一个第一人称相机,在场景中移动。当我只绕一个轴(X或Y)旋转时,它似乎工作正常,但是如果我绕两个轴旋转,它也会绕第三个轴Z旋转。我敢肯定,问题在于我的相机不是绕着全局轴旋转,而是绕着局部轴旋转,当我只需要偏航和俯仰时,就会产生“滚动”。在我的代码中,我从X和Y旋转推导出一个前向向量,存储在两个变量中。最相关的代码片段如下: 功能由功能补充: } 其中,相当于偏航,相当于

  • 该类是 FlyControls 的另一个实现。 例子 webgl / geometry / terrain 构造函数 FirstPersonControls( object : Camera, domElement : HTMLDOMElement ) object: 被控制的摄像机。 domElement: 用于事件监听的HTML元素。 创建一个新的 FirstPersonControls 实例

  • 我正试图用Java/LWJGL制作一个游戏/演示,但第一人称摄像头有问题: 我使用WASD来移动向量,无论发生什么奇怪的事情: 当我把眼睛移开或移向我时,右边和左边的部分会被挡住。 当我把眼睛移到我的右边或左边时,视图的顶部和底部会被我的视图挡住。 我已经成功实现了鼠标移动(环顾四周),现在相关代码片段: (注意:Matrix4f类以列主顺序工作) 我真的不知道为什么相机的行为如此奇怪,这意味着什