unity3d - Unity的四元数旋转矩阵是如何计算的?
问题描述
我不知道如何从 Unity 中的四元数计算旋转矩阵。
一般旋转矩阵计算如下:
http://www.utdallas.edu/~sxb027100/dock/quaternion.html
下面是 wxmaxima 的代码。
l: matrix([w, z, -y, x], [-z, w, x, y], [y, -x, w, z], [-x, -y, -z, w]);
r: matrix([w, z, -y, -x], [-z, w, x, -y], [y, -x, w, -z], [x, y, z, w]);
lr: l . r;
以一般旋转矩阵中的z轴(0, 0, 1)为中心,有如下公式。
2xz-2wy
2yz+2wx
w^2-x^2-y^2+z^2=1-2x^2-2y^2
在 Unity 中,它是以下公式。
2xz+2wy
2yz-2wx
1-2x^2+2y^2
上面的区别是什么?
下面是 Unity 中的参考代码。
public static Vector3 operator *(Quaternion rotation, Vector3 point)
{
float num1 = rotation.x * 2f;
float num2 = rotation.y * 2f;
float num3 = rotation.z * 2f;
float num4 = rotation.x * num1;
float num5 = rotation.y * num2;
float num6 = rotation.z * num3;
float num7 = rotation.x * num2;
float num8 = rotation.x * num3;
float num9 = rotation.y * num3;
float num10 = rotation.w * num1;
float num11 = rotation.w * num2;
float num12 = rotation.w * num3;
Vector3 vector3;
vector3.x = (float) ((1.0 - ((double) num5 + (double) num6)) * (double) point.x + ((double) num7 - (double) num12) * (double) point.y + ((double) num8 + (double) num11) * (double) point.z);
vector3.y = (float) (((double) num7 + (double) num12) * (double) point.x + (1.0 - ((double) num4 + (double) num6)) * (double) point.y + ((double) num9 - (double) num10) * (double) point.z);
vector3.z = (float) (((double) num8 - (double) num11) * (double) point.x + ((double) num9 + (double) num10) * (double) point.y + (1.0 - ((double) num4 + (double) num5)) * (double) point.z);
return vector3;
}
解决方案
一般旋转用于直接(右手)轴系统,而统一是间接(左手)轴系统。这应该解释 - 符号,以及你得到的差异。
推荐阅读
- google-apps-script - 在共享驱动器的电子表格下使用 SpreadsheetApp 的 addEditors 函数时出错
- python - 比较具有作为列表元素的值的 2 个字典以查找添加/删除的内容的有效方法
- c# - 如何从 JsonDocument 中提取具有指定名称的所有 JsonProperty 对象的所有值?
- heroku - 将 Cloudinary 与 Heroku 一起使用
- python - 无法执行“gcc-8”:没有这样的文件或目录错误:命令“gcc-8”失败,退出状态为 1. PySIT 包安装
- sql-server - 创建一个 DW,包括。星模式
- sql - SQL Server:使用此查询获取表达式错误
- sql - 如何在 Snowflake SQL 中的 LEFT JOIN 表上平均每天的聊天数?
- java - 从 CSV 填充对象
- swift - 带参数的 ApplescriptObjC 方法