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