#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 axis-angle 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 left-handed 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 X-axis is traced with red dots, Y with green, Z with blue (X-Y-Z -> R-G-B was my logic ). MainView's originally just slightly off red Y-axis 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 well-defined 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 Y-axis, so the camera originally should just look down the green Y-axis. 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; 06-11-2008 at 05: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 axis-angle 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; 06-11-2008 at 06:10 PM. |
#7
|
|||
|
|||
Now you're dealing with non-normalized 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.
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
coalesceing euler angles | epl | Vizard | 6 | 05-28-2004 05:25 PM |
plug-ins that return quaternions | hotspur1 | Vizard | 2 | 02-05-2004 07:47 PM |