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