Panda3D/Manual/Controlar uma junta processualmente
As vezes voce podere querer tomar controle procedualmente de uma junta do modelo. Por exemplo, se você desejar forçar os olhos do modelo do personagem a seguir o mouse, você vai precisar tomar controle procedula do pescoço e da cabeça. Para conseguir isso, use ControlJoint.
meuNodePath = actor.controlJoint(None,"modelRoot","Joint Name")
Isso cria um nodo burro. A cada frame, a transformação é copiada do nodo burro para a joint. Ao setar o transform do nodo dummy, voce pode controlar aquela junta. Normalmente voce poderia querer usar setHpr para rotacionar a junta sem a mover. O nodo burro é inicializado de tal forma que a junta não está na sua locação padrão, a especificada no arquivo egg.
Você precisa armazenar a local( não a global ) transform no nodo burro. em outras palavras, o transform é relativo ao osso pai da junta. Se voce está controlando um antebraço de um modelo, por exemplo, o transform será relativo ao braço superior.
A string "modelRoot" represente o nome do nodo do modelo - a string "modelRoot" é normalmente o valor correto.
A string "Joint Name" representa o nome da junta. Tipicamente seria algo como "Femur", ou "Pescoço" ou "Dedo1 L". Isso é usualmente configurado dentro do pacote de modelagem( ex: blender ). Por eemplo, no MAX, cada objeto na cena tem um nome, incluindo os ossos. Se necessário, você pode determinar o nome da junta varrendo o arquivo egg por strings como <Junta> Femur. Voce tambem pode usar a chamada actor.listJoints() para mostrar a hierarquia completa de juntas.
Precauções e limitações:
Antes do Panda3D versão 1.5, existiam varias limitações importantes ao controlJoint(). Essas limitações foram levantadas como sendo do panda3d ver 1.5
* Em versões anteriores do panda, controlJoint apenas funcionava quando uma animação estava tocando em uma junta. Isso não é mais verdade; controlJoint agora têm efeito esteja a animação tocando ou não. * Era importante fazer todas as suas chamadas controlJoints() para um modelo particular antes de voce realizar a primeira chamada de play(), loop() ou pose(). Isso não é mais necessário; voce pode chamar controlJoint() á qualquer momento. * Em versões anteriores do panda, controlJoint não poderia ser desfeito. Começando no Panda versao 1.5, você pode chamar releaseJoint("modelRoot", "Joint Name") para desfazer chamadas previas do controlJoint().