struct ::Oyster::Physics3D::MomentOfInertia
This commit is contained in:
parent
ee5392c60d
commit
c3ed5e78ac
|
@ -0,0 +1,51 @@
|
|||
/********************************************************************
|
||||
* Created by Dan Andersson 2014
|
||||
********************************************************************/
|
||||
|
||||
#include "Inertia.h"
|
||||
|
||||
using namespace ::Oyster::Math3D;
|
||||
using namespace ::Oyster::Physics3D;
|
||||
|
||||
MomentOfInertia::MomentOfInertia()
|
||||
{
|
||||
this->rotation = Quaternion::identity;
|
||||
this->magnitude = Float3( 1.0f );
|
||||
}
|
||||
|
||||
MomentOfInertia::MomentOfInertia( const Quaternion &r, const Float3 &m )
|
||||
{
|
||||
this->rotation = r;
|
||||
this->magnitude = m;
|
||||
}
|
||||
|
||||
MomentOfInertia & MomentOfInertia::operator = ( const MomentOfInertia &i )
|
||||
{
|
||||
this->rotation = i.rotation;
|
||||
this->magnitude = i.magnitude;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Float4 MomentOfInertia::CalculateAngularVelocity( const Quaternion &externR, const Float4 &h ) const
|
||||
{
|
||||
return this->CalculateAngularVelocity( externR, h, Float4() );
|
||||
}
|
||||
|
||||
Float4 & MomentOfInertia::CalculateAngularVelocity( const Quaternion &externR, const Float4 &h, Float4 &targetMem ) const
|
||||
{ // w = (R * I_R) * I_M^-1 * (R * I_R)^-1 * h
|
||||
Float4x4 rotation = RotationMatrix( externR ) * RotationMatrix( this->rotation );
|
||||
Float4 w = rotation.GetInverse() * h;
|
||||
return targetMem = rotation * w.PiecewiseMultiplicationAdd( Float4(1.0f / this->magnitude.x, 1.0f / this->magnitude.y, 1.0f / this->magnitude.z, 0.0f) );
|
||||
}
|
||||
|
||||
Float4 MomentOfInertia::CalculateAngularMomentum( const Quaternion &externR, const Float4 &w ) const
|
||||
{
|
||||
return this->CalculateAngularMomentum( externR, w, Float4() );
|
||||
}
|
||||
|
||||
Float4 & MomentOfInertia::CalculateAngularMomentum( const Quaternion &externR, const Float4 &w, Float4 &targetMem ) const
|
||||
{ // h = (R * I_R) * I_M * (R * I_R)^-1 * w
|
||||
Float4x4 rotation = RotationMatrix( externR ) * RotationMatrix( this->rotation );
|
||||
Float4 h = rotation.GetInverse() * w;
|
||||
return targetMem = rotation * h.PiecewiseMultiplicationAdd( Float4(this->magnitude.x, this->magnitude.y, this->magnitude.z, 0.0f) );
|
||||
}
|
|
@ -0,0 +1,119 @@
|
|||
/********************************************************************
|
||||
* Created by Dan Andersson & Robin Engman 2014
|
||||
********************************************************************/
|
||||
|
||||
#ifndef OYSTER_PHYSICS_3D_INERTIA_H
|
||||
#define OYSTER_PHYSICS_3D_INERTIA_H
|
||||
|
||||
#include "OysterMath.h"
|
||||
|
||||
namespace Oyster { namespace Physics3D
|
||||
{
|
||||
struct MomentOfInertia
|
||||
{
|
||||
::Oyster::Math::Quaternion rotation;
|
||||
::Oyster::Math::Float3 magnitude;
|
||||
|
||||
MomentOfInertia();
|
||||
MomentOfInertia( const ::Oyster::Math::Quaternion &r, const ::Oyster::Math::Float3 &m );
|
||||
|
||||
MomentOfInertia & operator = ( const MomentOfInertia &i );
|
||||
|
||||
::Oyster::Math::Float4 CalculateAngularVelocity( const ::Oyster::Math::Quaternion &externR, const ::Oyster::Math::Float4 &angularMomentum ) const;
|
||||
::Oyster::Math::Float4 & CalculateAngularVelocity( const ::Oyster::Math::Quaternion &externR, const ::Oyster::Math::Float4 &angularMomentum, ::Oyster::Math::Float4 &targetMem ) const;
|
||||
|
||||
::Oyster::Math::Float4 CalculateAngularMomentum( const ::Oyster::Math::Quaternion &externR, const ::Oyster::Math::Float4 &angularVelocity ) const;
|
||||
::Oyster::Math::Float4 & CalculateAngularMomentum( const ::Oyster::Math::Quaternion &externR, const ::Oyster::Math::Float4 &angularVelocity, ::Oyster::Math::Float4 &targetMem ) const;
|
||||
|
||||
static ::Oyster::Math::Float CalculateSphere( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius );
|
||||
static ::Oyster::Math::Float CalculateHollowSphere( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius );
|
||||
static ::Oyster::Math::Float CalculateCuboidX( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float height, const ::Oyster::Math::Float depth );
|
||||
static ::Oyster::Math::Float CalculateCuboidY( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float width, const ::Oyster::Math::Float depth );
|
||||
static ::Oyster::Math::Float CalculateCuboidZ( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float width, const ::Oyster::Math::Float height );
|
||||
static ::Oyster::Math::Float CalculateRodCenter( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float length );
|
||||
static ::Oyster::Math::Float CalculateCylinderXY( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float height, const ::Oyster::Math::Float radius );
|
||||
static ::Oyster::Math::Float CalculateCylinderZ( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius );
|
||||
|
||||
static MomentOfInertia Sphere( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius );
|
||||
static MomentOfInertia HollowSphere( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius );
|
||||
static MomentOfInertia Cuboid( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float height, const ::Oyster::Math::Float width, const ::Oyster::Math::Float depth );
|
||||
static MomentOfInertia RodCenter( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float length );
|
||||
static MomentOfInertia Cylinder( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float height, const ::Oyster::Math::Float radius );
|
||||
};
|
||||
|
||||
inline ::Oyster::Math::Float MomentOfInertia::CalculateSphere( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius )
|
||||
{
|
||||
return (2.0f / 5.0f) * mass * radius * radius;
|
||||
}
|
||||
|
||||
inline ::Oyster::Math::Float MomentOfInertia::CalculateHollowSphere( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius )
|
||||
{
|
||||
return (2.0f / 3.0f) * mass * radius * radius;
|
||||
}
|
||||
|
||||
inline ::Oyster::Math::Float MomentOfInertia::CalculateCuboidX( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float height, const ::Oyster::Math::Float depth )
|
||||
{
|
||||
return (1.0f / 12.0f) * mass * (height * height + depth * depth);
|
||||
}
|
||||
|
||||
inline ::Oyster::Math::Float MomentOfInertia::CalculateCuboidY( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float width, const ::Oyster::Math::Float depth )
|
||||
{
|
||||
return (1.0f / 12.0f) * mass * (width * width + depth * depth);
|
||||
}
|
||||
|
||||
inline ::Oyster::Math::Float MomentOfInertia::CalculateCuboidZ( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float width, const ::Oyster::Math::Float height )
|
||||
{
|
||||
return (1.0f / 12.0f) * mass * (height * height + width * width);
|
||||
}
|
||||
|
||||
inline ::Oyster::Math::Float MomentOfInertia::CalculateRodCenter( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float length )
|
||||
{
|
||||
return (1.0f / 12.0f) * mass * length * length;
|
||||
}
|
||||
|
||||
inline ::Oyster::Math::Float MomentOfInertia::CalculateCylinderXY( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float height, const ::Oyster::Math::Float radius )
|
||||
{
|
||||
return (1.0f / 12.0f) * mass * (3.0f * radius * radius + height * height);
|
||||
}
|
||||
|
||||
inline ::Oyster::Math::Float MomentOfInertia::CalculateCylinderZ( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius )
|
||||
{
|
||||
return 0.5f * mass * radius * radius;
|
||||
}
|
||||
|
||||
inline MomentOfInertia MomentOfInertia::Sphere( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius )
|
||||
{
|
||||
return MomentOfInertia( ::Oyster::Math::Quaternion::identity,
|
||||
::Oyster::Math::Float3(MomentOfInertia::CalculateSphere(mass, radius)) );
|
||||
}
|
||||
|
||||
inline MomentOfInertia MomentOfInertia::HollowSphere( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float radius )
|
||||
{
|
||||
return MomentOfInertia( ::Oyster::Math::Quaternion::identity,
|
||||
::Oyster::Math::Float3(MomentOfInertia::CalculateHollowSphere(mass, radius)) );
|
||||
}
|
||||
|
||||
inline MomentOfInertia MomentOfInertia::Cuboid( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float height, const ::Oyster::Math::Float width, const ::Oyster::Math::Float depth )
|
||||
{
|
||||
return MomentOfInertia( ::Oyster::Math::Quaternion::identity,
|
||||
::Oyster::Math::Float3(MomentOfInertia::CalculateCuboidX(mass, height, depth),
|
||||
MomentOfInertia::CalculateCuboidY(mass, width, depth),
|
||||
MomentOfInertia::CalculateCuboidZ(mass, height, width)) );
|
||||
}
|
||||
|
||||
inline MomentOfInertia MomentOfInertia::RodCenter( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float length )
|
||||
{
|
||||
return MomentOfInertia( ::Oyster::Math::Quaternion::identity,
|
||||
::Oyster::Math::Float3(MomentOfInertia::CalculateRodCenter(mass , length)) );
|
||||
}
|
||||
|
||||
inline MomentOfInertia MomentOfInertia::Cylinder( const ::Oyster::Math::Float mass, const ::Oyster::Math::Float height, const ::Oyster::Math::Float radius )
|
||||
{
|
||||
::Oyster::Math::Float cylinderXY = MomentOfInertia::CalculateCylinderXY( mass , height, radius );
|
||||
return MomentOfInertia( ::Oyster::Math::Quaternion::identity,
|
||||
::Oyster::Math::Float3(cylinderXY, cylinderXY,
|
||||
MomentOfInertia::CalculateCylinderZ(mass, radius)) );
|
||||
}
|
||||
} }
|
||||
|
||||
#endif
|
|
@ -155,6 +155,7 @@
|
|||
<ClInclude Include="FluidDrag.h" />
|
||||
<ClInclude Include="Frustrum.h" />
|
||||
<ClInclude Include="ICollideable.h" />
|
||||
<ClInclude Include="Inertia.h" />
|
||||
<ClInclude Include="Line.h" />
|
||||
<ClInclude Include="OysterCollision3D.h" />
|
||||
<ClInclude Include="OysterPhysics3D.h" />
|
||||
|
@ -174,6 +175,7 @@
|
|||
<ClCompile Include="FluidDrag.cpp" />
|
||||
<ClCompile Include="Frustrum.cpp" />
|
||||
<ClCompile Include="ICollideable.cpp" />
|
||||
<ClCompile Include="Inertia.cpp" />
|
||||
<ClCompile Include="Line.cpp" />
|
||||
<ClCompile Include="OysterCollision3D.cpp" />
|
||||
<ClCompile Include="Particle.cpp" />
|
||||
|
|
|
@ -78,6 +78,9 @@
|
|||
<ClInclude Include="RigidBody_Inline.h">
|
||||
<Filter>Header Files\Physics</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Inertia.h">
|
||||
<Filter>Header Files\Physics</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Box.cpp">
|
||||
|
@ -125,5 +128,8 @@
|
|||
<ClCompile Include="Particle.cpp">
|
||||
<Filter>Source Files\Physics</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Inertia.cpp">
|
||||
<Filter>Source Files\Physics</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
Loading…
Reference in New Issue