Вот что я хочу сделать:
Я хочу загрузить модель (скорее всего .3ds) в мой .swf и повернуть ее с помощью мыши.
Это работает отлично с первого взгляда, но есть проблема, переключение переключателей. Или сказать это по-другому:Вращение модели в Away3D
Представьте, что у нас есть модель в форме трубы. Если мы перетаскиваем мышь вправо, модель поворачивается вдоль своей оси X влево, мышь влево, поворот оси X вправо, перемещение мыши вверх, вращение оси Y вниз, выведение мыши вниз, Y -Аксис вращается вверх.
Теперь, скажем, мы поворачиваем трубу вправо или влево, пока мы не столкнемся с (бывшей) «задней стороной» трубы, а затем мы сдвинем мышь вниз. Модель будет вращаться вниз, а не вверх.
Надеюсь, вы понимаете, что я имею в виду. Я давно оглядывался и не нашел удовлетворительного решения. Были разговоры о кватернионах, но я не могу их понять.
Другое предложение, которое я читаю, следующее:
создать объект Matrix3D, применить к нему поворот, а затем умножить его на желаемую матрицу 3D моей 3d-модели.
Я попытался это сделать, но результат остается тем же, направления поворотных переключателей в зависимости от того, с какой стороной я сталкиваюсь.
private function update(e:Event):void
{
xCalc = (0.3*(stage.mouseX - lastMouseX));
yCalc = (0.3*(stage.mouseY - lastMouseY));
if(move)
{
var objTransform:Matrix3D = new Matrix3D();
objTransform.prependRotation(xCalc, Vector3D.Y_Axis, objC.pivotPoint);
objTransform.prependRotation(yCalc, Vector3D.X_Axis, objC.pivotPoint);
mesh.transform = multiply3DMatrices(mesh.transform, objTransform);
}
lastMouseX = stage.mouseX;
lastMouseY = stage.mouseY;
view.render();
}
multiply3DMatrices просто умножает два матрица 4x4 вместе.
objC - объект ObjectContainer3D, который содержит мою модель. По какой-то причине я не могу правильно его повернуть, если только я не манипулирую свойствами rotationX/Y/Z.
сетка - это сетка внутри модели (которая очень проста, одна сетка).
Кроме того, я знаю, что я мог бы попробовать другую платформу для этого (например, papervision), но этот проект требует от меня использовать Away3D.
@bwroga Хорошо, я попробовал его с appendRotation вместо prependRotation в том же методе, но поведение по-прежнему остается таким же. – DodgerThud
Можете ли вы показать свой код, который превращает объект вправо или влево, что делает обратную сторону объекта лицевой стороной вперед? – bwroga
Собственно, вы смотрите на него. функция update (e) является слушателем для события Enter_Frame. Как только пользователь удерживает левую кнопку мыши, логическое имя «move» получает значение true и начинается манипуляция с матрицей. – DodgerThud