00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include "RigidBodyPoint.h"
00013
#include <OpenCAL/System.h>
00014
#include <OpenCAL/Renderer.h>
00015
#include <OpenCAL/RigidBody.h>
00016
using namespace OpenCAL;
00017
00018
using namespace std;
00019
00020
00021
00022
00023
00024
00025 RigidBodyPoint::RigidBodyPoint(
RigidBody *object,
const Vector3 &bodyPosition)
00026 :
PhysicalObject(object->getParent()), m_object(object), m_bodyPosition(bodyPosition)
00027 {
00028
00029 m_draw =
false;
00030 m_oneOverMass = 0.0f;
00031 }
00032
00033 RigidBodyPoint::~RigidBodyPoint()
00034 {
00035 }
00036
00037
00038
00039
00040
00041
00042 void RigidBodyPoint::addForce(
const Vector3 &force)
00043 {
00045 m_object->
addForce(force, m_bodyPosition);
00046 }
00047
00048 void RigidBodyPoint::render()
00049 {
00050
Renderer *renderer = m_parent->
getRenderer();
00051
if(!renderer)
return;
00052
00053 renderer->
renderPoint(getPosition(), 2.0f);
00054 }
00055
00056
void RigidBodyPoint::calcPosition()
const
00057
{
00058 m_position = m_bodyPosition.
rotated(m_object->
getRotation()) + m_object->
getPosition();
00059 }
00060
00061
void RigidBodyPoint::calcVelocity()
const
00062
{
00063
00064
Matrix33 rot = m_object->
getRotation().
normalized().
toMatrix33();
00065
00066
00067
Matrix33 invInertia = rot * m_object->
getInvInertia() * rot.
transposed();
00068
00069
00070 Vector3 omega = invInertia * m_object->
getAngularMomentum();
00071
00072
00073 m_velocity = omega.crossProduct(m_bodyPosition) + m_object->
getVelocity();
00074 }