Class: Bestguigui::GLTFSkeleton

Inherits:
Object
  • Object
show all
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

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