本文整理汇总了C++中Matrix4x4::GetAngles方法的典型用法代码示例。如果您正苦于以下问题:C++ Matrix4x4::GetAngles方法的具体用法?C++ Matrix4x4::GetAngles怎么用?C++ Matrix4x4::GetAngles使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Matrix4x4
的用法示例。
在下文中一共展示了Matrix4x4::GetAngles方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: LockViewToPlanet
void CSPCharacter::LockViewToPlanet()
{
// Now lock the roll value to the planet.
CPlanet* pNearestPlanet = GetNearestPlanet();
if (!pNearestPlanet)
return;
Matrix4x4 mGlobalRotation = GetGlobalTransform();
mGlobalRotation.SetTranslation(CScalableVector());
// Construct a "local space" for the planet
Vector vecPlanetUp = GetUpVector();
Vector vecPlanetForward = mGlobalRotation.GetForwardVector();
Vector vecPlanetRight = vecPlanetForward.Cross(vecPlanetUp).Normalized();
vecPlanetForward = vecPlanetUp.Cross(vecPlanetRight).Normalized();
Matrix4x4 mPlanet(vecPlanetForward, vecPlanetUp, vecPlanetRight);
Matrix4x4 mPlanetInverse = mPlanet;
mPlanetInverse.InvertTR();
// Bring our current view angles into that local space
Matrix4x4 mLocalRotation = mPlanetInverse * mGlobalRotation;
EAngle angLocalRotation = mLocalRotation.GetAngles();
// Lock them so that the roll is 0
// I'm sure there's a way to do this without converting to euler but at this point I don't care.
angLocalRotation.r = 0;
Matrix4x4 mLockedLocalRotation;
mLockedLocalRotation.SetAngles(angLocalRotation);
// Bring it back out to global space
Matrix4x4 mLockedRotation = mPlanet * mLockedLocalRotation;
// Only use the changed r value to avoid floating point crap
EAngle angNewLockedRotation = GetGlobalAngles();
EAngle angOverloadRotation = mLockedRotation.GetAngles();
// Lerp our way there
float flTimeToLocked = 1;
if (GameServer()->GetGameTime() - m_flLastEnteredAtmosphere > flTimeToLocked)
angNewLockedRotation.r = angOverloadRotation.r;
else
angNewLockedRotation.r = RemapValClamped(SLerp(GameServer()->GetGameTime() - m_flLastEnteredAtmosphere, 0.3f), 0, flTimeToLocked, m_flRollFromSpace, angOverloadRotation.r);
SetGlobalAngles(angNewLockedRotation);
}
示例2: CreateStructure
CStructure* CStructure::CreateStructure(structure_type eType, CSPPlayer* pOwner, CSpire* pSpire, const CScalableVector& vecOrigin)
{
CStructure* pStructure = nullptr;
switch (eType)
{
default:
case STRUCTURE_NONE:
TAssert(false);
return nullptr;
case STRUCTURE_SPIRE:
pStructure = GameServer()->Create<CSpire>("CSpire");
break;
case STRUCTURE_MINE:
pStructure = GameServer()->Create<CMine>("CMine");
break;
case STRUCTURE_PALLET:
pStructure = GameServer()->Create<CPallet>("CPallet");
break;
case STRUCTURE_STOVE:
pStructure = GameServer()->Create<CStove>("CStove");
break;
}
pStructure->GameData().SetPlayerOwner(pOwner->GetPlayerCharacter()->GameData().GetPlayerOwner());
pStructure->GameData().SetPlanet(pOwner->GetPlayerCharacter()->GameData().GetPlanet());
pStructure->SetOwner(pOwner);
pStructure->SetSpire(pSpire);
pStructure->SetGlobalOrigin(pOwner->GetPlayerCharacter()->GameData().GetPlanet()->GetGlobalOrigin()); // Avoid floating point precision problems
pStructure->SetMoveParent(pOwner->GetPlayerCharacter()->GameData().GetPlanet());
pStructure->SetLocalOrigin(vecOrigin);
if (pStructure->GameData().GetPlanet())
{
Vector vecUp = pStructure->GetLocalOrigin().Normalized();
Matrix4x4 mDirection;
mDirection.SetUpVector(vecUp);
mDirection.SetForwardVector(vecUp.Cross(pOwner->GetPlayerCharacter()->GetLocalTransform().GetRightVector()).Normalized());
mDirection.SetRightVector(mDirection.GetForwardVector().Cross(vecUp).Normalized());
pStructure->SetLocalAngles(mDirection.GetAngles());
}
pStructure->AddToPhysics(CT_STATIC_MESH);
pStructure->PostConstruction();
return pStructure;
}