GetBoneByName() public method

public GetBoneByName ( string name ) : Bone
name string
return Bone
コード例 #1
0
        private void ConformAnimationBindPoses(Skeleton skeleton, Skeleton conformToSkeleton)
        {
            foreach (var trackGroup in Root.TrackGroups)
            {
                for (var i = 0; i < trackGroup.TransformTracks.Count; i++)
                {
                    var track = trackGroup.TransformTracks[i];
                    var bone  = skeleton.GetBoneByName(track.Name);
                    if (bone == null)
                    {
                        string msg = String.Format("Animation track references bone '{0}' that cannot be found in the skeleton.", track.Name);
                        throw new ExportException(msg);
                    }

                    var conformingBone = conformToSkeleton.GetBoneByName(track.Name);
                    if (conformingBone == null)
                    {
                        string msg = String.Format("Animation track references bone '{0}' that cannot be found in the conforming skeleton.", track.Name);
                        throw new ExportException(msg);
                    }

                    var keyframes = track.ToKeyframes();
                    keyframes.SwapBindPose(bone.OriginalTransform, conformingBone.Transform.ToMatrix4());
                    var newTrack = TransformTrack.FromKeyframes(keyframes);
                    newTrack.Flags                = track.Flags;
                    newTrack.Name                 = track.Name;
                    newTrack.ParentAnimation      = track.ParentAnimation;
                    trackGroup.TransformTracks[i] = newTrack;
                }
            }
        }
コード例 #2
0
        private void UpdateOBBs(Skeleton skeleton, Mesh mesh)
        {
            if (mesh.BoneBindings == null || mesh.BoneBindings.Count == 0)
            {
                return;
            }

            var obbs = new List <OBB>(mesh.BoneBindings.Count);

            for (var i = 0; i < mesh.BoneBindings.Count; i++)
            {
                obbs.Add(new OBB
                {
                    Min = new Vector3(1000.0f, 1000.0f, 1000.0f),
                    Max = new Vector3(-1000.0f, -1000.0f, -1000.0f),
                });
            }

            foreach (var vert in mesh.PrimaryVertexData.Vertices)
            {
                for (var i = 0; i < 4; i++)
                {
                    if (vert.BoneWeights[i] > 0)
                    {
                        var bi  = vert.BoneIndices[i];
                        var obb = obbs[bi];
                        obb.NumVerts++;

                        var bone = skeleton.GetBoneByName(mesh.BoneBindings[bi].BoneName);
                        var invWorldTransform = ColladaHelpers.FloatsToMatrix(bone.InverseWorldTransform);
                        var transformed       = Vector3.Transform(vert.Position, invWorldTransform);

                        obb.Min.X = Math.Min(obb.Min.X, transformed.X);
                        obb.Min.Y = Math.Min(obb.Min.Y, transformed.Y);
                        obb.Min.Z = Math.Min(obb.Min.Z, transformed.Z);

                        obb.Max.X = Math.Max(obb.Max.X, transformed.X);
                        obb.Max.Y = Math.Max(obb.Max.Y, transformed.Y);
                        obb.Max.Z = Math.Max(obb.Max.Z, transformed.Z);
                    }
                }
            }

            for (var i = 0; i < obbs.Count; i++)
            {
                var obb = obbs[i];
                if (obb.NumVerts > 0)
                {
                    mesh.BoneBindings[i].OBBMin = new float[] { obb.Min.X, obb.Min.Y, obb.Min.Z };
                    mesh.BoneBindings[i].OBBMax = new float[] { obb.Max.X, obb.Max.Y, obb.Max.Z };
                }
                else
                {
                    mesh.BoneBindings[i].OBBMin = new float[] { 0.0f, 0.0f, 0.0f };
                    mesh.BoneBindings[i].OBBMax = new float[] { 0.0f, 0.0f, 0.0f };
                }
            }
        }
コード例 #3
0
        private void ConformAnimationBindPoses(Skeleton skeleton, Skeleton conformToSkeleton)
        {
            if (Root.TrackGroups == null)
            {
                return;
            }

            foreach (var trackGroup in Root.TrackGroups)
            {
                for (var i = 0; i < trackGroup.TransformTracks.Count; i++)
                {
                    var track = trackGroup.TransformTracks[i];
                    var bone  = skeleton.GetBoneByName(track.Name);
                    if (bone == null)
                    {
                        //Dummy_Foot -> Dummy_Foot_01
                        bone = skeleton.GetBoneByName(track.Name + "_01");
                    }

                    if (bone == null)
                    {
                        throw new ExportException($"Animation track references bone '{track.Name}' that cannot be found in the skeleton '{skeleton.Name}'.");
                    }

                    var conformingBone = conformToSkeleton.GetBoneByName(bone.Name);
                    if (conformingBone == null)
                    {
                        throw new ExportException($"Animation track references bone '{bone.Name}' that cannot be found in the conforming skeleton '{conformToSkeleton.Name}'.");
                    }

                    var keyframes = track.ToKeyframes();
                    keyframes.SwapBindPose(bone.OriginalTransform, conformingBone.Transform.ToMatrix4());
                    var newTrack = TransformTrack.FromKeyframes(keyframes);
                    newTrack.Flags                = track.Flags;
                    newTrack.Name                 = track.Name;
                    newTrack.ParentAnimation      = track.ParentAnimation;
                    trackGroup.TransformTracks[i] = newTrack;
                }
            }
        }
コード例 #4
0
        private void ConformSkeletonAnimations(Skeleton skeleton)
        {
            if (Root.TrackGroups == null)
            {
                return;
            }

            foreach (var trackGroup in Root.TrackGroups)
            {
                foreach (var track in trackGroup.TransformTracks)
                {
                    var bone = skeleton.GetBoneByName(track.Name);
                    //Dummy_Foot -> Dummy_Foot_01
                    if (bone == null)
                    {
                        bone = skeleton.GetBoneByName(track.Name + "_01");
                    }
                    if (bone == null)
                    {
                        throw new ExportException($"Animation track references bone '{track.Name}' that cannot be found in the skeleton '{skeleton.Name}'.");
                    }
                }
            }
        }
コード例 #5
0
 private void ConformSkeletonAnimations(Skeleton skeleton)
 {
     foreach (var trackGroup in Root.TrackGroups)
     {
         foreach (var track in trackGroup.TransformTracks)
         {
             var bone = skeleton.GetBoneByName(track.Name);
             if (bone == null)
             {
                 string msg = String.Format("Animation track references bone '{0}' that cannot be found in the skeleton.", track.Name);
                 throw new ExportException(msg);
             }
         }
     }
 }