本文整理汇总了C++中NxActor::addForceAtPos方法的典型用法代码示例。如果您正苦于以下问题:C++ NxActor::addForceAtPos方法的具体用法?C++ NxActor::addForceAtPos怎么用?C++ NxActor::addForceAtPos使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类NxActor
的用法示例。
在下文中一共展示了NxActor::addForceAtPos方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
//-----------------------------------------------------------------------------
// ApplyExplosionPart
//-----------------------------------------------------------------------------
void CPhysicObj::ApplyExplosionPart (int nPartIdx, float fForce, const NxVec3& vPos)
{
assert( m_bActivated && (nPartIdx < GetNumParts()) );
// Solo podemos aplicar fuerzas a objetos físicos dinámicos
if (!IsDynamic()) return;
NxActor* pActor = GetActor( nPartIdx );
// Aplicamos una fuerza en cada shape, proporcional a su volumen.
// NOTA: Para que fuese mas realista realmente habria que modular la
// fuerza en funcion de la superficie de proyeccion de cada shape
// hacia el punto de origen de la explosion, para aproximar lo que
// seria la superficie de impacto.
uint nNumShapes = pActor->getNbShapes();
assert( nNumShapes > 0 );
NxShape* const* pShapes = pActor->getShapes();
for (uint i = 0; i < nNumShapes; i++)
{
NxShape* pShape = pShapes[i];
// - Calcular BBox de la shape
NxBox shapeBox = PhysicUtils::CalcOBBox( *pShape );
// - Calcular punto de impacto de la explosion
NxVec3 vImpactPoint = PhysicUtils::CalcExplosionImpact( shapeBox, vPos );
//NxVec3 vImpactPoint = shapeBox.GetCenter();
// - Modular la fuerza de la explosion por el area expuesta de la shape
float fVolume = (shapeBox.extents * 2.f).magnitudeSquared();
float fForceMod = fForce * fVolume;
// - Modular a su vez en funcion de la distancia al centro de la explosion
// usando una funcion exponencial de atenuacion
NxVec3 vImpactDir = vImpactPoint - vPos;
float fDist = vImpactDir.normalize();
// NOTA: vamos a marcar una zona de radio minimo donde se aplique la fuerza maxima
//static float s_fMinDist = 0.1f;
//fDist += s_fMinDist;
static float s_fAttenuationFactor = 0.05f;
fForceMod *= exp( -s_fAttenuationFactor * fDist );
// - Aplicar la fuerza en el punto de impacto
pActor->addForceAtPos( vImpactDir * fForceMod, vImpactPoint, NX_IMPULSE );
}
}