PDA

View Full Version : rotate object in relation of sth. else


Penguin
05-05-2009, 02:49 AM
Probably a simple question:

How do I rotate an object (node3d) in relation to another objects local coordinate system?

For instance, I want to relatively rotate object1 by 1 degree in relation to the z-axis of object2s local coordinate system (roll of 1 degree according to object2).

In another example I want to relatively rotate object1 by 1 degree in relation to the main view (roll of 1 degree according to main view).

farshizzo
05-05-2009, 12:47 PM
You can use the matrix.preEuler methods to rotate objects relative to arbitrary coordinate frames. Here is how you would roll object1 relative to object2's coordinate frame:m = object2.getMatrix()
m.preEuler(0,0,1)
object1.setQuat(m.getQuat())You would use similar code to perform the rotation relative to the viewpoint by retrieving the matrix from the viz.MainView object.

Let me know if I misunderstood your question or you need more specific examples.

Penguin
05-05-2009, 11:45 PM
This is not exactly what I meant.

For illustrating I attached some screen shots:

Left picture:
Start position. object1 = blue torus, object2 = white torus)

Middle picture:
Your end position. Your code seems to copy the complete orientation of object2 to object1

Right picture:
Desired end position. I want to rotate object1 according to the orientation of object2. Kinda object1.setEuler([0,0,45],viz.REL_LOCAL_of_object2)

farshizzo
05-06-2009, 10:37 AM
Ok, it sounds like you want a hierarchical relationship between object1 and object2. In this case you would simply add object1 as a child to object2. When object2 is rotated, object1 will automatically rotate in object2's reference frame. If for some reason you don't want a to use a hierarchical relationship, then here is some code to manually compute the matrix:euler = viz.Matrix.euler(0,0,roll)
m1 = object1.getMatrix()
m2 = object2.getMatrix()

diff = m1 * m2.inverse()

m2new = euler * m2
object2.setQuat(m2new.getQuat())
object1.setMatrix(diff * m2new)

Gladsomebeast
05-06-2009, 12:05 PM
Me gusta el code. Porque yo tengo code similar, pero esto code es mas fácil.

También, Penguin usted puede utilizar un objeto Link para esto, si no te gusta hierarchical.

farshizzo
05-06-2009, 12:16 PM
Vous êtes fou mec. J'ai comme vous, mais vous êtes fou.

Penguin
05-11-2009, 08:54 AM
Thank you, the code works best for me! I only did some minor changes: translating to origin before rotating:


euler = viz.Matrix.euler(0,0,roll)
m1 = object1.getMatrix()
m2 = object2.getMatrix()

m1.setTrans(0,0,0)
m2.setTrans(0,0,0)

diff = m1 * m2.inverse()

m2new = euler * m2
object2.setQuat(m2new.getQuat())
m1new = diff * m2new
m1new.setTrans(object1.getPosition(viz.ABS_GLOBAL) )
object1.setMatrix(m1new)