0

这就是我想要做的:
我想将模型(很可能是 .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。

4

1 回答 1

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。

于 2013-09-26T13:19:56.873 回答