Articles of 四元数

用四元数正确旋转

我有一个旋转大理石的问题。 我已经用Matrix.CreateFromYawPitchRoll和Matrix.CreateRotation尝试过了,但是有一些问题,我认为这是由于Gimbal锁效应。 所以,我尝试使用四元数 ,而没有改变。 当只在一个轴上移动时,它可以正常工作,但是当旋转发生在两个不同的轴上时,大理石依然在错误的轴上旋转。 这是我的代码: // declarations Vector3 Position = Vector3.Zero; Vector3 Rotation = Vector3.Zero; Quaternion qRotation = Quaternion.Identity; AbsoluteBoneTransforms = new Matrix[Model.Bones.Count]; Model.CopyAbsoluteBoneTransformsTo(AbsoluteBoneTransforms); 在Update方法中: Position += speed; Rotation = speed * MathHelper.ToRadians(-1.5f); Quaternion rot = Quaternion.CreateFromAxisAngle(Vector3.Right, Rotation.Z) * Quaternion.CreateFromAxisAngle(Vector3.Backward, Rotation.X); qRotation *= rot; 在Draw方法中: effect.World = AbsoluteBoneTransforms[mesh.ParentBone.Index] * Matrix.CreateFromQuaternion(qRotation) * Matrix.CreateTranslation(Position); 怎么了? 编辑 […]

怎样才能获得两个四元数之间的相对取向?

如何获得给定两个方向的相对方向(用四元数q0和q1 )?

四元数旋转,平移,缩放或4×3 / 4x4matrix的骷髅?

我正在修改一个使用4×3和4×4matrix制作骨架的游戏,但是我看到骨架也可以用四元旋转和vector平移和缩放来制作。 两者有什么区别? 第一个有更多的价值,我想,但是,哪个更好? 如果我有一个4×3 / 4×4的matrix框架,我可以通过某种方式将其转换为旋转,平移和缩放吗?

麻烦与四元数和轨道摄像机:

更新:我一直在尝试在Unity3D目前正在做的引擎中实现一个轨道相机,问题是我似乎无论做什么正确的旋转。 这就是需要的: 通过鼠标在Y轴和X轴上旋转,但是Y轴和X轴不是Vector.up或Vector.right,它们是由我围绕的目标的当前斜率给出的。 我不明白我怎样才能使它独立于角色轮换,但同时依赖 这种types的作品,但一些循环有问题,检查下面的video,尝试什么是错的味道 var forward = Vector3.forward; //Vector3.Cross(ViewTarget.transform.up, transform.right); //Apply the rotation var rot = Quaternion.AngleAxis(CurrentHorizontalLook, ViewTarget.transform.up); var rot2 = Quaternion.AngleAxis(CurrentVerticalLook, transform.right) ; Debug.DrawRay(ViewTarget.transform.position, Vector3.right * 5, Color.yellow, 0, false); Debug.DrawRay(ViewTarget.transform.position, ViewTarget.transform.up * 5, Color.blue, 0, false); var offset = forward * 5; transform.rotation = rot * rot2; transform.position = ViewTarget.transform.position + EyeHeight […]

如何从两个正交三维向量得到四元数?

我有一个单位vector代表我想“看”的方向和一个单位向量。 它们是正交的。 我怎样才能从这两个向量中得到代表这个方向的四元数?

我如何从翻译点计算新的四元数?

下面的代码是使用Verlet方法的碎布娃娃,我有正确的点(或关节)的位置,我只是需要正确的四元数,否则结果模型看起来像在图片中,我约束身体绑定为了testing目的而特意构成。 基于这两点,它们的位置和四元数,新的四元数对于每个转换点将会是什么? struct Point { XMVECTOR position = { 0,0,0 }; XMVECTOR quaternion = { 0,0,0,-1 }; }; Point p1; Point p2; p1.position += { 0.0f,0.3f, 0.1f }; p2.position += { -1.0,0.3f,0.1f };

如何基于鼠标位置在Z轴上插入对象的旋转?

