#1




Quaternions
Hello, can anyone tell me the exact meaning of the [x,y,z,w] components of a quaternion returned by a .getQuat() function? I am particularly interested in the range these values can take, especially w.
This might seem like a silly question, but are the two quats returned in this script in the exact same format (i.e., same ordering of components, scaled in the same way, etc.)? Code:
... inertiaCube = viz.add('intersense.dls') # Add inertiaCube print inertiaCube.getQuat() # 1st quaternion vicon = viz.add('vicon.dle', 0, ipAddressAndPort) # Add the Vicon system firstBody = vicon.getBody(0) # Get the first body print firstBody.getQuat() # 2nd quaternion ... 
#2




The meaning of the x,y,z,w components of a quaternion are similar to the meaning of axisangle components. the [x,y,z] values represent the axis of rotation. The amount of rotation about that axis in radians is, 2 * acos(w). Keep in mind that Vizard uses a lefthanded coordinate system.
All the plugins should return quaternions in the same order (x,y,z,w). I'm assuming most devices will return normalized quaternions as well, but I'm not 100% sure about that. 
#4




All right, I've read QUITE A BIT about quaternions at this point but still don't get them ..
Here's some sample code. Copy/paste and run this: Code:
import viz viz.go(viz.FULLSCREEN) ROTATION_INC = 2 TRANSLATE_INC = 0.1 i = 0 while (i < 50): redBall = viz.add("white_ball.wrl") redBall.setPosition([i, 0, 0]) redBall.color([255, 0, 0]) greenBall = viz.add("white_ball.wrl") greenBall.setPosition([0, i, 0]) greenBall.color([0, 255, 0]) blueBall = viz.add("white_ball.wrl") blueBall.setPosition([0, 0, i]) blueBall.color([0, 0, 255]) i += 0.1 viz.MainView.setQuat([0,1,0,0]) viz.MainView.setPosition(5, 0, 0.5) vizact.whilekeydown(viz.KEY_UP, viz.move, 0, 0, TRANSLATE_INC) vizact.whilekeydown(viz.KEY_DOWN, viz.move, 0, 0, TRANSLATE_INC) vizact.whilekeydown(viz.KEY_LEFT, viz.rotate, viz.BODY_ORI, ROTATION_INC, 0, 0) vizact.whilekeydown(viz.KEY_RIGHT, viz.rotate, viz.BODY_ORI, ROTATION_INC, 0, 0) vizact.whilekeydown(viz.KEY_PAGE_UP, viz.rotate, viz.HEAD_ORI, 0, ROTATION_INC, 0) vizact.whilekeydown(viz.KEY_PAGE_DOWN, viz.rotate, viz.HEAD_ORI, 0, ROTATION_INC, 0) What this is meant to be is "training grounds" for understanding quaternions. If you look at the code inside the while loop you'll see that Xaxis is traced with red dots, Y with green, Z with blue (XYZ > RGB was my logic ). MainView's originally just slightly off red Yaxis and the rotation is set to [x,y,z,w] = [0,1,0,0]. What I'm trying to understand now that we have a welldefined system of coordinates right in front of us is how quaternions work: [0,1,0,0] SHOULD have defined a rotation of 0 degrees around axis [0,1,0]  the Yaxis, so the camera originally should just look down the green Yaxis. Instead we're looking down X! I hope someone more experienced with quaternions can explain to me how they work in Vizard using this simple script, that would be great. Thanks! Last edited by roman_suvorov; 06112008 at 06:38 PM. 
#5




In my previous post I explained what the values mean. So given the quaternion rotation of [0,1,0,0], this would mean a 180 degree rotation around the Y axis (2 * acos(0) = 180 degrees). Printing the euler and axisangle values of the main view after applying the quaternion will confirm this. Adding the following code at the end of the script:
Code:
print viz.MainView.getEuler() print viz.MainView.getAxisAngle() Code:
[180.0, 0.0, 0.0] [0.0, 1.0, 0.0, 180.0] 
#6




Damn, forgot about that acos. Then to get no rotation I need to use w=1: 2*acos(1) = 360 degrees. Thanks again farshizzo!
EDIT: The following code makes MainView look down X. Code:
import viz viz.go(viz.FULLSCREEN) ROTATION_INC = 2 TRANSLATE_INC = 0.1 i = 0 while (i < 10): redBall = viz.add("white_ball.wrl") redBall.setPosition([i, 0, 0]) redBall.color([1  0.1*i, 0, 0]) greenBall = viz.add("white_ball.wrl") greenBall.setPosition([0, i, 0]) greenBall.color([0, 1  0.1*i, 0]) blueBall = viz.add("white_ball.wrl") blueBall.setPosition([0, 0, i]) blueBall.color([0, 0, 1  0.1*i]) i += 0.1 viz.MainView.setQuat([0,1,0,1]) viz.MainView.setPosition(5, 0, 0.5) vizact.whilekeydown(viz.KEY_UP, viz.move, 0, 0, TRANSLATE_INC) vizact.whilekeydown(viz.KEY_DOWN, viz.move, 0, 0, TRANSLATE_INC) vizact.whilekeydown(viz.KEY_LEFT, viz.rotate, viz.BODY_ORI, ROTATION_INC, 0, 0) vizact.whilekeydown(viz.KEY_RIGHT, viz.rotate, viz.BODY_ORI, ROTATION_INC, 0, 0) vizact.whilekeydown(viz.KEY_PAGE_UP, viz.rotate, viz.HEAD_ORI, 0, ROTATION_INC, 0) vizact.whilekeydown(viz.KEY_PAGE_DOWN, viz.rotate, viz.HEAD_ORI, 0, ROTATION_INC, 0) Last edited by roman_suvorov; 06112008 at 07:10 PM. 
#7




Now you're dealing with nonnormalized quaternions, so all bets are off. In general, you don't need to deal with quaternions at such a low level. You can use Vizards matrix routines to deal with rotation transformations.

#8




Quote:
For example, add this function definition to my previous code: Code:
# Normalizes the passed quaternion (which is assumed to have the form # [x,y,z,w]) so that the vector [x,y,z,w] has unit length. # Note: normalization is done in place (i.e., the correct way # of calling this function is 'normalizeQuat(q1)' rather than 'q1 = normalizeQuat(q2)'. def normalizeQuat (quat): i = 0 normFactor = 0 while (i < len(quat)): normFactor += quat[i]**2 i += 1 normFactor = normFactor**0.5 i = 0 while (i < len(quat)): quat[i] /= normFactor i += 1 Unfortunately, seems like I do. This little script is just a way to fill in the gaps I have in my understanding of quaternions. 
#9




Yes, Vizard will internally normalize all quaternions that are passed to the setQuat function of nodes, views, and bones.

Thread Tools  
Display Modes  Rate This Thread 


Similar Threads  
Thread  Thread Starter  Forum  Replies  Last Post 
coalesceing euler angles  epl  Vizard  6  05282004 06:25 PM 
plugins that return quaternions  hotspur1  Vizard  2  02052004 08:47 PM 