![]() |
#1
|
|||
|
|||
animate cal3d bones
Hi all,
What I have is a cal3d avatar with a peoplemaker morph (for a talking mouth). The avatar has to perform an animation: lean forward - back the origin - lean backward back to origin - lean left - back to origin - lean right and back to origin. The bone that I want to rotate is one of the spineBones. This is the code-part where i'm talking about: Code:
viz.starttimer(TIMER_BODY_MOVEMENT, .03, 1) def onTimerEvent(id) : if id == TIMER_BODY_MOVEMENT : spine02.rotate(10,0,0) viz.callback(viz.TIMER_EVENT,onTimerEvent) How can I make this a smooth animation? Thanks! Last edited by krimble; 01-09-2008 at 05:41 AM. |
#2
|
|||
|
|||
Anybody?
Shorter question: How do I animate a cal3d bone. ( not the neckBone )? Thanks! |
#3
|
|||
|
|||
I've attached a sample script that creates a custom vizact action that animates a bone. The code at the bottom of the script shows how to use the action. This action will be included in the vizact library in the next release of Vizard. Let me know if anything is unclear.
Code:
import viz viz.go() """ Code for creating action that animates a bone rotating """ _paramval_ = vizact._paramval_ _paramlist_ = vizact._paramlist_ VizCubicQuatInterpolator = vizact.VizCubicQuatInterpolator VizLinearQuatInterpolator = vizact.VizLinearQuatInterpolator def boneSpinTo(bone,mode=viz.ABS_PARENT,quat=None,euler=None,axisAngle=None,speed=None,time=None,p1=None,p2=None): bla = viz.ActionData() bla.bone = bone bla.mode = mode bla.speed = speed bla.time = time bla.quat = quat bla.euler = euler bla.axisAngle = axisAngle bla.p1 = p1 bla.p2 = p2 bla.actionclass = VizBoneSpintToAction return bla class VizBoneSpintToAction(viz.ActionClass): def begin(self,object): self.elapsed = 0.0 self.duration = 0.0 #If bone is not a Vizard bone object, assume it is string and get bone from name bone = _paramval_(self._actiondata_.bone,object) if isinstance(bone,viz.VizBone): self.bone = bone else: self.bone = object.getBone(bone) #Make sure bone is valid if not self.bone: self.end(object) return #Lock the bone for animating self.bone.lock() #Get coordinate frame mode for bone rotations self.mode = _paramval_(self._actiondata_.mode,object) #Get begin and end rotation beginQuat = self.bone.getQuat(self.mode) if self._actiondata_.quat is not None: self.endQuat = _paramlist_(self._actiondata_.quat,object) elif self._actiondata_.euler is not None: self.endQuat = vizmat.EulerToQuat(_paramlist_(self._actiondata_.euler,object)) elif self._actiondata_.axisAngle is not None: self.endQuat = vizmat.AxisAngleToQuat(_paramlist_(self._actiondata_.axisAngle,object)) else: self.end(object) return #Compute whether animation duration is based on time or speed speed = _paramval_(self._actiondata_.speed,object) time = _paramval_(self._actiondata_.time,object) if time is not None: self.duration = time elif speed is not None: self.duration = vizmat.QuatDiff(beginQuat,self.endQuat) / speed #Make sure duration is valid if self.duration <= 0.0: self.bone.setQuat(self.endQuat,self.mode) self.end(object) return #Check if we are using linear or cubic interpolation p1 = _paramlist_(self._actiondata_.p1,object) p2 = _paramlist_(self._actiondata_.p2,object) if p1[0] is not None and p2[0] is not None: interpolator = VizCubicQuatInterpolator(p1[0],p2[0]) else: interpolator = VizLinearQuatInterpolator() interpolator.init(beginQuat,self.endQuat) self.interpolate = interpolator.interpolate def update(self,elapsed,object): self.elapsed += elapsed p = self.elapsed / self.duration if p >= 1.0: self._overtime_ = self.elapsed - self.duration self.bone.setQuat(self.endQuat,self.mode) self.end(object) return self.bone.setQuat(self.interpolate(p),self.mode) model = viz.add('vcc_female.cfg',pos=(0,0,5),euler=(180,0,0)) lookRight = boneSpinTo('Bip01 Spine1',mode=viz.AVATAR_LOCAL,euler=(45,0,0),speed=90) lookLeft = boneSpinTo('Bip01 Spine1',mode=viz.AVATAR_LOCAL,euler=(-45,0,0),speed=90) vizact.onkeydown(viz.KEY_RIGHT,model.runAction,lookRight,pool=1) vizact.onkeydown(viz.KEY_LEFT,model.runAction,lookLeft,pool=1) |
#4
|
|||
|
|||
Thanks man!!!
I'll take a look at it as soon i've got the time. |
#5
|
|||
|
|||
Example request for vizact.boneSpinTo()
I noticed that for the Q1 2008 Release of Vizard, vizact.boneSpinTo() is listed as an addition.
vizact.boneSpinTo() action for animating avatar bones I am running vizard_3.00.2701. I cannot find any additional information about vizact.boneSpinTo() in the Help Documentation. Can someone please post an example of how to use vizact.boneSpinTo() without including the sample script as posted above? For now I'm using the sample script but more condensed code would be preferable. Thanks! ~Karla |
#6
|
|||
|
|||
Here is a short sample:
Code:
lookLeft = vizact.boneSpinTo('Bip01 Head',mode=viz.AVATAR_LOCAL,euler=(-90,0,0),speed=90) avatar.runAction(lookLeft) Code:
<vizact>.boneSpinTo( bone mode = viz.ABS_PARENT quat = None # Keyword argument euler = None # Keyword argument axisAngle = None # Keyword argument speed = None # Keyword argument time = None # Keyword argument ) bone An Avatar bone object or the name of a bone. mode = viz.ABS_PARENT The transformation mode to apply the rotations with quat = None The quaternion rotation to spin to euler = None The euler rotation to spin to axisAngle = None The Axis-Angle rotation to spin to speed = None The speed to spin at in degrees/sec time = None The amount of time to spin for |
#7
|
|||
|
|||
Thank you!
I was working in a long file, which made troubleshooting more difficult than necessary. I made the following concise example and got it to work. With a more positive resolve, I was able to find my mistakes in the longer file. It's all working now. Thanks, Karla Code:
#****************************************************************************************** #****************************************************************************************** #Trying to use boneSpinTo with avatar in Art Gallery #Created: May 6th, 2008 #****************************************************************************************** #****************************************************************************************** import viz import viztask #For wait time viz.go() viz.MainView.setPosition(0,1.72,7.5) viz.MainView.setEuler(183,0,0) #Add an avatar male = viz.add('male.cfg'); male.translate(0.25,0,5.5); male.rotate(0,1,0,-3); male.state(1) #Start in neutral state animation face1 = male.face('biohead_talk.vzf') #add a face to the avatar #speed settings for boneSpinTo() headSpeed = 100 def SpinHeadLeft(): yield viztask.waitTime(2) #Wait 2 seconds lookleft = vizact.boneSpinTo('skel_Head',mode=viz.AVATAR_LOCAL,euler=(-90,0,0),speed=headSpeed) male.runAction(lookleft) viztask.schedule( SpinHeadLeft() ) #*********************************************************** #Adding a world #*********************************************************** room = viz.add('gallery.ive') # Load room.scale(1,1,1) # scale actual room.translate(0,0,0) ## position in the world |
![]() |
Thread Tools | |
Display Modes | Rate This Thread |
|
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
cal3d exporter issue | reiverlass | Vizard | 4 | 07-18-2007 12:08 PM |
importing avatars with cal3d | marcoleon | Vizard | 15 | 04-28-2006 04:48 PM |
importing cal3d in 3ds? | shai | Vizard | 1 | 11-01-2004 10:19 AM |
Using Cal3d Avatars | zachhendershot | Vizard | 4 | 01-27-2004 10:26 AM |
Linking avatar 'bones' to a position tracker. | zachhendershot | Vizard | 3 | 11-19-2003 09:26 PM |