void SeekObject::Update3(){ auto PtrRigidbody = GetComponent<Rigidbody>(); //回転の更新 //Velocityの値で、回転を変更する //これで進行方向を向くようになる auto PtrTransform = GetComponent<Transform>(); Vector3 Velocity = PtrRigidbody->GetVelocity(); if (Velocity.Length() > 0.0f){ Vector3 Temp = Velocity; Temp.Normalize(); float ToAngle = atan2(Temp.x, Temp.z); Quaternion Qt; Qt.RotationRollPitchYaw(0, ToAngle, 0); Qt.Normalize(); //現在の回転を取得 Quaternion NowQt = PtrTransform->GetQuaternion(); //現在と目標を補間(10分の1) NowQt.Slerp(NowQt, Qt, 0.1f); PtrTransform->SetQuaternion(NowQt); } //常にyはm_BaseY auto Pos = PtrTransform->GetPosition(); Pos.y = m_BaseY; PtrTransform->SetPosition(Pos); }
//プレートの作成 void GameStage::CreatePlate() { //メッシュ作成 CreatePlateMesh(); //ステージへのゲームオブジェクトの追加 auto Ptr = AddGameObject<GameObject>(); auto PtrTrans = Ptr->GetComponent<Transform>(); Quat Qt; Qt.rotationRollPitchYawFromVector(Vec3(XM_PIDIV2, 0, 0)); PtrTrans->SetScale(50.0f, 50.0f, 1.0f); PtrTrans->SetQuaternion(Qt); PtrTrans->SetPosition(0.0f, 0.0f, 0.0f); auto ColPtr = Ptr->AddComponent<CollisionRect>(); //描画コンポーネント auto DrawComp = Ptr->AddComponent<BcPNTnTStaticDraw>(); DrawComp->SetMeshResource(L"MY_PNTnT_SQUARE"); DrawComp->SetTextureResource(L"GRAY_TX"); DrawComp->SetNormalMapTextureResource(L"NORMAL3_TX"); //ラップモード DrawComp->SetSamplerState(SamplerState::LinearWrap); //スペキュラーなし DrawComp->DisableSpecular(); //フォグはきつめに DrawComp->SetFogEnabled(true); DrawComp->SetFogColor(Col4(0.3f, 0.3f,0.3f, 1.0f)); DrawComp->SetFogStart(-10.0f); DrawComp->SetFogEnd(-30.0f); //自分に影が映りこむようにする DrawComp->SetOwnShadowActive(true); }
void CustomDrawBox::Update(){ float ElapsedTime = App::GetApp()->GetElapsedTime(); auto PtrTransform = GetComponent<Transform>(); auto Qt = PtrTransform->GetQuaternion(); Quaternion Span; Span.RotationRollPitchYawFromVector(Vector3(0, ElapsedTime, 0)); Qt *= Span; PtrTransform->SetQuaternion(Qt); }
//プレートの作成 void GameStage::CreatePlate(){ auto Ptr = AddGameObject<GameObject>(); auto TrancePtr = Ptr->GetComponent<Transform>(); TrancePtr->SetScale(200.0f, 200.0f, 1.0f); Quaternion Qt; Qt.RotationRollPitchYawFromVector(Vector3(XM_PIDIV2, 0, 0)); TrancePtr->SetQuaternion(Qt); TrancePtr->SetPosition(0, 0, 0); auto DrawComp = Ptr->AddComponent<SimplePNTDraw>(); DrawComp->SetMeshResource(L"DEFAULT_SQUARE"); DrawComp->SetTextureResource(L"SKY_TX"); DrawComp->SetOwnShadowActive(true); }
int IMUAdvanced::DecodePacketHandler( char *received_data, int bytes_remaining ) { int16_t q1, q2, q3, q4; int16_t accel_x, accel_y, accel_z; int16_t mag_x, mag_y, mag_z; float temp_c; int packet_length = IMUProtocol::decodeQuaternionUpdate( received_data, bytes_remaining, q1,q2,q3,q4,accel_x,accel_y,accel_z,mag_x,mag_y,mag_z,temp_c ); if ( packet_length > 0 ) { SetQuaternion(q1,q2,q3,q4,accel_x,accel_y,accel_z,mag_x,mag_y,mag_z,temp_c); } return packet_length; }
//プレートの作成 void GameStage::CreatePlate(){ //ステージへのゲームオブジェクトの追加 auto Ptr = AddGameObject<GameObject>(); //変化コンポーネント(Transform)の取得 auto TrancePtr = Ptr->GetComponent<Transform>(); //スケーリングの設定 TrancePtr->SetScale(200.0f, 200.0f, 1.0f); //回転の設定 Quaternion Qt; Qt.RotationRollPitchYawFromVector(Vector3(XM_PIDIV2, 0, 0)); TrancePtr->SetQuaternion(Qt); //位置の設定 TrancePtr->SetPosition(0, 0, 0); //描画コンポーネントの追加 auto DrawComp = Ptr->AddComponent<SimplePNTDraw>(); //描画コンポーネントに形状(メッシュ)を設定 DrawComp->SetMeshResource(L"DEFAULT_SQUARE"); //描画コンポーネントテクスチャの設定 DrawComp->SetTextureResource(L"SKY_TX"); //自分に影が映りこむようにする DrawComp->SetOwnShadowActive(true); //徘徊範囲がわかるようにもう一つプレートを付ける Ptr = AddGameObject<GameObject>(); TrancePtr = Ptr->GetComponent<Transform>(); TrancePtr->SetScale(40.0f, 40.0f, 1.0f); Qt.RotationRollPitchYawFromVector(Vector3(XM_PIDIV2, 0, 0)); TrancePtr->SetQuaternion(Qt); //下のプレートと混じってしまうので少し上にあげる TrancePtr->SetPosition(0, 0.01f, 0); DrawComp = Ptr->AddComponent<SimplePNTDraw>(); DrawComp->SetMeshResource(L"DEFAULT_SQUARE"); DrawComp->SetTextureResource(L"WALL_TX"); DrawComp->SetOwnShadowActive(true); }
//プレートの作成 void GameStage::CreatePlate() { //ステージへのゲームオブジェクトの追加 auto Ptr = AddGameObject<GameObject>(); auto PtrTrans = Ptr->GetComponent<Transform>(); Quat Qt; Qt.rotationRollPitchYawFromVector(Vec3(XM_PIDIV2, 0, 0)); PtrTrans->SetScale(200.0f, 200.0f, 1.0f); PtrTrans->SetQuaternion(Qt); PtrTrans->SetPosition(0.0f, 0.0f, 0.0f); //描画コンポーネントの追加 auto DrawComp = Ptr->AddComponent<PNTStaticDraw>(); //描画コンポーネントに形状(メッシュ)を設定 DrawComp->SetMeshResource(L"DEFAULT_SQUARE"); //自分に影が映りこむようにする DrawComp->SetOwnShadowActive(true); //描画コンポーネントテクスチャの設定 DrawComp->SetTextureResource(L"SKY_TX"); }
//モーションを実装する関数群 //移動して向きを移動方向にする void Player::MoveRotationMotion(){ float ElapsedTime = App::GetApp()->GetElapsedTime(); Vector3 Angle = GetAngle(); //Transform auto PtrTransform = GetComponent<Transform>(); //Rigidbodyを取り出す auto PtrRedit = GetComponent<Rigidbody>(); //現在の速度を取り出す auto Velo = PtrRedit->GetVelocity(); //目的地を最高速度を掛けて求める auto Target = Angle * m_MaxSpeed; //目的地に向かうために力のかける方向を計算する //Forceはフォースである auto Force = Target - Velo; //yは0にする Force.y = 0; //加速度を求める auto Accel = Force / m_Mass; //ターン時間を掛けたものを速度に加算する Velo += (Accel * ElapsedTime); //減速する Velo *= m_Decel; //速度を設定する PtrRedit->SetVelocity(Velo); //回転の計算 float YRot = PtrTransform->GetRotation().y; Quaternion Qt; Qt.Identity(); if (Angle.Length() > 0.0f){ //ベクトルをY軸回転に変換 float PlayerAngle = atan2(Angle.x, Angle.z); Qt.RotationRollPitchYaw(0, PlayerAngle, 0); Qt.Normalize(); } else{ Qt.RotationRollPitchYaw(0, YRot, 0); Qt.Normalize(); } //Transform PtrTransform->SetQuaternion(Qt); }
//進行方向を向くようにする void Enemy::RotToHead() { auto PtrRigidbody = GetComponent<Rigidbody>(); //回転の更新 //Velocityの値で、回転を変更する //これで進行方向を向くようになる auto PtrTransform = GetComponent<Transform>(); Vec3 Velocity = PtrRigidbody->GetVelocity(); if (Velocity.length() > 0.0f) { Vec3 Temp = Velocity; Temp.normalize(); float ToAngle = atan2(Temp.x, Temp.z); Quat Qt; Qt.rotationRollPitchYawFromVector(Vec3(0, ToAngle, 0)); Qt.normalize(); //現在の回転を取得 Quat NowQt = PtrTransform->GetQuaternion(); //現在と目標を補間(10分の1) NowQt = XMQuaternionSlerp(NowQt, Qt, 0.1f); PtrTransform->SetQuaternion(NowQt); } }