Class: Bestguigui::GLTFSkeleton
- Inherits:
-
Object
- Object
- Bestguigui::GLTFSkeleton
- Defined in:
- lib/bestguigui_lab/gltf_skeleton.rb
Overview
Hierarchie de noeuds glTF (pose de repos + parente) et son unique skin (liste de joints + matrices d'inverse bind pose, deja decodees par GLTFModel) : calcule, a partir d'une pose partielle (cf. GLTFAnimator#pose), la matrice monde de chaque noeud puis la matrice de skinning finale de chaque joint pour un noeud de maillage donne.
Un seul skin gere (celui d'indice 0) : suffisant pour un personnage, pas pour plusieurs squelettes independants dans le meme fichier.
Defined Under Namespace
Classes: Node
Instance Method Summary collapse
-
#initialize(nodes_json, joints, inverse_bind_matrices, rigid: false) ⇒ GLTFSkeleton
constructor
rigid: true ignore la mise a l'echelle de CHAQUE noeud (pose de repos ET animee) — seules rotation et translation bougent les os.
-
#joint_matrices(pose, mesh_node_index) ⇒ Object
Une matrice de skinning par joint (meme ordre que WEIGHTS_0/ JOINTS_0), pour un maillage porte par le noeud mesh_node_index.
Constructor Details
#initialize(nodes_json, joints, inverse_bind_matrices, rigid: false) ⇒ GLTFSkeleton
rigid: true ignore la mise a l'echelle de CHAQUE noeud (pose de repos ET animee) — seules rotation et translation bougent les os. Utile pour un squelette assemble a la main a partir de petits morceaux, ou une mise a l'echelle (voulue ou juste un artefact d'export, ex. 0.999998 au lieu de 1) etirerait le maillage au lieu de simplement l'articuler.
21 22 23 24 25 26 27 28 29 |
# File 'lib/bestguigui_lab/gltf_skeleton.rb', line 21 def initialize(nodes_json, joints, inverse_bind_matrices, rigid: false) @nodes = nodes_json.map do |n| Node.new(n['translation'], n['rotation'], n['scale'], n['children'] || [], nil) end @nodes.each_with_index { |node, i| node.children.each { |c| @nodes[c].parent = i } } @joints = joints @inverse_bind_matrices = inverse_bind_matrices @rigid = rigid end |
Instance Method Details
#joint_matrices(pose, mesh_node_index) ⇒ Object
Une matrice de skinning par joint (meme ordre que WEIGHTS_0/ JOINTS_0), pour un maillage porte par le noeud mesh_node_index.
33 34 35 36 37 38 39 40 41 |
# File 'lib/bestguigui_lab/gltf_skeleton.rb', line 33 def joint_matrices(pose, mesh_node_index) world = world_matrices(pose) mesh_inverse = GLTFMath.invert(world[mesh_node_index]) @joints.each_with_index.map do |joint_node, i| skinned = GLTFMath.multiply(mesh_inverse, world[joint_node]) GLTFMath.multiply(skinned, @inverse_bind_matrices[i]) end end |