示例#1
0
        public Mesh CreateMesh()
        {
            if (m_positioins.Any(x => float.IsNaN(x.X) || float.IsNaN(x.Y) || float.IsNaN(x.Z)))
            {
                throw new Exception();
            }

            var mesh = new Mesh();

            mesh.VertexBuffer = new VertexBuffer();
            mesh.VertexBuffer.Add(VertexBuffer.PositionKey,
                                  m_positioins.ToArray());

            mesh.VertexBuffer.Add(VertexBuffer.JointKey,
                                  m_boneWeights.Select(x => new SkinJoints(
                                                           (ushort)x.boneIndex0,
                                                           (ushort)x.boneIndex1,
                                                           (ushort)x.boneIndex2,
                                                           (ushort)x.boneIndex3)).ToArray());

            mesh.VertexBuffer.Add(VertexBuffer.WeightKey,
                                  m_boneWeights.Select(x => new Vector4(
                                                           x.weight0,
                                                           x.weight1,
                                                           x.weight2,
                                                           x.weight3
                                                           )).ToArray());

            mesh.IndexBuffer = BufferAccessor.Create(m_indices.ToArray());

            mesh.Submeshes.Add(new Submesh(0, mesh.IndexBuffer.Count, null));

            return(mesh);
        }
示例#2
0
        public static Mesh CreateQuadrangle()
        {
            var mesh = new Mesh();

            mesh.IndexBuffer  = BufferAccessor.Create(new int[] { 0, 1, 2, 2, 3, 0 });
            mesh.VertexBuffer = new VertexBuffer();
            mesh.VertexBuffer.Add(VertexBuffer.PositionKey, new Vector3[] {
                new Vector3(-1, 1, 0),
                new Vector3(1, 1, 0),
                new Vector3(1, -1, 0),
                new Vector3(-1, -1, 0),
            });
            mesh.VertexBuffer.Add(VertexBuffer.TexCoordKey, new Vector2[] {
                new Vector2(0, 0),
                new Vector2(1, 0),
                new Vector2(1, 1),
                new Vector2(0, 1),
            });
            mesh.Submeshes.Add(new Submesh(0, 6, new Material("SCREEN")));
            return(mesh);
        }
示例#3
0
        /// <summary>
        /// モーションの基本姿勢を basePose ベースに再計算する
        ///
        /// basePose は Humanoid.CopyNodes が必用 !
        /// </summary>
        public Animation RebaseAnimation(Humanoid basePose)
        {
            var map           = NodeMap.ToDictionary(kv => kv.Key, kv => new List <Quaternion>());
            var hipsPositions = new List <Vector3>();

            foreach (var(seconds, keyframes) in KeyFramesGroupBySeconds())
            {
                // モーション適用
                SetTime(seconds);
                Root.CalcWorldMatrix();

                foreach (var keyframe in keyframes)
                {
                    if (!keyframe.Node.HumanoidBone.HasValue ||
                        keyframe.Node.HumanoidBone.Value == HumanoidBones.unknown)
                    {
                        continue;
                    }

                    // ローカル回転を算出する
                    var t        = basePose[keyframe.Node].Rotation;
                    var w        = keyframe.Node.Rotation;
                    var w_from_t = w * Quaternion.Inverse(t);

                    // parent
                    var key   = keyframe.Node.HumanoidBone.Value;
                    var curve = map[keyframe.Node];
                    if (key != HumanoidBones.hips)
                    {
                        if (basePose[key].Parent == null)
                        {
                            throw new Exception();
                        }
                        var parent_t        = basePose[key].Parent.Rotation;
                        var parent_w        = keyframe.Node.Parent.Rotation;
                        var parent_w_from_t = parent_w * Quaternion.Inverse(parent_t);

                        var r = Quaternion.Inverse(parent_w_from_t) * w_from_t;
                        curve.Add(r);
                    }
                    else
                    {
                        // hips
                        curve.Add(w_from_t);
                        hipsPositions.Add(keyframe.Node.Translation);
                    }
                }
            }

            var dst = new Animation(Name + ".tpose");

            foreach (var kv in map)
            {
                if (!kv.Value.Any())
                {
                    continue;
                }

                var bone = kv.Key.HumanoidBone.Value;

                var inCurve = NodeMap[kv.Key].Curves[AnimationPathType.Rotation].In;
                if (inCurve.Count != kv.Value.Count)
                {
                    throw new Exception();
                }

                var nodeAnimation = new NodeAnimation();
                nodeAnimation.Curves.Add(AnimationPathType.Rotation, new CurveSampler
                {
                    In  = inCurve,
                    Out = BufferAccessor.Create(kv.Value.ToArray()),
                });
                if (bone == HumanoidBones.hips)
                {
                    nodeAnimation.Curves.Add(AnimationPathType.Translation, new CurveSampler
                    {
                        In  = inCurve,
                        Out = BufferAccessor.Create(hipsPositions.ToArray()),
                    });
                }
                dst.AddCurve(kv.Key, nodeAnimation);
            }
            return(dst);
        }
示例#4
0
 public static void Add <T>(this VertexBuffer v, string key, T[] list) where T : struct
 {
     v.Add(key, BufferAccessor.Create(list));
 }