在Away3D中旋转模型

时间:2013-09-26 12:04:16

标签: actionscript-3 rotation away3d

这是我想做的事:
我想将模型(很可能是.3ds)加载到我的.swf中,并能够用鼠标旋转它。
乍一看这很好用,但是有问题,旋转“切换”了。或者换句话说:

想象一下,我们有一个管道形状的模型。 如果我们将鼠标向右拖动,模型沿其X轴向左旋转,鼠标向左旋转,X轴向右旋转,向上移动鼠标,Y轴向下旋转,鼠标向下旋转,Y-轴向上旋转。
现在,让我们说我们将管道向右或向左转,直到我们面对管道的(前)“后侧”,然后我们将鼠标向下移动。模型将向下旋转而不是向上旋转。

我希望你理解我的意思。我一直在寻找一段时间,从未找到令人满意的解决方案。有关四元数的讨论,但我无法掌握它们 我在某处读到的另一个建议如下:
创建一个Matrix3D对象,对其应用旋转,然后将其与我的3D模型所需的Matrix3D相乘。

我试过这样做,但结果保持不变,旋转方向根据我所面对的方向而改变。

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。

1 个答案:

答案 0 :(得分: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。