private static float[] GetBindMatrix(FBXTreeNode node, List <PoseNode> poseNodes) { var result = new float[] { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; var pose = poseNodes.Where(a => a.Id == node.Node.Id && a.IsBindPose).FirstOrDefault(); // The bind pose is always a global matrix if (pose != null) { result = pose.Matrix; } /*var childNodes = node.Children.Where(a => a.Node.Name == "Model"); * * foreach (var child in childNodes) * result = GetBindMatrix(child, poseNodes).MatrixProduct(result);*/ return(result); }
public static Deformer FromTreeNode(FBXTreeNode node, List <PoseNode> poseNodes) { var deformer = new Deformer(node.Node); var model = node.Children.Where(a => a.Node.Name == "Model").FirstOrDefault(); deformer.BindPoseMatrix = GetBindMatrix(model, poseNodes); deformer.BoneId = model.Node.Id.ToString(); return(deformer); }
public List <Deformer> GetClusters(FBXTreeNode geometryNode) { var deformer = geometryNode.Children.Where(a => a.Node.Name == "Deformer").FirstOrDefault(); var clusters = new List <FBX.Deformer>(); if (deformer != null) { var subdeformersTree = deformer.Children.Where(a => a.Node.Name == "Deformer"); foreach (var tempNode in subdeformersTree) { clusters.Add(FBX.Deformer.FromTreeNode(tempNode, PoseNodes)); } } return(clusters); }
public FBXTreeNode(FBXFileNode node, FBXFile file, FBXTreeNode parent = null) { Node = node; var nodeId = (Node != null) ? Node.Id : 0; var nodeConns = file.Connections.Where(a => a.Dst == nodeId); foreach (var con in nodeConns) { var childNode = file.FindChild(con.Src); if (childNode != null) { Children.Add((new FBXTreeNode(childNode, file, this))); } } }