/// <summary> /// 初期化 /// </summary> /// <param name="skinning">スキニングに利用するインターフェース</param> public void Initialize(ModelData model, IMorphManager morph, ISkinningProvider skinning, IBufferManager bufferManager) { skinningProvider = skinning; motionTimer = new Stopwatch(); motionTimer.Start(); this.morphManager = morph; SubscribedMotionMap = new List <KeyValuePair <string, IMotionProvider> >(); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="bones"></param> /// <param name="index"></param> /// <param name="layer"></param> /// <param name="skinning"></param> public PMXBone(List <BoneData> bones, int index, int layer, ISkinningProvider skinning) { this.skinning = skinning; BoneData me = bones[index]; //このボーン skinning.Bone[index] = this; BoneIndex = index; Position = me.Position; BoneName = me.BoneName; isLocalAxis = me.isLocalAxis; PhysicsOrder = me.transformAfterPhysics ? PhysicsOrder.After : PhysicsOrder.Before; Layer = layer; if (isLocalAxis) { DefaultLocalX = me.DimentionXDirectionVector; DefaultLocalY = Vector3.Cross(me.DimentionZDirectionVector, DefaultLocalX); DefaultLocalZ = Vector3.Cross(DefaultLocalX, DefaultLocalY); } if (me.isIK) //IKボーンの場合 { skinning.IkBone.Add(this); isIK = true; RotationLimited = me.IKLimitedRadian; targetBoneIndex = me.IKTargetBoneIndex; Iterator = me.IKLoopNumber; foreach (IkLinkData ikLink in me.ikLinks) { ikLinks.Add(new IkLink(skinning, ikLink)); } } isRotateProvided = me.isRotateProvided; isMoveProvided = me.isMoveProvided; if (me.ProvidedParentBoneIndex == -1) { isRotateProvided = isMoveProvided = false; } if (isMoveProvided || isRotateProvided) { ProvideParentBone = me.ProvidedParentBoneIndex; ProvidedRatio = me.ProvidedRatio; } else { ProvideParentBone = -1; } for (int i = 0; i < bones.Count; i++) { BoneData bone = bones[i]; if (bone.ParentBoneIndex == index) { PMXBone child = new PMXBone(bones, i, layer + 1, skinning); AddChild(child); } } }
public BoneMorphProvider(PMXModel model) { this.skinningProvider = model.Skinning; foreach (MorphData morphData in model.Model.MorphList.Morphes) { if (morphData.type == MorphType.Bone) { this.MorphList.Add(morphData.MorphName, new BoneMorphData(morphData)); } } }
public IkLink(ISkinningProvider skinning, MMDFileParser.PMXModelParser.IkLinkData linkData) { this.skinning = skinning; this.index = linkData.LinkBoneIndex; Vector3 maxVec = linkData.MinimumRadian; Vector3 minVec = linkData.MaximumRadian; //min and max load correctly this.minRot = new Vector3(Math.Min(maxVec.X, minVec.X), Math.Min(maxVec.Y, minVec.Y), Math.Min(maxVec.Z, minVec.Z)); this.maxRot = new Vector3(Math.Max(maxVec.X, minVec.X), Math.Max(maxVec.Y, minVec.Y), Math.Max(maxVec.Z, minVec.Z)); this.maxRot = Vector3.Clamp(this.maxRot, CGHelper.EularMinimum, CGHelper.EularMaximum); this.minRot = Vector3.Clamp(this.minRot, CGHelper.EularMinimum, CGHelper.EularMaximum); this.isLimited = linkData.isRotateLimited; }