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; } }
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); }