我需要应用旋转到一个对象,基于鼠标移动到一个z-axis只。 我们来拍这张照片吧: 紫罗兰色 – 当前的鼠标位置 蓝色 – 鼠标移动 红色 – 要旋转的对象 我使用这个脚本,它工作正常: mousePos = Input.mousePosition; screenPos = Camera.main.ScreenToWorldPoint(Vector3(mousePos.x, mousePos.y, transform.position.z – Camera.main.transform.position.z)); transform.rotation.eulerAngles.z = Mathf.Atan2((screenPos.y – transform.position.y), (screenPos.x – transform.position.x)) * Mathf.Rad2Deg; 但是…这是我不想要的实时工作,所以我需要插入它。 我用Quaternion.Lerp/Slerp ,我得到了一个奇怪的结果。 当我将鼠标移动得太快(围绕立方体旋转)时,它将跳到鼠标的新位置(这是正确的),但是当角度从-180改变到180或180到-180时,它会改变旋转方向。 这是因为Quaternionmath很可能是准确的 – Quaternion决定切换旋转方向,因为它find了一条较短的path。 这个问题 如何顺利(用lerp)旋转对象(在Z轴上)来查看鼠标位置,以避免在上述情况下出现上述故障?

Unity3d:旋转游戏对象

Quaternion objectRotation = Quaternion.identity; Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.forward); objectRotation *= rotation; gameObject.transform.rotation *= objectRotation; 这里angle = -90 但是当我replace的时候,游戏对象不是按照需要旋转的 gameObject.transform.rotation *= objectRotation; 同 gameObject.transform.Rotate (0,0,angle); 然后游戏对象旋转-90度,不明白为什么四元数部分不工作? 它旋转了90度

人物方向改变

我正在使用Bullet Physics和DirectX编写游戏。 我最近开始移动主角,现在我有一个错误,希望有人能够发现。 角色是完全物理的物体(有腿)。 静止时,角色在X,Y,Z上有摩擦 当向前移动时,摩擦力被消除,中心脉冲被施加在必要的方向上。 计算冲动的应用,使得角色以受控的速度行走。 方向由头部控制。 当角色向左或向右看时,脉冲方向相应地改变。 这一切工作正常。 当我环顾四周,我可以将我的角色向任何方向移动。 问题是如果我改变方向(移动头部),那么当我正确计算冲动时,角色将继续沿原始方向移动,只能缓慢地改变到新的方向。 我知道这是因为角色还没有停止,所以摩擦仍然是0,所以我们仍然有从前一个动作的速度。 如果角色要停下来转动,那么它就能正常工作,并且能够在任何方向上正确地行走,因为停止摩擦会消除以前的所有动作。 为了解决这个问题,我相信我需要改变我的冲动方向计算,以便取消以前的运动。 但是,虽然这几乎工作,我有一些错误,这意味着字符左右摇摆。 所以有些事情是错的,但我不知道是什么。 这是我的: + X =右+ Y =上+ Z =正向 //Try and move forward auto energy = btVector3(0,0,20) //Get a quaternion for the direction we are already moving auto motionDirection = (lastPosition – position).normalized(); auto forward = motionDirection; auto right […]

如何在JOML和LWJGL3中使用四元数

我正在使用LWJGL3和JOML(math库)实现一个太空fps游戏(太空中没有太多的空间!)。 我游戏中的实体有一个基于向前,向上和向右的旋转。 我使用俯仰,偏航和滚转方法来旋转我的实体。 这些方法可以进一步在伪代码中看到。 当我为实体构建模型matrix时,我将根据上述3个向量计算旋转matrix并应用它。 在伪代码中可以进一步看到。 我也使用角和线性加速度和速度旋转和移动一个实体。 在伪代码中可以进一步看到。 实体: Vector3f position Vector3f scale Vector3f forward Vector3f up Vector3f right private Vector3f linearAcc private Vector3f linearVel private Vector3f angularAcc private Vector3f angularVel public void pitch(double angle) { forward.mul((float) Math.cos(angle), tempVector1).add(up.mul((float) Math.sin(angle), tempVector2)).normalize(forward); right.cross(forward, up); } public void roll(double angle) { right.mul((float) Math.cos(angle), tempVector1).add(up.mul((float) Math.sin(angle), tempVector2)).normalize(right); right.cross(forward, […]