该接触PV3D这个引擎,而且对3D的编程也是一种半解,所以Mark两篇文章,以备自己学习PV3D用..
人类最初用9个值的矩阵(Matrix),来表示一个三维物体的旋转位置。它的缺陷是数据大,和无法自动在两个角度间产生过度的角度。
由于矩阵描述角度过于抽象,人类又发明了3个值的优拉角(Euler)。可优拉角是个很不负责任的家伙,旋转圈数和旋转顺序完全不做区分。三维动画师最厌 恶的情况之一‘万向锁(Gimbal Lock)’就是这个家伙的问题。按不同轴以优拉角旋转几次后,出现x,y,z三个轴完全变成同向的情况,也就是说,优拉角很容易出现旋转到最后只剩一个 方向可以旋转的情况,这就是恐怖的‘万向锁’。
后来,聪明的爱尔兰数学家发明了我们今天要研究的四元数(Quaternion),这就是迄今为止描述三维空间旋转相对完美的方案。
四元数和矩阵一样,不满足乘法交换率,也就是说,A*B不等于B*A。四元数之所以可以明确地表述三维旋转,是因为他实际上是一种‘四维’的算法。这里的‘四维’是数学上的使用,不需要去想象什么是四维的世界=_=,只是多一条轴,多一个参数而已。
我们主要介绍PV3d里Quaternion常用的几个方法和其用法,不会涉及过深的数学知识,所以不用担心。Quaternion类位置在org-papervision-core-math包里。
//构造四元数需要4个值(人家名字就叫4元嘛=_=),x,y,z是个三维向量,表示‘任意轴’,w是个标量,表示旋转度数。这就是几乎完美的角度旋转。
四元数之所以不是‘绝对完美’,是因为插值的时候过渡速率不恒定,且很难解决。不过这比起‘恐怖万向锁’已经是很小的问题。
public function Quaternion( x:Number = 0, y:Number = 0, z:Number = 0, w:Number = 1 )
//下面两个个分别是‘从优拉角换算出四元数’和‘从矩阵换算出四元数’。这是两个非常常用的方法,只要已知一个物体的优拉角或矩阵,即可生成对应的四元数。
Pv3d里任何DisplayObject3D的tranform这个属性就是变换他的矩阵,由这个矩阵就能得到目前旋转的四元数。(我们研究所的Flab摄像机旋转就用到了这些方法)
public static function createFromEuler( ax:Number, ay:Number, az:Number, useDegrees:Boolean = false )
public static function createFromMatrix( matrix:Matrix3D )
//和上面的刚好反向,分别是‘得到已知四元数的优拉角’和‘得到已知四元数的矩阵’
public function toEuler()
public function get matrix()
//插值是四元数最重要的用处之一,slerp方法的参数中,qa为开始的旋转位置的四元数,qb为结束的旋转位置四元数,apha可以看成一个插值的位置的比例,数值在0-1之间。
public static function slerp( qa:Quaternion, qb:Quaternion, alpha:Number )
完美旋转的思路是这样的:
我们必须要首先知道我们的开始位置和结束位置,结束位置很多情况用一个DisplayObject3D虚拟,我们可以用它的.tranform(是个矩阵值),变换成一个四元数
知道两头的四元数,我们只需要每祯增加alpha值(从0-1),即可在这两个四元数之间插入任意多的过渡帧的四元数。
然后将每祯的这个四元数反向为矩阵,在通过矩阵相乘目前物体的位置,即可得到物体每祯的新位置。
下面这些都是四元数的基本运算(一般使用没必要掌握),维基词典可以了解‘四元数’更专业的解释。
维基词典-四元数(会打开新窗口)
//求模,四元数到原点的距离,简单的说就是长度
public function get modulo()
//共轨
public static function conjugate( a:Quaternion )
//点乘
public static function dot( a:Quaternion, b:Quaternion )
//叉称
public static function multiply( a:Quaternion, b:Quaternion )
//求差
public static function sub(a:Quaternion, b:Quaternion)
//求和
public static function add(a:Quaternion, b:Quaternion)
分享到:
相关推荐
总的来说,`Python-QuaterNet`项目是机器学习与四元数理论在人体运动建模方面的完美融合,它不仅推动了运动模拟技术的发展,也为相关领域的研究者和开发者提供了宝贵的工具和参考。通过深入理解和应用这一模型,我们...
3. **四元数旋转矩阵**: - 四元数是一种数学工具,用于表示3D空间中的旋转。在这个项目中,四元数被用来平滑地处理传感器数据的变化,防止“ gimbal lock”问题。通过计算四元数,可以将设备的朝向转换为相对于正...
在捷联惯导中,四元数被用来表示载体的姿态,即载体相对于某一参考坐标系的旋转状态。相比于传统的欧拉角表示,四元数避免了万向节死锁问题,并且在运算上更为高效。四元数姿态解算算法能够将陀螺仪和加速度计的测量...
7. **四元数**:四元数是一种扩展的复数形式,特别适用于处理3D旋转,因为它避免了万向节死锁(Gimbal Lock)问题。书中会深入讲解四元数的运算和应用。 8. **曲线与曲面**:NURBS(非均匀有理B样条)、贝塞尔曲线...
尽管这个指南针应用在Nexus 4上完美运行,但不同设备的传感器性能和校准可能有所不同。因此,需要处理可能存在的漂移问题,以及适配不同设备的屏幕尺寸和密度。 8. **权限声明** 在AndroidManifest.xml中,别忘了...
通常会使用欧拉角或者四元数来表示设备的旋转状态。在这个指南针应用中,可能使用了`SensorManager.getRotationMatrix()`和`SensorManager.getOrientation()`方法来计算设备相对于地球坐标系的旋转矩阵和欧拉角。 7...
为了得到正确的方向,需要将这些值转换为地磁场的弧度,然后应用欧拉角或者四元数算法来计算设备相对于地球磁场的旋转角度。 4. **UI设计**: 指南针应用的用户界面通常包含一个可以旋转的指针,指向北方。UI元素...
- 磁场数据与地理北方的偏角计算是实现指南针关键步骤,通常需要进行欧拉角转换或四元数运算。 3. **Nexus 4兼容性**: - Nexus 4是一款支持Android 4.0系统的设备,因此源码可以在该设备上完美运行,意味着考虑...
- 设备传感器返回的数据是在设备坐标系中的,需要将其转换到地磁北的全局坐标系,这通常涉及到欧拉角或四元数的计算。 - 使用`SensorManager.getRotationMatrix()`结合加速度计和磁力计的数据,得到设备相对于地球...
刚体的变换涉及平移、旋转,以及这两种变换的组合,这些变换可以通过旋转矩阵、四元数或齐次坐标变换矩阵来表达。在处理连续旋转时,欧拉角可能会遇到万向节死锁问题,而四元数则能有效避免这一问题。 在虚拟环境中...
这个压缩包“安卓Andriod源码——4.0下指南针开发源码,可在Nexus4上完美运行.zip”提供了一个在Android 4.0(Ice Cream Sandwich)版本下开发指南针应用的实例,特别适用于Nexus 4设备。接下来,我们将深入探讨指南针...
- 磁场数据和加速度数据结合可以使用欧拉角或四元数来计算设备的方向。通常,使用Sensor.TYPE_MAGNETIC_FIELD和Sensor.TYPE_ACCELEROMETER获取数据,然后通过SensorManager.getRotationMatrix()和SensorManager....
- 计算出的指南针角度应实时更新到UI上,通常是一个旋转的图像或指针,通过`ImageView`或自定义View实现。 - 使用`View.setRotation(float angle)`或`ObjectAnimator`进行平滑动画,使指针随着角度改变而转动。 7...
这涉及到欧拉角或四元数的计算,通过`SensorManager.getRotationMatrix()`和`SensorManager.remapCoordinateSystem()`完成。 5. **兼容性与性能**:尽管此源码能在Nexus 4上完美运行,但Android设备众多,硬件和...
通常会使用`SensorManager.getRotationMatrix()`和`SensorManager.remapCoordinateSystem()`方法进行欧拉角或四元数转换。 5. **计算方向角度**: 通过坐标转换后的矩阵,可以计算出设备的倾斜角和方位角,即设备...
- **旋转矩阵(Rotation Matrix)**:描述相机坐标系相对于世界坐标系的旋转角度,通常用欧拉角或四元数表示。 - **平移向量(Translation Vector)**:表示相机中心在世界坐标系下的位置。 3. **标定过程**: -...
10. **兼容性测试**:尽管此指南针应用在Nexus 4上完美运行,但不同设备的传感器性能和精度可能有差异,因此需要对多种设备进行广泛的兼容性测试。 通过学习这个指南针应用的源码,你可以掌握Android传感器的使用,...