View Single Post
  #2  
Old 07-07-2008, 11:34 AM
farshizzo farshizzo is offline
WorldViz Team Member
 
Join Date: Mar 2003
Posts: 2,849
I created a simple BonePointer class that allows you to specify a bone and where to point it at. This example will create an avatar and have it point its right arm towards the viewpoint. Let me know if anything is unclear.
Code:
import viz
viz.go()

class BonePointer(object):
	"""Class for pointing a bone at a specified point"""
	def __init__(self,bone,offset=None):
		
		self._node = viz.addGroup()
		self._node.visible(0)
		
		self._bone = bone
		
		#Get offset matrix to child bone
		if offset is None:
			srcPos = bone.getPosition(viz.AVATAR_LOCAL)
			dstPos = bone.getChildren()[0].getPosition(viz.AVATAR_LOCAL)
			self._node.setPosition(srcPos)
			self._node.lookat(dstPos)
			self._offset = viz.Matrix.quat(self._node.getQuat())
		else:
			self._offset = viz.Matrix(offset)
		self._offset.invert()
	
	def pointAt(self,pos):
		"""Point the bone at the specified position"""
		srcPos = self._bone.getPosition(viz.AVATAR_WORLD)
		self._node.setPosition(srcPos)
		self._node.lookat(pos)
		m = viz.Matrix.quat(self._node.getQuat())
		m.preMult(self._offset)
		self._bone.setQuat(m.getQuat(),viz.AVATAR_WORLD)
		
		
#Add avatar
model = viz.add('vcc_female.cfg',euler=(180,0,0))

#Create pointer object for shoulder bone
pointer = BonePointer(model.getBone('Bip01 R UpperArm'))

#Setup timer to update pointer every frame
def UpdatePointer():
	pointer.pointAt(viz.MainView.getPosition())
vizact.ontimer(0,UpdatePointer)
Reply With Quote