我从 Molehill 开始,在掌握 Matrix3D 时遇到了很多问题。我的第一个问题是如何管理描述单个模型方向的 Matrix3D。
我使用 Matrix3D.appendRotation() 来做到这一点。但是根据我添加的顺序,我会得到不同的结果(显然,因为我在全局空间中一次旋转一个)。我知道这是一个常见问题,我在使用 3d 软件建模时遇到过。但这一次,我必须以编程方式修复它。这是我需要帮助的地方。
首先,如果有任何混淆,这里是图片中的问题:
第 1 步:我渲染一个模型。
步骤 2a:我在 X 轴上旋转它。看起来正确!
步骤 2b:我在 Z 轴上旋转它。看起来正确!
所以......如果我在模型的 X 和 Z 轴上旋转我想要这个:
但是,悲伤的脸,我明白了:
我可以看到问题。我在全局空间中一次添加一个旋转。我需要在对象的本地空间中旋转。我不知道如何做到这一点,或者我什至应该搜索什么(术语等)。代码很简单(而且错误):
modelLocalMatrix.identity();
modelLocalMatrix.appendRotation(modelZRot, Vector3D.Z_AXIS);
modelLocalMatrix.appendRotation(modelXRot, Vector3D.X_AXIS);
//eventually y-axis rotation as well...
renderMatrix.append(modelLocalMatrix);
我猜我不想使用 Vector3D 轴常数,而是想使用一些归一化向量和一些……呃,东西……代替 modelZRot、modelXRot,最后是 modelYRot。谁能告诉我应用上述所需旋转类型的最佳实践解决方案是什么?
更新:花了一天时间阅读“书籍”(又名 YouTube 上的 KhanAcademy)并在此处开始此演示:3d 旋转矩阵的数学我偶然发现了一种非常接近我想要的“查看”方法解决方案。不幸的是,我只有 50% 的理解。我仍然希望有人能对这个话题有所了解!
var angleOfRotation:Number = Math.PI / 2; //90 degrees...
var axisOfRotation:Vector3D = new Vector3D(0, 1, 0); //some point to look at...
//normalize the vector!
axisOfRotation.normalize();
var x:Number = axisOfRotation.x;
var y:Number = axisOfRotation.y;
var z:Number = axisOfRotation.z;
var c:Number = Math.cos(angleOfRotation);
var s:Number = Math.sin(angleOfRotation);
var t:Number = 1 - c;
//Graphics Gems (Glassner, Academic Press, 1990).
modelLocalMatrix = new Matrix3D(new <Number>[
t * (x * x) + c, t * x * y - s * z, t * x * z + s * y, 0,
t * x * y + s * z, t * (y * y) + c, t * y * z - s * x, 0,
t * x * z - s * y, t * y * z + s * x, t * (z * z) + c, 0,
0, 0, 0, 1
]);
问题是,这似乎相当笨重。特别是因为 Vector3D 的旋转角度应该是第四个 (w) 值。更重要的是,Matrix3D 似乎已经有了一个lookAt() 方法。我还没明白……请有人把我从数小时的反复试验中拯救出来!