Question

Here's what i want to do:
I want to load a model (most likely .3ds) into my .swf and be able to rotate it with the mouse.
This works fine at first glance, but there's problem, the rotations 'switch' over. Or to say it differently:

Imagine we have a model in the shape of a pipe. If we drag the mouse to the right, the model rotates along its X-Axis to the left, mouse to the left, X-Axis rotation to the right, moving the mouse up, Y-Axis rotation downward, mouse down, Y-Axis rotation upward.
Now, lets say we turn the pipe to the right or left, until we face the (former) 'backside' of the pipe, and then we move the mouse down. The model will rotate downward instead of upward.

I hope you understand what i mean with this. I've been looking around for a good while now and never found a satisfying solution. There was talk about quaternions, but i can't grasp them.
Another suggestion i read somewhere is the following:
create a Matrix3D object, apply rotation on it, then multiply it with the desired Matrix3D of my 3d-Model.

I tried to do it, but the result stays the same, the directions of rotation switches depending on what side i'm facing.

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 simply multiplies two 4x4 Matrices together.

objC is the ObjectContainer3D that holds my model. For some reason i cannot rotate it properly, unless i manipulate the rotationX/Y/Z properties.

mesh is the mesh inside of the Model (which is very simple, a single mesh).

Also, i'm aware that i could try another Framework for this (like papervision) but this project requires me to use Away3D.

Was it helpful?

Solution

Solved it by myself, the problem was that i created a new Matrix3D Object every time. The fixed code looks like this:

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;
    }
    ...
 }

And yes, the user bwroga was actually right, i should've used appendRotation instead of prependRotation, as well.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top