Unity 利用Quaternion.LookRotation API 将旋转矩阵转换成四元数
2014-03-26 14:01
816 查看
Quaternion.LookRotation
private static
Quaternion QuaternionLookRotation(Vector3 forward,
Vector3 up)
{
forward.Normalize();
Vector3 vector
= Vector3.Normalize(forward);
Vector3 vector2
= Vector3.Normalize(Vector3.Cross(up,
vector));
Vector3 vector3
= Vector3.Cross(vector, vector2);
var m00
= vector2.x;
var m01
= vector2.y;
var m02
= vector2.z;
var m10
= vector3.x;
var m11
= vector3.y;
var m12
= vector3.z;
var m20
= vector.x;
var m21
= vector.y;
var m22
= vector.z;
float num8
= (m00
+ m11)
+ m22;
var quaternion
= new
Quaternion();
if
(num8 >
0f)
{
var num
= (float)Math.Sqrt(num8
+ 1f);
quaternion.w
= num *
0.5f;
num =
0.5f / num;
quaternion.x
= (m12
- m21)
* num;
quaternion.y
= (m20
- m02)
* num;
quaternion.z
= (m01
- m10)
* num;
return quaternion;
}
if
((m00 >= m11)
&& (m00
>= m22))
{
var num7
= (float)Math.Sqrt(((1f
+ m00)
- m11)
- m22);
var num4
= 0.5f
/ num7;
quaternion.x
= 0.5f
* num7;
quaternion.y
= (m01
+ m10)
* num4;
quaternion.z
= (m02
+ m20)
* num4;
quaternion.w
= (m12
- m21)
* num4;
return quaternion;
}
if
(m11 > m22)
{
var num6
= (float)Math.Sqrt(((1f
+ m11)
- m00)
- m22);
var num3
= 0.5f
/ num6;
quaternion.x
= (m10+ m01)
* num3;
quaternion.y
= 0.5f
* num6;
quaternion.z
= (m21
+ m12)
* num3;
quaternion.w
= (m20
- m02)
* num3;
return quaternion;
}
var num5
= (float)Math.Sqrt(((1f
+ m22)
- m00)
- m11);
var num2
= 0.5f
/ num5;
quaternion.x
= (m20
+ m02)
* num2;
quaternion.y
= (m21
+ m12)
* num2;
quaternion.z
= 0.5f
* num5;
quaternion.w
= (m01
- m10)
* num2;
return quaternion;
}
private static
Quaternion QuaternionLookRotation(Vector3 forward,
Vector3 up)
{
forward.Normalize();
Vector3 vector
= Vector3.Normalize(forward);
Vector3 vector2
= Vector3.Normalize(Vector3.Cross(up,
vector));
Vector3 vector3
= Vector3.Cross(vector, vector2);
var m00
= vector2.x;
var m01
= vector2.y;
var m02
= vector2.z;
var m10
= vector3.x;
var m11
= vector3.y;
var m12
= vector3.z;
var m20
= vector.x;
var m21
= vector.y;
var m22
= vector.z;
float num8
= (m00
+ m11)
+ m22;
var quaternion
= new
Quaternion();
if
(num8 >
0f)
{
var num
= (float)Math.Sqrt(num8
+ 1f);
quaternion.w
= num *
0.5f;
num =
0.5f / num;
quaternion.x
= (m12
- m21)
* num;
quaternion.y
= (m20
- m02)
* num;
quaternion.z
= (m01
- m10)
* num;
return quaternion;
}
if
((m00 >= m11)
&& (m00
>= m22))
{
var num7
= (float)Math.Sqrt(((1f
+ m00)
- m11)
- m22);
var num4
= 0.5f
/ num7;
quaternion.x
= 0.5f
* num7;
quaternion.y
= (m01
+ m10)
* num4;
quaternion.z
= (m02
+ m20)
* num4;
quaternion.w
= (m12
- m21)
* num4;
return quaternion;
}
if
(m11 > m22)
{
var num6
= (float)Math.Sqrt(((1f
+ m11)
- m00)
- m22);
var num3
= 0.5f
/ num6;
quaternion.x
= (m10+ m01)
* num3;
quaternion.y
= 0.5f
* num6;
quaternion.z
= (m21
+ m12)
* num3;
quaternion.w
= (m20
- m02)
* num3;
return quaternion;
}
var num5
= (float)Math.Sqrt(((1f
+ m22)
- m00)
- m11);
var num2
= 0.5f
/ num5;
quaternion.x
= (m20
+ m02)
* num2;
quaternion.y
= (m21
+ m12)
* num2;
quaternion.z
= 0.5f
* num5;
quaternion.w
= (m01
- m10)
* num2;
return quaternion;
}
相关文章推荐
- Eigen库 EulerAngles <-->RotationMatrix<-->Quaterniond 转换方法 欧拉角<-->旋转矩阵<-->四元数
- [Unity 3D] Quaternion.LookRotation
- UnityEngine.Quaternion.LookRotation详解
- unity 关于Rotation和Quaternion的一些问题(欧拉角与四元数,lerp与slerp)
- UnityEngine.Quaternion.LookRotation详解
- [Unity 3D] Quaternion.LookRotation
- 面向组件编程之Unity 11.Quaternion.LookRotation 转自lijing_hi
- unity3D 彻底搞懂 Quaternion LookRotation FromToRotation SetLookRotation方法
- unity 关于四元数Quaternion(原)
- 【Unity技巧】四元数(Quaternion)和旋转
- unity 利用四元数旋转向量时出错 解决方法
- Quaternion.LookRotation
- 【Unity编程】四元数(Quaternion)与欧拉角
- Unity3D:详解注视旋转(Quaternion.LookRotation)
- Quaternion.LookRotation
- Unity简单利用屏幕坐标转换实现鼠标控制物体移动
- 【Unity技巧】四元数(Quaternion)和旋转
- 【Unity】6.8 Quaternion类(四元数)
- 利用wps的API将word、excel、ppt转换为pdf
- 【Unity】【转】四元数(Quaternion)和旋转