WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   rotate object in relation of sth. else (https://forum.worldviz.com/showthread.php?t=1998)

Penguin 05-05-2009 02:49 AM

rotate object in relation of sth. else
 
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:
Code:

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

3 Attachment(s)
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:
Code:

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:

Code:

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)



All times are GMT -7. The time now is 09:17 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC