void CLocalPlayer::SendOnFootData() { RakNet::BitStream PlayerBitStream_send; PlayerBitStream_send.Write((MessageID)ID_SEND_PLAYER_DATA); PlayerBitStream_send.Write(NetworkManager->playerid); PlayerBitStream_send.Write(GetType()); PlayerBitStream_send.Write(GetModel()); PlayerBitStream_send.Write(GetHealth()); PlayerBitStream_send.Write(GetArmour()); PlayerBitStream_send.Write(GetCoords().x); PlayerBitStream_send.Write(GetCoords().y); PlayerBitStream_send.Write(GetCoords().z); PlayerBitStream_send.Write(GetHeading()); PlayerBitStream_send.Write(GetQuaternion().fX); PlayerBitStream_send.Write(GetQuaternion().fY); PlayerBitStream_send.Write(GetQuaternion().fZ); PlayerBitStream_send.Write(GetQuaternion().fW); PlayerBitStream_send.Write(AI::GET_PED_DESIRED_MOVE_BLEND_RATIO(playerPed)); PlayerBitStream_send.Write(GetVelocity().x); PlayerBitStream_send.Write(GetVelocity().y); PlayerBitStream_send.Write(GetVelocity().z); PlayerBitStream_send.Write(LocalPlayer->GetVehicle()); PlayerBitStream_send.Write(time(0)); NetworkManager->client->Send(&PlayerBitStream_send, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, RakNet::UNASSIGNED_SYSTEM_ADDRESS, true); }
float KChainOrientationBodySchema::TryInverseKinematics(const cart_vec_t position){ int i,j; float cand,rdist=0,tdist=0,k=0.0001; //rotation vs translation weight CVector3_t stack[MAX_LINKS]; CVector3_t tar,newrod,rod,diff,pos; CQuat_t q1,q2,q3,q4,rot; // converting data format v_copy(position.GetArray(),pos); q_complete(position.GetArray()+3,rot); q_inv(rot,q1); for(i=0;i<nb_joints;i++){ GetQuaternion(i,q2); q_multiply(q2,q1,q3); q_copy(q3,q1); } for(j=0;j<50;j++){ #ifdef WITH_LAST_LINK last_link->GetTranslation(rod); #else v_clear(rod); #endif InverseKinematicsStack(pos,stack); for(i=nb_joints-1;i>=0;i--){ GetInverseQuaternion(i,q2); q_multiply(q2,q1,q3); //q1*inv(Ri) if(IsInverted(i)==-1){ v_copy(stack[i],tar); Translate(i,rod,newrod); //getting to joint cand = joints[i]->MinimizePositionAndRotationAngle(tar,newrod,q3,k); cand = AngleInClosestRange(i,cand); joints[i]->SetAngle(-cand);// todo to check if it is - Rotate(i,newrod,rod); // updating "rod" v_sub(tar,rod,diff); } else{ Rotate(i,stack[i+1],tar); //rotating back cand = joints[i]->MinimizePositionAndRotationAngle(tar,rod,q3,k); cand = AngleInClosestRange(i,cand); joints[i]->SetAngle(cand); Rotate(i,rod,newrod); Translate(i,newrod,rod); v_sub(tar,newrod,diff); } GetQuaternion(i,q2); q_multiply(q3,q2,q1); q_multiply(q2,q3,q4); rdist = v_length(q4);//rotation distance, only the first 3 components tdist = v_length(diff);//translation distance // cout<<"rot "<<rdist<<" pos "<<tdist<<" prod: "<<(1-k)*rdist+k*tdist<<endl; if(tdist<tol && rdist<rot_tol){return rdist/rot_tol+tdist;} } q_multiply(rot,q1,q2); q_inv(rot,q3); q_multiply(q2,q3,q1); } return rdist/rot_tol + tdist; }
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); }
//Xボタンハンドラ void Player::OnPushX() { auto XAPtr = App::GetApp()->GetXAudio2Manager(); XAPtr->Start(L"cursor"); auto Ptr = GetComponent<Transform>(); Vec3 Pos = Ptr->GetPosition(); Pos.y += 0.3f; Quat Qt = Ptr->GetQuaternion(); Vec3 Rot = Qt.toRotVec(); float RotY = Rot.y; Vec3 velo(sin(RotY), 0.05f, cos(RotY)); velo.normalize(); velo *= 20.0f; auto Group = GetStage()->GetSharedObjectGroup(L"ShellGroup"); for (size_t i = 0; i < Group->size(); i++) { auto shptr = dynamic_pointer_cast<ShellSphere>(Group->at(i)); if (shptr && !shptr->IsUpdateActive()) { //空きが見つかった shptr->Reset(Pos, velo); return; } } //ここまで来てれば空きがない GetStage()->AddGameObject<ShellSphere>(Pos, velo); }
/* 一関節分の読込 */ void PacketParserNeuron::ProcessSegment(const uint8* data, const int32 segmentNo, const int32 index, UMocapPose* pose) { int32 num = segmentNo; uint8 boneIndex = this->BoneIndices[num]; FQuat quat = GetQuaternion(data, index); pose->BoneRotations[boneIndex] = quat; }
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); }
// SLERP Matrix Matrix::SLERP (Matrix& m2, float t, bool bRightHanded) { Quaternion q1 = GetQuaternion (bRightHanded); Quaternion q2 = m2.GetQuaternion (bRightHanded); Quaternion qInterpolated = ::SLERP (q1, q2, t); Matrix answer (qInterpolated); answer.SetPos (m2.GetPos()); return answer; }
const Urho3D::Quaternion ConfigManager::GetQuaternion(const Urho3D::String& section, const Urho3D::String& parameter, const Urho3D::Quaternion& defaultValue) { auto value = Get(section, parameter); if (value.GetType() == Urho3D::VAR_QUATERNION) return value.GetQuaternion(); if (value.GetType() == Urho3D::VAR_STRING) return Urho3D::ToQuaternion(value.GetString()); // Parameter doesn't exist, or is a different type if (_saveDefaultParameters) { // Set back to default Set(section, parameter, defaultValue); } return defaultValue; }
void ParticleSystemLoader::ProcessTransform (TiXmlElement* xmlElem, Emiter* emiter) { TiXmlElement* content = xmlElem->FirstChildElement (); while (content) { std::string name = content->Value (); if (name == "Position") { emiter->GetTransform ()->SetPosition (GetVector (content)); } else if (name == "Scale") { emiter->GetTransform ()->SetScale (GetVector (content)); } else if (name == "Rotation") { emiter->GetTransform ()->SetRotation (GetQuaternion (content)); } content = content->NextSiblingElement (); } }
//進行方向を向くようにする 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); } }
template <> Quaternion Variant::Get<Quaternion>() const { return GetQuaternion(); }
template <> const Quaternion& Variant::Get<const Quaternion&>() const { return GetQuaternion(); }
void XmlMapFile::LoadMap() { TiXmlNode* node = m_File.RootElement(); if( node == NULL || node->ValueStr() != "map" ) { LOG_ERROR( m_File.ValueStr() + " is not a valid fields map file! No <map> in root." ); return; } node = node->FirstChild(); while( node != NULL ) { if( node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "walkmesh" ) { Ogre::String name( GetString( node, "file_name" ) ); if( !name.empty() ) { QGears::WalkmeshFileManager::getSingleton(); QGears::WalkmeshFilePtr walkmesh( QGears::WalkmeshFileManager::getSingleton().load( name, "Game" ) ); EntityManager::getSingleton().GetWalkmesh()->load( walkmesh ); } } else if( node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "movement_rotation" ) { Ogre::Degree rotation = Ogre::Degree( GetFloat( node, "degree", 0 ) ); EntityManager::getSingleton().SetPlayerMoveRotation( Ogre::Radian( rotation ) ); } else if( node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "background2d" ) { Ogre::String name = GetString( node, "file_name" ); if( name != "" ) { // TODO migrate this code to a Resource and use it's group to load background QGears::Background2DFilePtr background( QGears::Background2DFileManager::getSingleton().load( name, "Game" ) ); EntityManager::getSingleton().GetBackground2D()->load( background ); } } else if( node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "entity_model" ) { Ogre::String name = GetString( node, "name" ); if( name == "" ) { LOG_ERROR( "There is no name specified for <entity_model> tag." ); continue; } Ogre::String file_name = GetString( node, "file_name" ); if( file_name == "" ) { LOG_ERROR( "There is no file_name specified for <entity_model> tag." ); continue; } Ogre::Vector3 position( GetVector3( node, "position" ) ); Ogre::Degree direction( Ogre::Degree( GetFloat( node, "direction" ) ) ); Ogre::Vector3 scale( GetVector3( node, "scale", Ogre::Vector3::UNIT_SCALE ) ); Ogre::Quaternion orientation( GetQuaternion( node, "root_orientation" ) ); EntityManager::getSingleton().AddEntity( name, file_name, position, direction, scale, orientation ); } else if( node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "entity_trigger" ) { Ogre::String name = GetString( node, "name" ); if( name == "" ) { LOG_ERROR( "There is no name specified for <entity_trigger> tag." ); continue; } Ogre::Vector3 point1 = GetVector3( node, "point1", Ogre::Vector3::ZERO ); Ogre::Vector3 point2 = GetVector3( node, "point2", Ogre::Vector3::ZERO ); bool enabled = GetBool( node, "enabled", false ); EntityManager::getSingleton().AddEntityTrigger( name, point1, point2, enabled ); } else if( node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "entity_point" ) { Ogre::String name = GetString( node, "name" ); if( name == "" ) { LOG_ERROR( "There is no name specified for <entity_point> tag." ); continue; } Ogre::Vector3 position = GetVector3( node, "position" ); float rotation = GetFloat( node, "rotation" ); EntityManager::getSingleton().AddEntityPoint( name, position, rotation ); } else if( node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "entity_script" ) { Ogre::String name = GetString( node, "name" ); if( name == "" ) { LOG_ERROR( "There is no name specified for <entity_script> tag." ); continue; } EntityManager::getSingleton().AddEntityScript( name ); } else if( node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "script" ) { Ogre::String file_name = GetString( node, "file_name" ); if( file_name != "" ) { ScriptManager::getSingleton().RunFile( file_name ); } } node = node->NextSibling(); } }