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