#1
|
|||
|
|||
Using bone.lookat for bones other than head
Hi!
Is it possible to use bone.lookat for bones other than the head? I use the following code to always point the hand towards an object but it stays perpendicular! Code:
def lookAtBall(): bone = avatar.getBone('Bip01 L Forearm') bone.lock(); bone.lookat(ball.getPosition(),0,viz.ABS_GLOBAL) vizact.ontimer(.5,lookAtBall) Best, Omid Last edited by omidbrb; 02-27-2009 at 03:06 AM. |
#2
|
|||
|
|||
Here is the forearm added to an example that Farshizzo recently posted for using lookat. It works for other bones, I just had to subtract 90 degrees from the yaw value to make it look right.
Code:
import viz import vizact viz.go() viz.add('tut_ground.wrl') #Create animating ball ball = viz.add('white_ball.wrl') ball.add(vizact.sequence(vizact.goto(-2,1,0),vizact.goto(2,1,0),viz.FOREVER)) #Create male avatar avatar1 = viz.add('vcc_male.cfg',pos=(-2,0,3),euler=(180,0,0)) avatar1.state(1) head1 = avatar1.getBone('Bip01 Head') head1.lock() #Create female avatar avatar2 = viz.add('vcc_female.cfg',pos=(2,0,3),euler=(180,0,0)) avatar2.state(1) head2 = avatar2.getBone('Bip01 Head') forearm = avatar2.getBone('Bip01 R Forearm') head2.lock() def UpdateAvatarHead(): """Update avatars to look at ball position""" pos = ball.getPosition() head1.lookat(pos,0,viz.AVATAR_WORLD) head2.lookat(pos,0,viz.AVATAR_WORLD) forearm.lookat(pos,0,viz.AVATAR_WORLD) ori = forearm.getEuler(viz.AVATAR_WORLD) forearm.setEuler([ori[0] - 90, ori[1], ori[2]], viz.AVATAR_WORLD) vizact.ontimer(0,UpdateAvatarHead) viz.MainView.move(0,0,-5) |
#3
|
|||
|
|||
Hi,
Thanks for the example code. I added 60 degrees to the roll and now it looks better. I did the same experiment with left upper arm, and I had to make a different correction to make it right. My impression is that the lookat function makes the joint to look at a certain direction and the bone connected to the joint is not in 0 degrees relative to the joint. Am I right? Is it a way to find the exact corrections for each bone? The code below is the modified code: Code:
import viz import vizact viz.go() viz.add('tut_ground.wrl') #Create animating ball ball = viz.add('white_ball.wrl') ball.add(vizact.sequence(vizact.goto(1,1.3,2.5),vizact.goto(3,1.3,2.5),viz.FOREVER)) #Create male avatar avatar1 = viz.add('vcc_male.cfg',pos=(-2,0,3),euler=(180,0,0)) avatar1.state(1) head1 = avatar1.getBone('Bip01 Head') head1.lock() #Create female avatar avatar2 = viz.add('vcc_female.cfg',pos=(2,0,3),euler=(180,0,0)) avatar2.state(1) head2 = avatar2.getBone('Bip01 Head') forearm = avatar2.getBone('Bip01 R Forearm') arm = avatar2.getBone('Bip01 L UpperArm') head2.lock() def UpdateAvatarHead(): """Update avatars to look at ball position""" pos = ball.getPosition() head1.lookat(pos,0,viz.AVATAR_WORLD) head2.lookat(pos,0,viz.AVATAR_WORLD) forearm.lookat(pos,0,viz.AVATAR_WORLD) ori = forearm.getEuler(viz.AVATAR_WORLD) forearm.setEuler([ori[0] - 90, ori[1], ori[2]+60], viz.AVATAR_WORLD) arm.lookat(pos,0,viz.AVATAR_WORLD) ori = arm.getEuler(viz.AVATAR_WORLD) arm.setEuler([ori[0]+120, ori[1]+60, ori[2]+30], viz.AVATAR_WORLD) vizact.ontimer(0,UpdateAvatarHead) viz.MainView.move(2,0,-5) |
#4
|
|||
|
|||
It seems like the lookAt method takes the origin of the bone and has that look at the position you pass to it . If you want the end of the bone to look at something you may have to add some rotation to make it look right. Farshizzo, please correct me if I'm wrong about this.
|
#5
|
|||
|
|||
That's right, but since I need to control the bones precisely, I want to have the precise rotations that make the end of the bone point at a certain direction. Do you think it's possible?
|
#6
|
|||
|
|||
I not quite sure how to calculate the exact offsets for all the angles. Farshizzo's on vacation for a little while but I'm sure he'll have some idea when he gets back. Do you only need to do this for the arm bones?
|
#7
|
|||
|
|||
Interesting... What will you do with this, omidbrb?
Seems you could get the local bounding box of a bone, find the box face center point that is furthest from the bone origin, compute the angle between the bone's x-axis and the center point of the furthest box face, and rotate that angle difference after the lookat command.
__________________
Paul Elliott WorldViz LLC |
#8
|
|||
|
|||
Quote:
|
Thread Tools | |
Display Modes | Rate This Thread |
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Problems with getting head bone rotation right | Enlil | Vizard | 2 | 02-13-2009 10:24 AM |
Awkward neck/shoulder connection when adding custom head to vcc model. | vEsotu | Vizard | 5 | 10-09-2008 05:07 PM |
problems adding a custom morph head to a custom body | Greenwu | Vizard | 1 | 07-27-2006 10:32 AM |
avatar head texture issues | rconrey | Vizard | 3 | 11-17-2004 04:05 PM |
How to simply texture an avatar's head with a jpeg graphic? | vr_boyko | Vizard | 3 | 10-26-2004 10:44 AM |