如何使用matrix3D在AS3中围绕中心进行3D旋转?
我正在尝试围绕其中心点在三个维度上旋转精灵,并且我正在努力理解 matrix3D 的一些行为。
我已经重写了 Sprite 的 setrotationX、rotationY 和rotationZ 方法,如下所示:
override public function set rotationX (_rotationX:Number) : void {
this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
this.transform.matrix3D.prependRotation(-this.rotationX, Vector3D.X_AXIS);
this.transform.matrix3D.prependRotation(_rotationX, Vector3D.X_AXIS);
this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);
}
override public function set rotationY (_rotationY:Number) : void {
this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
this.transform.matrix3D.prependRotation(-this.rotationY, Vector3D.Y_AXIS);
this.transform.matrix3D.prependRotation(_rotationY, Vector3D.Y_AXIS);
this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);
}
override public function set rotationZ (_rotationZ:Number) : void {
this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
this.transform.matrix3D.prependRotation(-this.rotationZ, Vector3D.Z_AXIS);
this.transform.matrix3D.prependRotation(_rotationZ, Vector3D.Z_AXIS);
this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);
}
我使用 prependTranslation 来校正旋转的中心点,并使用第一个 prependRotation 来取消任何先前应用的旋转。
测试一下,rotationX 完全按照预期工作,并且 Sprite 围绕其水平轴旋转。
旋转Y和旋转Z似乎也工作正常。然而,存在一个问题:每当设置rotationY或rotationZ时,所有其他旋转值也会改变。这不是rotationX的问题——如果我设置rotationX,其他什么都不会改变。但是,如果我设置rotationY或rotationZ,所有旋转值都会改变,这对我的应用程序来说是一个问题(它试图保存和恢复值)。
我想我只是对Matrix3D 的情况缺乏一些了解。我如何实现这一点以使值之间不存在相互依赖?
I am trying to rotate a Sprite in three dimensions around its centerpoint, and I am struggling to understand some of the behavior of matrix3D.
Ive overridden the set rotationX, rotationY, and rotationZ methods of the Sprite as follows:
override public function set rotationX (_rotationX:Number) : void {
this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
this.transform.matrix3D.prependRotation(-this.rotationX, Vector3D.X_AXIS);
this.transform.matrix3D.prependRotation(_rotationX, Vector3D.X_AXIS);
this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);
}
override public function set rotationY (_rotationY:Number) : void {
this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
this.transform.matrix3D.prependRotation(-this.rotationY, Vector3D.Y_AXIS);
this.transform.matrix3D.prependRotation(_rotationY, Vector3D.Y_AXIS);
this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);
}
override public function set rotationZ (_rotationZ:Number) : void {
this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0);
this.transform.matrix3D.prependRotation(-this.rotationZ, Vector3D.Z_AXIS);
this.transform.matrix3D.prependRotation(_rotationZ, Vector3D.Z_AXIS);
this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0);
}
I am using prependTranslation to correct the centerpoint of the rotation, and the first prependRotation to cancel out any previously-applied rotation.
Testing it out, rotationX works exactly as expected, and the Sprite rotates around its horizontal axis.
rotationY and rotationZ also appear to work fine. However, there is one problem: whenever rotationY or rotationZ are set, all of the other rotation values change as well. This is not a problem with rotationX -- if I set rotationX, nothing else changes. But if I set rotationY or rotationZ all the rotation values change, which is a problem for my app (which is trying to save and restore values).
I think I am just lacking some understanding about what is going on with matrix3D. How can I implement this so there is no interdependence between the values?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
另一个简单的解决方案是添加对象并将其置于容器精灵中的中心,并对包含的精灵进行 3D 转换。
Another easy solution is to add the object and center it within a container sprite and do the 3D transformations on the containing sprite.
我对 AS3 等一无所知。但只要看看你的代码,我想知道为什么你使用我理解的 x 和 y 值(宽度和高度)在 z 轴上进行平移。 z 轴不应该使用“深度”之类的东西来平移吗?
I know nothing about AS3 etc. But just looking at your code, I wonder why you translate on the z-axis using what I understand to be x and y values (width and height). Shouldn't the z-axis be translated using something like "depth"?
这很简单,你可以尝试使用下面的代码:
s是你的精灵,第三个参数
Vector3D
表示你的精灵的中心位置。上面的代码将使精灵旋转更多-1度。
This is very simple, you can try use the following code:
while s is your sprite, the third parameter,
Vector3D
indicate your sprite's center position.The Above code will make the sprite s rotate more -1 degree.