Как сделать 3D вращение вокруг центра в AS3 с помощью matrix3D? - PullRequest
8 голосов
/ 15 декабря 2009

Я пытаюсь вращать Спрайта в трех измерениях вокруг его центральной точки, и я изо всех сил пытаюсь понять некоторые особенности поведения matrix3D.

Я переопределил заданные методы вращения X, вращение Y и вращение Z в Sprite следующим образом:

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, чтобы отменить любое ранее примененное вращение.

Проверяя это, вращение X работает точно так, как и ожидалось, и Sprite вращается вокруг своей горизонтальной оси.

вращение Y и вращение Z также работают нормально. Однако есть одна проблема: всякий раз, когда установлены вращение Y или вращение Z, все другие значения вращения также меняются. Это не проблема с вращением X - если я установлю вращение X, больше ничего не изменится. Но если я установлю вращение Y или вращение Z, все значения вращения изменятся, что является проблемой для моего приложения (которое пытается сохранить и восстановить значения).

Я думаю, что мне просто не хватает понимания того, что происходит с matrix3D. Как я могу реализовать это, чтобы не было взаимозависимости между значениями?

Ответы [ 3 ]

3 голосов
/ 11 августа 2010

Другое простое решение - добавить объект и центрировать его внутри спрайта контейнера и выполнить трехмерные преобразования на содержащем спрайте.

1 голос
/ 13 июля 2010

Я ничего не знаю об AS3 и т. Д. Но просто глядя на ваш код, я удивляюсь, почему вы переводите по оси z, используя, как я понимаю, значения x и y (ширина и высота). Разве ось z не должна быть переведена с использованием чего-то вроде «глубины»?

0 голосов
/ 03 июня 2015

Это очень просто, вы можете попробовать использовать следующий код:

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

пока s - ваш спрайт, третий параметр, Vector3D указывает на центральное положение вашего спрайта.

Код выше заставит спрайт вращаться более -1 градус.

...