As you can see, I should be applying the force on the center of mass.
Thanks for help....
stringa
EDIT : So I'm not thinking it this code, but possibly the shapes I'm using. At first, I was just using a box as the collision shape, but now I"m using a capsule. It seems to work a little better, except at certain points on hills in my terrain. It spins the object like crazy
- Code: Select all
void AddGlobalForce( const NewtonBody* newton_body, vec3& global_force, vec3& global_point )
{
// --- Get the body position
mat4 body_matrix;
vec3 torque;
NewtonBodyGetMatrix( newton_body, body_matrix.mat_array );
vec3 R = global_point - vec3( body_matrix.mat_array[12], body_matrix.mat_array[13], body_matrix.mat_array[14] );
cross( torque, R, global_force );
std::cout << "Torque " << torque.x << " " << torque.y << " " << torque.z << std::endl;
NewtonBodyAddForce( newton_body, global_force.vec_array );
NewtonBodyAddTorque( newton_body, torque.vec_array );
}
void AddLocalForce( const NewtonBody* newton_body, vec3& local_force, vec3& local_point )
{
// --- We need to rotate the force by the body rotation
mat4 body_matrix;
mat3 rotation_matrix;
NewtonBodyGetMatrix( newton_body, body_matrix.mat_array );
rotation_matrix = mat3( body_matrix.mat_array[0],
body_matrix.mat_array[1],
body_matrix.mat_array[2],
body_matrix.mat_array[4],
body_matrix.mat_array[5],
body_matrix.mat_array[6],
body_matrix.mat_array[8],
body_matrix.mat_array[9],
body_matrix.mat_array[10] );
vec3 global_force = rotation_matrix * local_force;
vec3 global_point = vec3( body_matrix * vec4( local_point.x, local_point.y, local_point.z, 1.0 ) );
AddGlobalForce( newton_body, global_force, global_point );
}
void UpdateCharacter( GameObject* obj, const NewtonBody* newton_body )
{
NewtonBodySetAutoFreeze( newton_body, 0 );
std::queue< MOVEMENT_MODE >& applied_movements = obj->m_body->movement;
vec3 force = vec3( 0.0f, 0.0f, -100.0f );
vec3 p1 = vec3( 0.0f, 0.0f, 0.0f );
vec3 p2 = vec3( 1.0f, 0.0f, 0.0f );
while( !applied_movements.empty() )
{
MOVEMENT_MODE cur_movement = applied_movements.front();
applied_movements.pop();
switch( cur_movement )
{
case MM_WALK_FORWARD:
{
AddLocalForce( newton_body, force, p1 );
//AddLocalForce( newton_body, force, p2 );
}
break;
case MM_WALK_BACKWARD:
AddLocalForce( newton_body, -force, p1 );
//AddLocalForce( newton_body, -force, p2 );
break;
case MM_TURN_LEFT:
AddLocalForce( newton_body, force, p1 );
break;
case MM_TURN_RIGHT:
AddLocalForce( newton_body, force, p2 );
break;
}
}
}