Я пытаюсь повернуть Sprite в трех измерениях вокруг его centerpoint, и я изо всех сил пытаюсь понять часть поведения matrix3D.
Я переопределил набор rotationX, rotationY, и методы вращений 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 для исправления centerpoint вращения и первого prependRotation для уравновешивания любого ранее примененного вращения.
Проверение его, rotationX работы точно как ожидалось и Sprite вращается вокруг его горизонтальной оси.
rotationY и вращения также, кажется, хорошо работают. Однако существует одна проблема: каждый раз, когда rotationY или вращения установлены, все другое изменение значений вращения также. Это не проблема с rotationX - если я установил rotationX, ничто иное не изменяется. Но если я установил rotationY или вращения все изменение значений вращения, которое является проблемой для моего приложения (который пытается сохранить и восстановить значения).
Я думаю, что просто испытываю недостаток в некотором понимании о том, что продолжает matrix3D. Как я могу реализовать это, таким образом, нет никакой взаимозависимости между значениями?
Еще одно простое решение - добавить объект и центрировать его внутри спрайта-контейнера, а также выполнить 3D-преобразования на содержащем его спрайте.
Я ничего не знаю об AS3 и т. Д. Но просто глядя на ваш код, мне интересно, почему вы переводите по оси z, используя то, что я понимаю как значения x и y (ширина и высота). Разве не следует переводить ось Z, используя что-то вроде «глубины»?