Weeve Ferrelaine
Weeve Ferrelaine

Reputation: 713

How do I rotate in object space in 3D (using Matrixes)

what I am trying to do is to set up functions that can perform global and object space rotations, but am having problems understand how to go about object space rotations, as just multiplying a point by the rotation only works for global space, so my idea was to build the rotation in object space, then multiply it by the inverse of the objects matrix, supposedly taking away all the excess rotation between object and global space, so still maintaining the object space rotation, but in global values, I was wrong in this logic, as it did not work, here is my code, if you want to inspect it, all functions it calls have been tested to work:

// build object space rotation
sf::Vector3<float> XMatrix (MultiplyByMatrix(sf::Vector3<float> (cosz,sinz,0)));
sf::Vector3<float> YMatrix (MultiplyByMatrix(sf::Vector3<float> (-sinz,cosz,0)));
sf::Vector3<float> ZMatrix (MultiplyByMatrix(sf::Vector3<float> (0,0,1)));

// build cofactor matrix
sf::Vector3<float> InverseMatrix[3];
CoFactor(InverseMatrix);

// multiply by the transpose of the cofactor matrix(the adjoint), to bring the rotation to world space coordinates
sf::Vector3<float> RelativeXMatrix = MultiplyByTranspose(XMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);
sf::Vector3<float> RelativeYMatrix = MultiplyByTranspose(YMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);
sf::Vector3<float> RelativeZMatrix = MultiplyByTranspose(ZMatrix, InverseMatrix[0], InverseMatrix[1], InverseMatrix[2]);

// perform the rotation from world space
PointsPlusMatrix(RelativeXMatrix, RelativeYMatrix, RelativeZMatrix);

Upvotes: 0

Views: 3747

Answers (1)

comingstorm
comingstorm

Reputation: 26117

The difference between rotation in world-space and object-space is where you apply the rotation matrix.

The usual way computer graphics uses matrices is to map vertex points:

  • from object-space, (multiply by MODEL matrix to transform)
  • into world-space, (then multiply by VIEW matrix to transform)
  • into camera-space, (then multiply by PROJECTION matrix to transform)
  • into projection-, or "clip"- space

Specifically, suppose points are represented as column vectors; then, you transform a point by left-multiplying it by a transformation matrix:

world_point = MODEL * model_point
camera_point = VIEW * world_point = (VIEW*MODEL) * model_point
clip_point = PROJECTION * camera_point = (PROJECTION*VIEW*MODEL) * model_point

Each of these transformation matrices may itself be the result of multiple matrices multiplied in sequence. In particular, the MODEL matrix is often composed of a sequence of rotations, translations, and scalings, based on a hierarchical articulated model, e.g.:

MODEL = STAGE_2_WORLD * BODY_2_STAGE *
  SHOULDER_2_BODY * UPPERARM_2_SHOULDER *
  FOREARM_2_UPPERARM * HAND_2_FOREARM

So, whether you are rotating in model-space or world-space depends on which side of the MODEL matrix you apply your rotation matrix. Of course, you can easily do both:

MODEL = WORLD_ROTATION * OLD_MODEL * OBJECT_ROTATION

In this case, WORLD_ROTATION rotates about the center of world-space, while OBJECT_ROTATION rotates about the center of object-space.

Upvotes: 4

Related Questions