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

C OpenGL四元数相机翻转它颠倒

陈刚洁
2023-03-14

当我移动到右边的目标时,它确实会查看目标,并向上看,直到它与-zax成180度并决定走另一条路。

Matrix4x4 camera::GetViewMat()
{
    Matrix4x4 oRotate, oView;
    oView.SetIdentity();

    Vector3 lookAtDir = m_targetPosition - m_camPosition;
    Vector3 lookAtHorizontal = Vector3(lookAtDir.GetX(), 0.0f, lookAtDir.GetZ());
    lookAtHorizontal.Normalize();

    float angle = acosf(Vector3(0.0f, 0.0f, -1.0f).Dot(lookAtHorizontal));
    Quaternions horizontalOrient(angle, Vector3(0.0f, 1.0f, 0.0f));

    ori = horizontalOrient;
    ori.Conjugate();
    oRotate = ori.ToMatrix();

    Vector3 inverseTranslate = Vector3(-m_camPosition.GetX(), -m_camPosition.GetY(), -m_camPosition.GetZ());
    oRotate.Transform(inverseTranslate);

    oRotate.Set(0, 3, inverseTranslate.GetX());
    oRotate.Set(1, 3, inverseTranslate.GetY());
    oRotate.Set(2, 3, inverseTranslate.GetZ());
    oView = oRotate;

    return oView;
}

共有1个答案

李凯定
2023-03-14

正如promise的那样,一些代码显示了我如何让相机始终查看空间中的特定点。

首先,我们需要一种方法从一个角度和一个轴构造一个四元数,我碰巧在pastebin上有,角度输入是弧度:

http://pastebin.com/vLcx4Qqh

确保不要输入轴(0,0,0),这毫无意义。

现在使用实际的更新方法,我们需要获得四元数,将相机从默认方向旋转到指向目标点。请注意,我只是在脑海中写下了这一点,它可能需要一些调试和优化,但这至少应该给你一个正确的方向推动。

void camera::update()
{
    // First get the direction from the camera's position to the target point
    vec3 lookAtDir = m_targetPoint - m_position;

    // I'm going to divide the vector into two 'components', the Y axis rotation
    // and the Up/Down rotation, like a regular camera would work.

    // First to calculate the rotation around the Y axis, so we zero out the y
    // component:
    vec3 lookAtHorizontal = vec3(lookAtDir.x, 0.0f, lookAtDir.z).normalize();

    // Get the quaternion from 'default' direction to the horizontal direction
    // In this case, 'default' direction is along the -z axis, like most OpenGL
    // programs. Make sure the projection matrix works according to this.
    float angle = acos(vec3(0.0f, 0.0f, -1.0f).dot(lookAtHorizontal));
    quaternion horizontalOrient(angle, vec3(0.0f, 1.0f, 0.0f));

    // Since we already stripped the Y component, we can simply get the up/down
    // rotation from it as well.
    angle = acos(lookAtDir.normalize().dot(lookAtHorizontal));
    if(angle) horizontalOrient *= quaternion(angle, lookAtDir.cross(lookAtHorizontal));

    // ...
    m_orientation = horizontalOrient;
}

现在要真正采取m_方向m_位置并获得世界-

// First inverse each element (-position and inverse the quaternion),
// the position is rotated since the position within a matrix is 'added' last
// to the output vector, so it needs to account for rotation of the space.
mat3 rotationMatrix = m_orientation.inverse().toMatrix();
vec3 inverseTranslate = rotationMatrix * -m_position; // Note the minus

mat4 matrix = mat3; // just means the matrix is expanded, the last entry (bottom right of the matrix) is a 1.0f like an identity matrix would be.

// This bit is row-major in my case, you just need to set the translation of the matrix.
matrix[3] = inverseTranslate.x;
matrix[7] = inverseTranslate.y;
matrix[11] = inverseTranslate.z;

EDIT我认为这应该是显而易见的,但只是为了完整性,. dot()取向量的点积,. Cross()取向量积,执行方法的对象是向量A,方法的参数是向量B。

 类似资料:
  • 本文向大家介绍unity3d 四元数外观旋转,包括了unity3d 四元数外观旋转的使用技巧和注意事项,需要的朋友参考一下 示例 Quaternion.LookRotation(Vector3 forward [, Vector3 up])将创建一个四元数旋转,该旋转向前看“向下”向前的向量,并使Y轴与“向上”向量对齐。如果未指定up向量,Vector3.up则将使用。 旋转此游戏对象以查看目标游

  • 该类实现了 quaternion 。 四元数在three.js中用于表示 rotation (旋转)。 代码示例 const quaternion = new THREE.Quaternion(); quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 ); const vector = new THREE.V

  • 问题内容: 我试图了解四元数旋转的工作原理,我发现了这个迷你教程http://www.julapy.com/blog/2008/12/22/quaternion- rotation/, 但是他做出了一些我不能锻炼的假设,就像我如何“ 简单地通过绕轴旋转矢量来计算绕轴的旋转矢量 ” 。 他如何计算angleDegreesX,angleDegreesY和angleDegreesZ? 有人可以提供可行的

  • flip 接受一个函数参数,然后将该函数第一个参数作为最后一个参数。(注:翻转参数) 返回一个接受可变参数输入的闭包,并且在应用其余参数之前将最后一个参数作为第一个参数。 const flip = fn => (...args) => fn(args.pop(), ...args); let a = { name: 'John Smith' }; let b = {}; const mergeF

  • 在之前的教程中我们学习了如果当相机不位于初始位置时,如何使得得场景中的物体正确的投影到屏幕上面,那么我们下一步就应该学着去控制这个相机,使得相机可以在场景中自由移动。我们可以用鼠标和键盘控制相机——鼠标控制视口方向,键盘控制相机的位置。这些都和第一人称视角相似,这一节我们主要来学习鼠标和键盘对相机的控制。 我们仍然使用上下左右四个方向键。记住,我们的相机的变换取决于相机的位置、target 向量和

  • 我有一个一维数组,它代表一个二维网格。行和列的数量是已知的。从“左上角”到“右下角”读取,因此第一项为R1C1,最后一项为RXCY(其中X=行编号,Y=列编号; 我的目标是翻转或旋转二维数组,并返回一个新的一维数组表示转换。 我尝试了按位操作,但无法让它与行/行计数可能是奇数或偶数的事实一起工作。我也尝试了迭代方法,但在逻辑杂草中迷失了方向。 一个最简单的javascript示例:9项数组中的3^