Player now has better movement
Something is "dragging" the player slightly, but will be fixed. Bumps up and down, tweaking physical properties should fix it.
This commit is contained in:
parent
de70388dfb
commit
f8f656d7c9
|
@ -140,8 +140,8 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa
|
||||||
this->privData->camera.SetPosition( this->privData->player.getPos() );
|
this->privData->camera.SetPosition( this->privData->player.getPos() );
|
||||||
Float3 offset = Float3( 0.0f );
|
Float3 offset = Float3( 0.0f );
|
||||||
// DEBUG position of camera so we can see the player model
|
// DEBUG position of camera so we can see the player model
|
||||||
offset.y = this->privData->player.getScale().y * 5.0f;
|
//offset.y = this->privData->player.getScale().y * 5.0f;
|
||||||
offset.z = this->privData->player.getScale().z * -5.0f;
|
//offset.z = this->privData->player.getScale().z * -5.0f;
|
||||||
// !DEBUG
|
// !DEBUG
|
||||||
this->privData->camera.SetHeadOffset( offset );
|
this->privData->camera.SetHeadOffset( offset );
|
||||||
this->privData->camera.UpdateOrientation();
|
this->privData->camera.UpdateOrientation();
|
||||||
|
|
|
@ -79,99 +79,133 @@ void Player::BeginFrame()
|
||||||
|
|
||||||
Oyster::Math::Float maxSpeed = 30;
|
Oyster::Math::Float maxSpeed = 30;
|
||||||
|
|
||||||
|
// Rotate player accordingly
|
||||||
|
this->rigidBody->SetUp(this->rigidBody->GetState().centerPos.GetNormalized());
|
||||||
|
Oyster::Math::Quaternion firstUp = this->rigidBody->GetState().quaternion;
|
||||||
|
this->rigidBody->SetRotationAsAngularAxis(Oyster::Math3D::Float4(this->rigidBody->GetState().centerPos.GetNormalized(), this->rotationUp));
|
||||||
|
Oyster::Math::Quaternion secondTurn = this->rigidBody->GetState().quaternion;
|
||||||
|
|
||||||
|
this->rigidBody->SetRotation(secondTurn*firstUp);
|
||||||
|
|
||||||
|
// Direction data
|
||||||
Oyster::Math::Float4x4 xform;
|
Oyster::Math::Float4x4 xform;
|
||||||
xform = this->rigidBody->GetState().GetOrientation();
|
xform = this->rigidBody->GetState().GetOrientation();
|
||||||
|
|
||||||
/* Handle turning */
|
|
||||||
/*if (left)
|
|
||||||
m_turnAngle -= dt * m_turnVelocity;
|
|
||||||
if (right)
|
|
||||||
m_turnAngle += dt * m_turnVelocity;
|
|
||||||
|
|
||||||
xform.setRotation (btQuaternion (btVector3(0.0, 1.0, 0.0), m_turnAngle));*/
|
|
||||||
|
|
||||||
Oyster::Math::Float3 linearVelocity = this->rigidBody->GetLinearVelocity();
|
|
||||||
Oyster::Math::Float speed = this->rigidBody->GetLinearVelocity().GetLength();
|
|
||||||
|
|
||||||
Oyster::Math::Float3 forwardDir = xform.v[2];
|
Oyster::Math::Float3 forwardDir = xform.v[2];
|
||||||
|
Oyster::Math::Float3 upDir = xform.v[1];
|
||||||
Oyster::Math::Float3 rightDir = xform.v[0];
|
Oyster::Math::Float3 rightDir = xform.v[0];
|
||||||
forwardDir.Normalize();
|
forwardDir.Normalize();
|
||||||
|
upDir.Normalize();
|
||||||
rightDir.Normalize();
|
rightDir.Normalize();
|
||||||
|
|
||||||
|
// Previous velocities data
|
||||||
|
Oyster::Math::Float3 linearVelocity = this->rigidBody->GetLinearVelocity();
|
||||||
|
Oyster::Math::Float3 forwardVelocity = linearVelocity*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z));
|
||||||
|
Oyster::Math::Float forwardSpeed = (linearVelocity*forwardDir).GetLength();
|
||||||
|
Oyster::Math::Float3 rightVelocity = linearVelocity*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z));
|
||||||
|
Oyster::Math::Float rightSpeed = (linearVelocity*rightDir).GetLength();
|
||||||
|
Oyster::Math::Float3 upVelocity = linearVelocity*Oyster::Math::Float3(fabs(upDir.x), fabs(upDir.y), fabs(upDir.z));
|
||||||
|
|
||||||
|
// Walking data
|
||||||
Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0);
|
Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0);
|
||||||
Oyster::Math::Float walkSpeed = this->moveSpeed*0.2f;
|
Oyster::Math::Float walkSpeed = this->moveSpeed*0.2f;
|
||||||
|
|
||||||
|
// Check for input
|
||||||
if(key_forward > 0.001)
|
if(key_forward > 0.001)
|
||||||
{
|
{
|
||||||
key_forward -= gameInstance->GetFrameTime();
|
key_forward -= gameInstance->GetFrameTime();
|
||||||
walkDirection += forwardDir;
|
walkDirection += forwardDir;
|
||||||
walkDirection.Normalize();
|
|
||||||
}
|
}
|
||||||
if(key_backward > 0.001)
|
if(key_backward > 0.001)
|
||||||
{
|
{
|
||||||
key_backward -= gameInstance->GetFrameTime();
|
key_backward -= gameInstance->GetFrameTime();
|
||||||
walkDirection -= forwardDir;
|
walkDirection -= forwardDir;
|
||||||
walkDirection.Normalize();
|
|
||||||
}
|
}
|
||||||
if(key_strafeRight > 0.001)
|
if(key_strafeRight > 0.001)
|
||||||
{
|
{
|
||||||
key_strafeRight -= gameInstance->GetFrameTime();
|
key_strafeRight -= gameInstance->GetFrameTime();
|
||||||
walkDirection -= rightDir;
|
walkDirection += rightDir;
|
||||||
walkDirection.Normalize();
|
|
||||||
}
|
}
|
||||||
if(key_strafeLeft > 0.001)
|
if(key_strafeLeft > 0.001)
|
||||||
{
|
{
|
||||||
key_strafeLeft -= gameInstance->GetFrameTime();
|
key_strafeLeft -= gameInstance->GetFrameTime();
|
||||||
walkDirection += rightDir;
|
walkDirection -= rightDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dampen velocity if certain keys are not pressed
|
||||||
|
if(key_jump <= 0.001 && this->rigidBody->GetLambda() < 0.9f)
|
||||||
|
{
|
||||||
|
if(key_forward <= 0.001 && key_backward <= 0.001)
|
||||||
|
{
|
||||||
|
forwardVelocity *= Oyster::Math::Float3(0.2f*fabs(forwardDir.x), 0.2f*fabs(forwardDir.y), 0.2f*fabs(forwardDir.z));
|
||||||
|
}
|
||||||
|
if(key_strafeRight <= 0.001 && key_strafeLeft <= 0.001)
|
||||||
|
{
|
||||||
|
rightVelocity *= Oyster::Math::Float3(0.2f*fabs(rightDir.x), 0.2f*fabs(rightDir.y), 0.2f*fabs(rightDir.z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Walk if walkdirection is something
|
||||||
|
if(walkDirection != Oyster::Math::Float3::null)
|
||||||
|
{
|
||||||
walkDirection.Normalize();
|
walkDirection.Normalize();
|
||||||
maxSpeed = 40;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// If on the ground, accelerate normally
|
||||||
if (key_forward <= 0.001 && key_backward <= 0.001 && key_strafeRight <= 0.001 && key_strafeLeft <= 0.001 && key_jump <= 0.001 && this->rigidBody->GetLambda() < 0.7f)
|
if(this->rigidBody->GetLambda() < 0.9f)
|
||||||
{
|
{
|
||||||
/* Dampen when on the ground and not being moved by the player */
|
if(forwardSpeed < maxSpeed)
|
||||||
linearVelocity *= 0.2f;
|
{
|
||||||
this->rigidBody->SetLinearVelocity (linearVelocity);
|
forwardVelocity += walkDirection*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)) * walkSpeed;
|
||||||
}
|
}
|
||||||
else
|
if(rightSpeed < maxSpeed)
|
||||||
{
|
{
|
||||||
if (speed < maxSpeed && this->rigidBody->GetLambda() < 1.0f)
|
rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), abs(rightDir.y), fabs(rightDir.z)) * walkSpeed;
|
||||||
{
|
|
||||||
Oyster::Math::Float3 velocity = linearVelocity + walkDirection * walkSpeed;
|
|
||||||
this->rigidBody->SetLinearVelocity(velocity);
|
|
||||||
}
|
}
|
||||||
else if(speed < maxSpeed)
|
}
|
||||||
|
// If in the air, accelerate slower
|
||||||
|
if(this->rigidBody->GetLambda() >= 0.9f)
|
||||||
{
|
{
|
||||||
Oyster::Math::Float3 velocity = linearVelocity + (walkDirection * walkSpeed)*0.2f;
|
if(forwardSpeed < maxSpeed)
|
||||||
this->rigidBody->SetLinearVelocity(velocity);
|
{
|
||||||
|
forwardVelocity += walkDirection*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)) * walkSpeed*0.2f;
|
||||||
|
}
|
||||||
|
if(rightSpeed < maxSpeed)
|
||||||
|
{
|
||||||
|
rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)) * walkSpeed*0.2f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adjust velocities so no squaring occurs
|
||||||
|
forwardVelocity *= Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z));
|
||||||
|
rightVelocity *= Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z));
|
||||||
|
upVelocity *= Oyster::Math::Float3(fabs(upDir.x), fabs(upDir.y), fabs(upDir.z));
|
||||||
|
|
||||||
|
this->rigidBody->SetLinearVelocity(forwardVelocity+rightVelocity+upVelocity);
|
||||||
|
|
||||||
|
//Jump
|
||||||
if(key_jump > 0.001)
|
if(key_jump > 0.001)
|
||||||
{
|
{
|
||||||
this->key_jump -= this->gameInstance->GetFrameTime();
|
this->key_jump -= this->gameInstance->GetFrameTime();
|
||||||
if(this->rigidBody->GetLambda() < 1.0f)
|
if(this->rigidBody->GetLambda() < 0.9f)
|
||||||
{
|
{
|
||||||
Oyster::Math::Float3 up = this->rigidBody->GetState().GetOrientation().v[1].GetNormalized();
|
Oyster::Math::Float3 up = this->rigidBody->GetState().centerPos.GetNormalized();
|
||||||
this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass*20);
|
this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass*20);
|
||||||
this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING;
|
this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Oyster::Math::Float3 pos = this->rigidBody->GetState().centerPos;
|
|
||||||
if(pos == Oyster::Math::Float3(0,0,0))
|
|
||||||
int i =0;
|
|
||||||
|
|
||||||
//this->weapon->Update(0.01f);
|
//this->weapon->Update(0.01f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::EndFrame()
|
void Player::EndFrame()
|
||||||
{
|
{
|
||||||
// snap to axis
|
|
||||||
Oyster::Math::Float4 rotation;
|
|
||||||
|
|
||||||
this->rigidBody->SetUp(this->rigidBody->GetState().centerPos.GetNormalized());
|
|
||||||
|
|
||||||
//Object::EndFrame();
|
//Object::EndFrame();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::Move(const PLAYER_MOVEMENT &movement)
|
void Player::Move(const PLAYER_MOVEMENT &movement)
|
||||||
|
@ -235,13 +269,10 @@ void Player::Rotate(const Oyster::Math3D::Float3& lookDir, const Oyster::Math3D:
|
||||||
// this is the camera right vector
|
// this is the camera right vector
|
||||||
this->lookDir = lookDir;
|
this->lookDir = lookDir;
|
||||||
|
|
||||||
//Oyster::Math::Float3 up = this->rigidBody->GetState().GetOrientation().v[1];
|
|
||||||
//this->rigidBody->SetUpAndRight(up, right);
|
|
||||||
}
|
}
|
||||||
void Player::TurnLeft(Oyster::Math3D::Float deltaRadians)
|
void Player::TurnLeft(Oyster::Math3D::Float deltaRadians)
|
||||||
{
|
{
|
||||||
this->rotationUp += deltaRadians;
|
this->rotationUp += deltaRadians;
|
||||||
this->rigidBody->SetRotationAsAngularAxis(Oyster::Math3D::Float4(this->rigidBody->GetState().centerPos.GetNormalized(), this->rotationUp));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::Jump()
|
void Player::Jump()
|
||||||
|
|
|
@ -168,9 +168,15 @@ void SimpleRigidBody::SetRotationAsAngularAxis(::Oyster::Math::Float4 angularAxi
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float s = sin(angularAxis.w/2);
|
||||||
|
float x = angularAxis.x * s;
|
||||||
|
float y = angularAxis.y * s;
|
||||||
|
float z = angularAxis.z * s;
|
||||||
|
float w = cos(angularAxis.w/2);
|
||||||
|
|
||||||
btTransform trans;
|
btTransform trans;
|
||||||
btVector3 vector(angularAxis.x, angularAxis.y, angularAxis.z);
|
btVector3 vector(angularAxis.x, angularAxis.y, angularAxis.z);
|
||||||
btQuaternion quaternion(vector, angularAxis.w);
|
btQuaternion quaternion(x,y,z,w);
|
||||||
|
|
||||||
trans = this->rigidBody->getWorldTransform();
|
trans = this->rigidBody->getWorldTransform();
|
||||||
trans.setRotation(quaternion);
|
trans.setRotation(quaternion);
|
||||||
|
@ -263,22 +269,11 @@ Float4x4 SimpleRigidBody::GetRotation() const
|
||||||
Float4 SimpleRigidBody::GetRotationAsAngularAxis()
|
Float4 SimpleRigidBody::GetRotationAsAngularAxis()
|
||||||
{
|
{
|
||||||
Float4 axis = Float4::null;
|
Float4 axis = Float4::null;
|
||||||
Float s = sqrtf(1 - this->state.quaternion.real*this->state.quaternion.real);
|
btTransform trans;
|
||||||
|
|
||||||
axis.w = 2*acos(this->state.quaternion.real*this->state.quaternion.real);
|
trans = this->rigidBody->getWorldTransform();
|
||||||
|
axis.xyz = trans.getRotation().getAxis();
|
||||||
if(1 - this->state.quaternion.real > 0.001f)
|
axis.w = trans.getRotation().getAngle();
|
||||||
{
|
|
||||||
axis.x = this->state.quaternion.imaginary.x/s;
|
|
||||||
axis.y = this->state.quaternion.imaginary.y/s;
|
|
||||||
axis.z = this->state.quaternion.imaginary.z/s;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
axis.x = this->state.quaternion.imaginary.x;
|
|
||||||
axis.y = this->state.quaternion.imaginary.y;
|
|
||||||
axis.z = this->state.quaternion.imaginary.z;
|
|
||||||
}
|
|
||||||
|
|
||||||
return axis;
|
return axis;
|
||||||
}
|
}
|
||||||
|
@ -353,7 +348,8 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld)
|
||||||
{
|
{
|
||||||
btTransform xform;
|
btTransform xform;
|
||||||
xform = this->rigidBody->getWorldTransform ();
|
xform = this->rigidBody->getWorldTransform ();
|
||||||
btVector3 down = -xform.getBasis()[1];
|
Float3 normalDown = -this->state.centerPos.GetNormalized();
|
||||||
|
btVector3 down(normalDown.x, normalDown.y, normalDown.z);
|
||||||
btVector3 forward = xform.getBasis()[2];
|
btVector3 forward = xform.getBasis()[2];
|
||||||
down.normalize ();
|
down.normalize ();
|
||||||
forward.normalize();
|
forward.normalize();
|
||||||
|
@ -361,12 +357,17 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld)
|
||||||
this->raySource[0] = xform.getOrigin();
|
this->raySource[0] = xform.getOrigin();
|
||||||
this->raySource[1] = xform.getOrigin();
|
this->raySource[1] = xform.getOrigin();
|
||||||
|
|
||||||
|
if(this->state.reach.y < 1.0f)
|
||||||
|
|
||||||
|
|
||||||
Float angle = acos(Float3(0, 1, 0).Dot(this->state.centerPos.GetNormalized()));
|
Float angle = acos(Float3(0, 1, 0).Dot(this->state.centerPos.GetNormalized()));
|
||||||
down.setZ(-down.z());
|
//down.setZ(-down.z());
|
||||||
down.setX(-down.x());
|
|
||||||
btVector3 targetPlus = down * this->state.reach.y * btScalar(1.1);
|
btVector3 targetPlus = down * this->state.reach.y * btScalar(1.1);
|
||||||
|
|
||||||
|
if(this->state.mass == 40)
|
||||||
|
{
|
||||||
|
const char* breakpoint = "STOP";
|
||||||
|
}
|
||||||
|
|
||||||
this->rayTarget[0] = this->raySource[0] + targetPlus;
|
this->rayTarget[0] = this->raySource[0] + targetPlus;
|
||||||
this->rayTarget[1] = this->raySource[1] + forward * this->state.reach.y * btScalar(1.1);
|
this->rayTarget[1] = this->raySource[1] + forward * this->state.reach.y * btScalar(1.1);
|
||||||
|
@ -383,7 +384,6 @@ void SimpleRigidBody::PreStep (const btCollisionWorld* collisionWorld)
|
||||||
{
|
{
|
||||||
if (rayResult.m_collisionObject == m_me)
|
if (rayResult.m_collisionObject == m_me)
|
||||||
return 1.0;
|
return 1.0;
|
||||||
|
|
||||||
return ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace);
|
return ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace);
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
|
|
Loading…
Reference in New Issue