図0703a
Xボタンで球を発射します。それを、手前側のボックスに当てると選択できます。選択したうえで、Yボタンを動かすと選択されたボックスが動きます。以下の画面です。
図0703b
選択できるのは、6つのボックスだけです。また、それぞれの動きもジョイントに制約された動きとなります。
図0703c
切断された状態では、選択されているオブジェクトは、プレイヤーの真上に向かって移動するようになります。
class PsJointManager : public GameObject { shared_ptr<PsBallJoint> m_PsBallJoint; shared_ptr<PsSwingTwistJoint> m_PsSwingTwistJoint; shared_ptr<PsHingeJoint> m_PsHingeJoint; shared_ptr<PsSliderJoint> m_PsSliderJoint; shared_ptr<PsFixJoint> m_PsFixJoint; shared_ptr<PsUniversalJoint> m_PsUniversalJoint; void CreateBallJoint(); void CreateSwingTwistJoint(); void CreateHingeJoint(); void CreateSliderJoint(); void CreateFixJoint(); void CreateUniversalJoint(); public: //構築と破棄 PsJointManager(const shared_ptr<Stage>& StagePtr); virtual ~PsJointManager(); //初期化 virtual void OnCreate() override; };
void PsBrick::OnCreate() {
auto PtrTransform = GetComponent<Transform>();
PtrTransform->SetScale(m_Scale);
PtrTransform->SetQuaternion(m_Qt);
PtrTransform->SetPosition(m_Position);
//影をつける
auto ShadowPtr = AddComponent<Shadowmap>();
ShadowPtr->SetMeshResource(L"DEFAULT_CUBE");
auto PtrDraw = AddComponent<BcPNTStaticDraw>();
PtrDraw->SetFogEnabled(true);
PtrDraw->SetMeshResource(L"DEFAULT_CUBE");
PtrDraw->SetOwnShadowActive(true);
PtrDraw->SetTextureResource(L"SKY_TX");
//物理計算ボックス
PsBoxParam param;
//DEFAULT_CUBEのスケーリングは各辺基準なので、ハーフサイズにする
param.m_HalfSize = m_Scale * 0.5f;
param.m_Mass = m_Mass;
//慣性テンソルの計算
param.m_Inertia = BasePhysics::CalcInertiaBox(param.m_HalfSize, param.m_Mass);
if (m_IsFixed) {
param.m_MotionType = PsMotionType::MotionTypeFixed;
}
else {
param.m_MotionType = PsMotionType::MotionTypeActive;
}
param.m_Quat = m_Qt;
param.m_Pos = m_Position;
auto PsPtr = AddComponent<PsBoxBody>(param);
if (m_IsFixed) {
PsPtr->SetContactFilterSelf(1);
PsPtr->SetContactFilterTarget(1);
}
else {
PsPtr->SetContactFilterSelf(2);
PsPtr->SetContactFilterTarget(2);
}
//ワーアフレームの表示
PsPtr->SetDrawActive(true);
//ステートマシンの構築
m_StateMachine.reset(new StateMachine<PsBrick>(GetThis<PsBrick>()));
//最初のステートをPsBrickDefaultStateに設定
m_StateMachine->ChangeState(PsBrickDefaultState::Instance());
}
if (m_IsFixed) { PsPtr->SetContactFilterSelf(1); PsPtr->SetContactFilterTarget(1); } else { PsPtr->SetContactFilterSelf(2); PsPtr->SetContactFilterTarget(2); }
if( (shapeA.getContactFilterSelf()&shapeB.getContactFilterTarget()) && (shapeA.getContactFilterTarget()&shapeB.getContactFilterSelf()) ) { //判定を行う }
1、shapeAのFilterSelfとshapeBのFilterTargetのANDが真 2、shapeBのFilterSelfとshapeAのFilterTargetのANDが真 3、1と2の両方を満たしてる場合、判定する
void GameStage::CreatePhysicsObjects() { //下の台 AddGameObject<FixedPsBox>(Vec3(30.0f, 1.0f, 30.0f), Quat(), Vec3(0.0f, -0.5f, 0.0f)); //ボールジョイント用 auto BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(-2.0f, 1.5f, 4.0f), 5.0f, true); SetSharedGameObject(L"Brick01", BrickPtr); BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(-2.0f, 1.5f, 3.0f), 5.0f, false); SetSharedGameObject(L"Brick02", BrickPtr); //球関節ジョイント用 BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(-1.0f, 1.5f, 4.0f), 5.0f, true); SetSharedGameObject(L"Brick03", BrickPtr); BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(-1.0f, 1.5f, 3.0f), 5.0f, false); SetSharedGameObject(L"Brick04", BrickPtr); //蝶番ジョイント用 BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(0.0f, 1.5f, 4.0f),5.0f,true); SetSharedGameObject(L"Brick05", BrickPtr); BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(0.0f, 1.5f, 3.0f), 5.0f, false); SetSharedGameObject(L"Brick06", BrickPtr); //スライダージョイント用 BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(1.0f, 1.5f, 4.0f), 5.0f, true); SetSharedGameObject(L"Brick07", BrickPtr); BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(1.0f, 1.5f, 3.0f), 5.0f, false); SetSharedGameObject(L"Brick08", BrickPtr); //固定ジョイント用 BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(2.0f, 1.5f, 4.0f), 5.0f, true); SetSharedGameObject(L"Brick09", BrickPtr); BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(2.0f, 1.5f, 3.0f), 5.0f, false); SetSharedGameObject(L"Brick10", BrickPtr); //ユニバーサルジョイント用 BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(3.0f, 1.5f, 4.0f), 5.0f, true); SetSharedGameObject(L"Brick11", BrickPtr); BrickPtr = AddGameObject<PsBrick>(Vec3(0.25f, 0.7f, 1.0f), Quat(), Vec3(3.0f, 1.5f, 3.0f), 5.0f, false); SetSharedGameObject(L"Brick12", BrickPtr); //ジョイントマネージャの作成 auto MngPtr = AddGameObject<PsJointManager>(); SetSharedGameObject(L"PsJointManager", MngPtr); }
void PsJointManager::OnCreate() { CreateBallJoint(); CreateSwingTwistJoint(); CreateHingeJoint(); CreateSliderJoint(); CreateFixJoint(); CreateUniversalJoint(); }
void PsJointManager::CreateHingeJoint() {
auto ObjA = GetStage()->GetSharedGameObject<PsBrick>(L"Brick05");
auto CompA = ObjA->GetComponent<PsBoxBody>();
auto ObjB = GetStage()->GetSharedGameObject<PsBrick>(L"Brick06");
auto CompB = ObjB->GetComponent<PsBoxBody>();
PsHingeJointParam param;
param.m_AnchorPoint = (CompA->GetPosition() + CompB->GetPosition())*0.5f;
param.m_IndexA = CompA->GetIndex();
param.m_IndexB = CompB->GetIndex();
param.m_Axis = Vec3(1.0f, 0.0f, 0.0f);
param.m_LowerAngle = -0.5f;
param.m_UpperAngle = 0.7f;
m_PsHingeJoint = GetStage()->GetBasePhysics().AddHingeJoint(param);
ObjA->SetJoint(m_PsHingeJoint);
ObjB->SetJoint(m_PsHingeJoint);
}
m_PsHingeJoint = GetStage()->GetBasePhysics().AddHingeJoint(param);