Panda3D/Manual/Controlar uma junta processualmente

Origem: Wikilivros, livros abertos por um mundo aberto.

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().