Exemplo n.º 1
0
        private void UpdateLocalMatrix(BoneImage image)
        {
            image.LocalMatrix = MathUtil.QuaternionToMatrix4X4(image.TotalRotation);
            MathUtil.SetTransToMatrix4X4(image.TotalTranslation + image.LocalOffset, ref image.LocalMatrix);

            if (image.HasParent)
            {
                image.LocalMatrix = BoneImages[image.Parent].LocalMatrix * image.LocalMatrix;
            }
        }
Exemplo n.º 2
0
        public Poser(MmdModel model)
        {
            Model = model;
            /***** Create Pose Image *****/
            var vertexNum = model.Vertices.Length;
            //VertexImages = new Vector3[vertexNum];
            var boneNum = model.Bones.Length;

            BoneImages = new BoneImage[boneNum];
            for (var i = 0; i < boneNum; ++i)
            {
                BoneImages[i] = new BoneImage();
            }


            for (var i = 0; i < boneNum; ++i)
            {
                var bone = model.Bones[i];
                _boneNameMap[bone.Name] = i;
                var image = BoneImages[i];
                image.GlobalOffsetMatrix.m03    = -bone.Position[0];
                image.GlobalOffsetMatrix.m13    = -bone.Position[1];
                image.GlobalOffsetMatrix.m23    = -bone.Position[2];
                image.GlobalOffsetMatrixInv.m03 = bone.Position[0];
                image.GlobalOffsetMatrixInv.m13 = bone.Position[1];
                image.GlobalOffsetMatrixInv.m23 = bone.Position[2];
                image.Parent = bone.ParentIndex;
                if (image.Parent < boneNum && image.Parent >= 0)
                {
                    image.HasParent   = true;
                    image.LocalOffset = bone.Position - model.Bones[image.Parent].Position;
                }
                else
                {
                    image.HasParent   = false;
                    image.LocalOffset = bone.Position;
                }

                image.AppendRotate    = bone.AppendRotate;
                image.AppendTranslate = bone.AppendTranslate;
                image.HasAppend       = false;

                if (image.AppendRotate || image.AppendTranslate)
                {
                    image.AppendParent = bone.AppendBoneVal.Index;
                    if (image.AppendParent < boneNum)
                    {
                        image.HasAppend   = true;
                        image.AppendRatio = bone.AppendBoneVal.Ratio;
                    }
                }


                image.HasIk = bone.HasIk;
                if (image.HasIk)
                {
                    var ikLinkNum = bone.IkInfoVal.IkLinks.Length;
                    image.IkLinks           = new int[ikLinkNum];
                    image.IkFixTypes        = new BoneImage.AxisFixType[ikLinkNum];
                    image.IkTransformOrders = Enumerable.Repeat(BoneImage.AxisTransformOrder.OrderYzx, ikLinkNum)
                                              .ToArray();
                    image.IkLinkLimited   = new bool [ikLinkNum];
                    image.IkLinkLimitsMin = new Vector3[ikLinkNum];
                    image.IkLinkLimitsMax = new Vector3[ikLinkNum];

                    for (var j = 0; j < ikLinkNum; ++j)
                    {
                        var ikLink = bone.IkInfoVal.IkLinks[j];
                        image.IkLinks[j]       = ikLink.LinkIndex;
                        image.IkLinkLimited[j] = ikLink.HasLimit;
                        if (image.IkLinkLimited[j])
                        {
                            for (var k = 0; k < 3; ++k)
                            {
                                var lo = ikLink.LoLimit[k];
                                var hi = ikLink.HiLimit[k];
                                image.IkLinkLimitsMin[j][k] = Math.Min(lo, hi);
                                image.IkLinkLimitsMax[j][k] = Math.Max(lo, hi);
                            }
                            if (image.IkLinkLimitsMin[j].x > -Math.PI * 0.5 &&
                                image.IkLinkLimitsMax[j].x < Math.PI * 0.5)
                            {
                                image.IkTransformOrders[j] = BoneImage.AxisTransformOrder.OrderZxy;
                            }
                            else if (image.IkLinkLimitsMin[j].y > -Math.PI * 0.5 &&
                                     image.IkLinkLimitsMax[j].y < Math.PI * 0.5)
                            {
                                image.IkTransformOrders[j] = BoneImage.AxisTransformOrder.OrderXyz;
                            }
                            if (Math.Abs(image.IkLinkLimitsMin[j].x) < Tools.MmdMathConstEps &&
                                Math.Abs(image.IkLinkLimitsMax[j].x) < Tools.MmdMathConstEps &&
                                Math.Abs(image.IkLinkLimitsMin[j].y) < Tools.MmdMathConstEps &&
                                Math.Abs(image.IkLinkLimitsMax[j].y) < Tools.MmdMathConstEps &&
                                Math.Abs(image.IkLinkLimitsMin[j].z) < Tools.MmdMathConstEps &&
                                Math.Abs(image.IkLinkLimitsMax[j].z) < Tools.MmdMathConstEps)
                            {
                                image.IkFixTypes[j] = BoneImage.AxisFixType.FixAll;
                            }
                            else if (Math.Abs(image.IkLinkLimitsMin[j].y) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMax[j].y) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMin[j].z) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMax[j].z) < Tools.MmdMathConstEps)
                            {
                                image.IkFixTypes[j] = BoneImage.AxisFixType.FixX;
                            }
                            else if (Math.Abs(image.IkLinkLimitsMin[j].x) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMax[j].x) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMin[j].z) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMax[j].z) < Tools.MmdMathConstEps)
                            {
                                image.IkFixTypes[j] = BoneImage.AxisFixType.FixY;
                            }
                            else if (Math.Abs(image.IkLinkLimitsMin[j].x) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMax[j].x) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMin[j].y) < Tools.MmdMathConstEps &&
                                     Math.Abs(image.IkLinkLimitsMax[j].y) < Tools.MmdMathConstEps)
                            {
                                image.IkFixTypes[j] = BoneImage.AxisFixType.FixZ;
                            }
                        }
                        BoneImages[image.IkLinks[j]].IkLink = true;
                    }
                    image.CcdAngleLimit   = bone.IkInfoVal.CcdAngleLimit;
                    image.CcdIterateLimit = Math.Min(bone.IkInfoVal.CcdIterateLimit, 256);
                    image.IkTarget        = bone.IkInfoVal.IkTargetIndex;
                }
                if (bone.PostPhysics)
                {
                    _postPhysicsBones.Add(i);
                }
                else
                {
                    _prePhysicsBones.Add(i);
                }
            }
            BoneImage.TransformOrder order = new BoneImage.TransformOrder(model);
            _prePhysicsBones.Sort(order);
            _postPhysicsBones.Sort(order);

            var materialNum = model.Parts.Length;

            MaterialMulImages = new MaterialImage[materialNum];
            MaterialAddImages = new MaterialImage[materialNum];
            for (var i = 0; i < materialNum; ++i)
            {
                MaterialMulImages[i] = new MaterialImage(1.0f);
                MaterialAddImages[i] = new MaterialImage(0.0f);
            }

            var morphNum = model.Morphs.Length;

            MorphRates = new float[morphNum];
            for (var i = 0; i < morphNum; ++i)
            {
                var morph = model.Morphs[i];
                _morphNameMap[morph.Name] = i;
            }

            ResetPosing();
            //Debug.LogFormat("morphIndex count = {0}, vertex count = {1}", morphIndex.Count, model.Vertices.Length);
            //Debug.LogFormat("morphIndex count = {0}, vertex count = {1}", morphIndex.Count, model.Vertices.Length);
        }