Rotation and Translation
Practical Exercises (Part II)

# Finish Part I

If you haven't already, finish part I of this assignment. This assignment contains a solution to part I, so you should be sure to finish that assignment before starting this one!

First, download Translate2.zip, and unzip it. Open up the solution Translate, compile, and run. You should see 3 cubes orbiting each other, and a red crosshair, as follows:

You can move and the crosshair around using the arrow keys (left/right and up/down) and the keys a and s (forward and backward) and the keys q, w, and e (yaw / pitch / roll)

. If you press the 1, 2, or 3 keys, then the world position and orientation of the crosshair will be sent to the corresponding object, calling the methods "setPositionFromWorldPostion" and "setOrientationFromWorldOrentation". Right now, the 1, 2, and 3 keys do nothing, since those methods have yet to be written!

# Local space to parent space, Parent space to local space

Let's assume we have two objects, Object 1 and Object 2. We have the position and orientation of Object 1 in world space (as a rotational matrix M1 and vector p1) and the position and orientation of Object 2 in Object 1's space (as a rotational matrix matrix M2 and vector p2). That is, M2 and p2 are relative to the position and orientation of Object 1.

When it is time to render Object 2 to the screen, we will need its position and orientation in world space. How can we get the position and orientation of Object 2 in world space? By using the position and orientation of Object 1 as follows (assuming column major matrices and column vectors):

• Position of Object 2 in World space p2world = M1p2 + p1
• Orientation of Object 2 in World space: M1M2

what if we have the position and rotation of Object 2 in world space, and we want the position and rotation of Object 2 in local space (that is, relative to Object 1)? Well, from above we have we have p2world = M1p2 + p1, so with a little algebra we get:
p2world = M1p2 + p1
p2world - p1= M1 p2
M1-1(p2world - p1) = M1-1 M1 p2
M1-1(p2world - p1) = p2

where M-1 is the inverse of the matrix M. As it turns out, finding the inverse of a rotational matrix is very easy: the inverse of a rotational matrix is just its transpose. That is, for a rotational matrix M, M-1 = MT.

We can get the transpose of an Ogre::Matrix3 using the transpose method:
```Ogre::Matrix3 rotationalMatrix;
// Code to create rotational matrix ...
Ogre::Matrix3 inverse = rotationalMatrix.Transpose()
```

## Object parented to objects parented to objects ...

We can repeat this process as many times as we like. For instance, if we have the position and orientation of Object 1 world space, and the position and orientation of Object 2 relative to Object 1, and the position and orientation of Object 3 relative to object 2, then:
• Position of Object 3 in world space: M1(M2p3 + p2) + p1
• Orientation of Object 3 in world space: M1 M2M3

Of course, we can use similar logic to go from the world space back to local space as well ...

# What to do

Ready to get to work? Here we go!

• `void setPositionFromWorldPosition(Ogre::Vector3 worldPosition)`
• ` void setOrentationFromWorldOrientation(Ogre::Matrix3 worldOrientation)`