2013-09-26 4 views
0

Вот что я хочу сделать:
Я хочу загрузить модель (скорее всего .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.

+0

@bwroga Хорошо, я попробовал его с appendRotation вместо prependRotation в том же методе, но поведение по-прежнему остается таким же. – DodgerThud

+0

Можете ли вы показать свой код, который превращает объект вправо или влево, что делает обратную сторону объекта лицевой стороной вперед? – bwroga

+0

Собственно, вы смотрите на него. функция update (e) является слушателем для события Enter_Frame. Как только пользователь удерживает левую кнопку мыши, логическое имя «move» получает значение true и начинается манипуляция с матрицей. – DodgerThud

ответ

0

Решил сам по себе, проблема заключалась в том, что я каждый раз создавал новый объект Matrix3D. Фиксированный код выглядит следующим образом:

private function update(e:Event):void 
{ 
    ... 

    if(move) 
    { 
     var objTransform:Matrix3D = mesh.transform; 

     objTransform.appendRotation(xCalc, Vector3D.Y_Axis, objC.pivotPoint); 
     objTransform.appendRotation(yCalc, Vector3D.X_Axis, objC.pivotPoint); 

     mesh.transform = objTransform; 
    } 
    ... 
} 

И да, bwroga пользователь был на самом деле правильно, я должен был использоваться appendRotation вместо prependRotation, а также.

Смежные вопросы