gpt4 book ai didi

actionscript-3 - 如何在模型的局部空间(非全局)中组合 X、Y 和 Z 旋转?

转载 作者:行者123 更新时间:2023-12-04 04:25:13 25 4
gpt4 key购买 nike

我刚开始使用 Molehill,在掌握 Matrix3D 时遇到了很多问题。
我的第一个问题是如何管理描述单个模型方向的 Matrix3D。

我使用 Matrix3D.appendRotation() 来做到这一点。但是根据我附加的顺序,我会得到不同的结果(显然,因为我在全局空间中一次旋转一个)。
我知道这是一个常见问题,我在使用 3d 软件建模时遇到过它。但这一次,我必须以编程方式修复它。这是我需要帮助的地方。

首先,如果有任何混淆,这里是图片中的问题:

第 1 步:我渲染一个模型。

Start position

步骤 2a:我在 X 轴上旋转它。
看起来正确!

X-axis rotation

步骤 2b:我在 Z 轴上旋转它。
看起来正确!

Z-axis rotation

所以......如果我在模型的 X 和 Z 轴上旋转,我想要这个:

desired XZ rotation

但是,可悲的是,我明白了:

enter image description here

我可以看到问题。我在全局空间中一次添加一个旋转。我需要在对象的局部空间中旋转。我不知道该怎么做,也不知道我什至应该搜索什么(术语等)。代码很简单(而且是错误的):

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)并从这里开始本次演示: The Mathematics of the 3d Rotation Matrix我偶然发现了一种非常接近我想要的解决方案的“查看”方法。不幸的是,我只有 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() 方法。我还不明白……请有人把我从数小时的反复试验中解救出来!

最佳答案

好的,我基本上已经想出了如何做到这一点。它比我制作的要简单得多。它还有助于审查 Matrix3D API(它有一些很棒的功能!)。

首先,我用来在局部轴上旋转模型的源代码:

var raw:Vector.<Number> = modelLocalMatrix.rawData;
var right:Vector3D = new Vector3D(raw[0], raw[1], raw[2]);
var up:Vector3D = new Vector3D(raw[4], raw[5], raw[6]);
var out:Vector3D = new Vector3D(raw[8], raw[9], raw[10]);

modelLocalMatrix.appendRotation(modelXRot, right);
modelLocalMatrix.appendRotation(modelYRot, up);
modelLocalMatrix.appendRotation(modelZRot, out);

“up”、“right”和“out”归一化向量在我原帖的链接中讨论过。它们基本上是模型的俯仰、偏航和滚转轴。可以说,当您初始化对象时,这些向量与 Vector3D.X_AXIS、Y_AXIS 和 Z_AXIS 相同。我已经使用 Matrix3D.rawData 属性提取了它们,尽管可能有更好的方法。

现在,您可以选择沿这些轴中的任何一个旋转,但是一旦您这样做,其他两个轴的方向就会立即改变。这是有道理的。您的模型已经旋转,它的“右”、“上”和“前”现在不同了!因此,如果您首先在模型的“右”轴上旋转(请记住,这开始时与全局 X_AXIS 相同),然后您想在其“外”轴上滚动模型,则需要从模型的本地获取它矩阵。显然,它不再与全局 Z_AXIS 相同。请注意,我没有调用 Matrix3D.identity()。如果我这样做了,那么我的模型的轴将被重置!这对于我的渲染循环来说是可以的,尽管我不得不稍微改变我的代码(和思维方式),因为我在应用转换和旋转之前已经重置了我的所有矩阵。请注意,modelXRot、modelYRot 和 modelZRot 以度为单位存储旋转值。

我当然希望这对某人有所帮助。我简直不敢相信这么简单的解决方案竟然找不到这么普遍的问题。无论如何,它似乎确实在做我想要的。

关于actionscript-3 - 如何在模型的局部空间(非全局)中组合 X、Y 和 Z 旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8238061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com