3D数学基础——四元数旋转公式的证明

本文介绍了如何使用四元数表示三维空间中的旋转,并通过数学推导详细解释了以四元数为轴进行旋转的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章出处: http://blog.youkuaiyun.com/ynnmnm/article/details/5568333

 

命题:设四元数 = a*i + b*j + c*k ,且 ^2 = -1 ;对于任意四元数 ,以 为轴正向旋转(右手坐标系 中逆时针方向,左手坐标系中顺时针方向)θ角度,得到向量 ’ ,则: ’ = r ^(-1) ,其中 r = cos( θ /2) + sin( θ/2) * u 。


证明: *r ^(-1) = 1 = r ^(-1) * r   ...... ( 1 )

在方程( 1 )两边同时乘以 的共轭 *,可以得到:

*=  r ^(-1) * r * r * = r ^(-1) * |r| ^2  ...... ( 2 )

又由: |r| ^2 = (cos( θ /2))^2 + (sin( θ /2))^2* ( a^2 + b^2 + c^2 ) = 1

得 ^(-1)= r */ |r| ^2 = r * = cos( θ /2) - sin( θ /2) * u

 

如图所示, 设四元数 与 垂直,与 ,p 共面,且 ^2 = -1 ;四元数u * v ,则v , w 组成一个直角坐标系。

  

p = s * u + t * v

r^(-1) = (cos(θ/2)sin(θ/2) * u ) * ( s * u + t * ) * (cos(θ/2) - sin(θ/2) * u )

 = ( s * cos(θ/2)* u + t* cos(θ/2)*v - s* sin(θ/2) + t* sin(θ/2)*w ) * (cos(θ/2) - sin(θ/2) * u )

 = s* (cos(θ/2))^2* u + t* (cos(θ/2))^2*v - s* sin(θ/2)* cos(θ/2) + t* sin(θ/2)* cos(θ/2)*w

   + s* sin(θ/2)* cos(θ/2) + t* sin(θ/2)* cos(θ/2)*w - s*(sin(θ/2))^2*u - t*(sin(θ/2))^2*v

 = s*u + t* cos(θ)*v + t* sin(θ)*w

 

由此可知,p’是由pu正向旋转θ角度而得。

 

### Unity3D 中的旋转变换与 Quaternion 的数学基础 在 Unity3D 中,`Quaternion` 是用于表示物体旋转的核心数据结构。它通过四元数的形式存储旋转信息,相比欧拉角(Euler Angles),能够更高效地处理插值和避免万向锁问题[^1]。 #### 1. **Quaternion 和 Euler Angle 转换** Unity 提供了 `eulerAngles` 属性来获取或设置一个 `Quaternion` 对应的欧拉角形式。这使得开发者可以方便地用三个角度(绕 X、Y、Z 轴的角度)描述旋转。然而需要注意的是,在内部计算时,Unity 使用的是四元数而非欧拉角。 转换关系如下: - 将欧拉角转为四元数: ```csharp Quaternion q = Quaternion.Euler(xAngle, yAngle, zAngle); ``` - 将四元数转回欧拉角: ```csharp Vector3 angles = q.eulerAngles; ``` 这种转换基于特定的轴序约定(通常是 ZXY 或其他引擎定义的方式)。因此,即使输入相同的欧拉角,最终得到的结果可能因中间过程而略有不同[^4]。 --- #### 2. **围绕指定轴旋转的方法** 如果希望让某个 GameObject 绕着某一方向矢量进行一定角度的旋转,则可利用 `Quaternion.AngleAxis()` 方法: ```csharp transform.rotation = Quaternion.AngleAxis(degrees, axisVector) * transform.rotation; ``` 上述代码片段展示了如何创建一个新的旋转并将其应用到当前对象上[^2]。其中: - `degrees`: 表示要旋转的角度; - `axisVector`: 定义了旋转发生的轴线; 此操作实际上是构建了一个新的四元数值,并乘以前存在的状态从而形成更新后的姿态。 --- #### 3. **设定目标朝向** 当需要调整摄像机或其他实体使其看向某一点或者沿着给定的方向前进时,“观察旋转”非常有用。下面的例子演示了怎样配置一个刚体让它面向两个预设好的世界空间位置之间的连线方向: ```csharp Vector3 forwardDirection = targetPosition - startPosition; forwardDirection.y = 0f; // Optional: Ignore vertical component. Quaternion lookRotation = Quaternion.LookRotation(forwardDirection.normalized, upDirection); // Apply the rotation to a game object's Transform component: transform.rotation = lookRotation; ``` 这里调用了 `SetLookRotation(Vector3 forward, Vector3 upwards)` 函数来自动生成匹配所期望前视图与向上参照系组合而成的姿态矩阵[^3]。 --- #### 4. **复合变换注意事项** 由于三维几何学里基本仿射变化包括但不限于尺度伸缩(Scale),定向扭转(Rotation)以及位移(Translation),它们共同作用于模型顶点坐标之上构成整体视觉呈现效果。按照惯例来说,执行这些动作的时候应该遵循一定的次序——即先做比例调节(scale), 接下来才是方位改变(rotation),最后才考虑地点迁移(translation)[^4]。不过值得注意的一点在于不同的图形渲染框架可能会采用不一样的默认优先级安排方案,所以在跨平台移植项目期间务必仔细核查相关文档说明以免造成误解偏差现象发生。 --- ### 总结 综上所述,Unity3D 中实现旋转变换主要依赖于 `Quaternion` 类型所提供的多种便捷工具函数,比如直接赋值法(`= new Quaterion()`)、增量叠加方式(* operator overloading*)还有专门定制路径导向功能等等。与此同时也要牢记关于多重连续变形序列排列的重要性及其背后潜在的影响因素分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值