2009-12-14 30 views
8

Tôi đang cố gắng xoay một Sprite theo ba chiều xung quanh điểm giữa của nó, và tôi đang đấu tranh để hiểu một số hành vi của matrix3D.làm thế nào để làm xoay vòng 3D xung quanh trung tâm trong AS3 sử dụng matrix3D?

Ive ghi đè các thiết lập phương pháp rotationX, rotationY, và rotationZ của Sprite như sau:

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); 

} 

Tôi đang sử dụng prependTranslation để sửa như trung tâm của vòng quay, và prependRotation đầu tiên để hủy bỏ ra bất kỳ previously- áp dụng xoay.

Thử nghiệm nó ra, rotationX hoạt động chính xác như mong đợi và Sprite xoay quanh trục ngang của nó.

rotationY and rotationZ cũng có vẻ hoạt động tốt. Tuy nhiên, có một vấn đề: bất cứ khi nào rotationY hoặc rotationZ được thiết lập, tất cả các giá trị luân phiên khác cũng thay đổi. Đây không phải là vấn đề với rotationX - nếu tôi đặt rotationX, không có gì khác thay đổi. Nhưng nếu tôi đặt rotationY hoặc rotationZ thì tất cả các giá trị xoay sẽ thay đổi, đây là một vấn đề đối với ứng dụng của tôi (đó là cố gắng lưu và khôi phục các giá trị).

Tôi nghĩ rằng tôi chỉ thiếu một số hiểu biết về những gì đang xảy ra với matrix3D. Làm thế nào tôi có thể thực hiện điều này để không có sự phụ thuộc lẫn nhau giữa các giá trị?

+0

điều tốt nhất là kiểm tra [UIComponent # transformAround] (http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/projects/framework/src/mx/core/UIComponent.as) và triển khai AdvancedLayout.as có liên quan. Họ làm chính xác điều đó, gói Matrix3D. –

+0

Không tìm kiếm thông qua mã của bạn, nhưng bạn có đang sử dụng Khóa Gimbal không? http://en.wikipedia.org/wiki/Gimbal_lock –

Trả lời

3

Một giải pháp dễ dàng khác là thêm đối tượng và căn giữa đối tượng đó vào trong vùng chứa thùng chứa và thực hiện phép biến đổi 3D trên sprite chứa.

+0

yeh điều này dễ dàng hơn nhiều. tạo một chủ Sprite, sau đó thêm Sprite với x: -mysprite.width * 0.5 và y: -mysprite.height * 0.5 và sau đó xoay chủ sở hữu – daidai

1

Tôi không biết gì về AS3 vv Nhưng chỉ nhìn vào mã của bạn, tôi tự hỏi tại sao bạn dịch trên trục z sử dụng những gì tôi hiểu là giá trị x và y (chiều rộng và chiều cao). Không nên trục z dịch bằng cách sử dụng một cái gì đó như "chiều sâu"?

0

này rất đơn giản, bạn có thể thử sử dụng đoạn mã sau:

var matrix3d:Matrix3D = s.transform.matrix3D; 
matrix3d.appendRotation(-1, Vector3D.Z_AXIS , new Vector3D(390, 360, 0)); 

khi s là sprite của bạn, tham số thứ ba, Vector3D chỉ ra vị trí trung tâm của sprite của bạn.

Mã trên sẽ làm cho các sprite xoay vòng hơn -1 độ.

Các vấn đề liên quan