private RigidBody CreateRigidBody(MMDRigid rigid, MMDModel Model,out short group, out MMDMotionState motionStateStart) { CollisionShape collision; RigidBody body; //衝突スキンの作成 switch (rigid.ShapeType) { case 0: collision = new SphereShape(rigid.ShapeWidth); break; case 1: collision = new BoxShape(new btVector3(rigid.ShapeWidth, rigid.ShapeHeight, rigid.ShapeDepth)); break; case 2: collision = new CapsuleShape(rigid.ShapeWidth, rigid.ShapeHeight); break; default: throw new NotImplementedException("不明な剛体タイプ"); } motionStateStart = new MMDMotionState(rigid, Model); btVector3 localInertia = btVector3.Zero; //イナーシャの計算 if (rigid.Type != 0) collision.calculateLocalInertia(rigid.Weight, out localInertia); //剛体を作成 body = new RigidBody((rigid.Type != 0 ? rigid.Weight : 0), motionStateStart, collision, localInertia); //ダンピング値、摩擦、Restitutionをセット body.setDamping(rigid.LinerDamping, rigid.AngularDamping); body.Friction = rigid.Friction; body.Restitution = rigid.Restitution; //ボーン追従型はKinematicにする if (rigid.Type == 0) { body.ActivationState |= ActivationStateFlags.DISABLE_DEACTIVATION; body.CollisionFlags = CollisionFlags.CF_KINEMATIC_OBJECT; if (!string.IsNullOrEmpty(rigid.RelatedBoneName)) Model.BoneManager[rigid.RelatedBoneName].IsPhysics = false; } else {//物理演算型はボーンのフラグをオンにする if (!string.IsNullOrEmpty(rigid.RelatedBoneName)) Model.BoneManager[rigid.RelatedBoneName].IsPhysics = true; } //グループのフラグをセット group = (short)Math.Pow(2, rigid.GroupIndex); return body; }
public BoxBoxDetector(BoxShape box1, BoxShape box2) { m_box1 = box1; m_box2 = box2; }