3
我正在製作關於2D遊戲中的自上而下游戲的遊戲項目。我想自己管理所有的物理。我正在使用本書:http://www.amazon.fr/Game-Physics-Engine-Development-Commercial-Grade/dp/來實現物理。物理在視頻遊戲中,在角加速度上應用扭矩
從現在起,我的物理引擎可以處理不同軸上的力。但是我有一些問題需要實現正確的旋轉模擬。我試圖實現一些扭矩來找到角加速度。所以,我實現了一個慣性張量矩陣:
setMass(400.f);
Matrix3 it;
it.setBlockInertiaTensor(Vector3(2, 1, 1), 400);
setInertiaTensor(it);
void setBlockInertiaTensor(const Vector3 &halfSizes, float mass)
{
Vector3 squares = halfSizes.componentProduct(halfSizes);
setInertiaTensorCoeffs(0.3f*mass*(squares.y + squares.z),
0.3f*mass*(squares.x + squares.z),
0.3f*mass*(squares.x + squares.y));
}
施加扭矩我在我的車的車身點施加一個力,我覺得由一個跨產品的扭矩:
player->addForceAtBodyPoint(Vector3(-2000, 1000, 0), Vector3(0, 100, 0));
void AObject::addForceAtBodyPoint(const Vector3 &force, const Vector3 &point)
{
Vector3 pt = getPointInWorldSpace(point);
addForceAtPoint(force, pt);
}
void AObject::addForceAtPoint(const Vector3 &force,
const Vector3 &point)
{
// Convert to coordinates relative to center of mass.
Vector3 pt = point;
pt -= _position;
_forceAccumulate += force;
_torqueAccumulate += pt % force;
//std::cout << "torque x " << pt.x << " y " << pt.y << " z "<< pt.z << std::endl;
}
Vector3 Vector3::operator%(const Vector3 &vector) const
{
return Vector3(y*vector.z - z*vector.y,
z*vector.x - x*vector.z,
x*vector.y - y*vector.x);
}
(模數%是叉積)
最後,我做我的整合所有的數據:
void Player::integrate(float deltaTime)
{
addForce(_velocity * -150.0f);
// Calculate linear acceleration from force inputs.
_lastFrameAcceleration = _acceleration;
_lastFrameAcceleration.addScaledVector(_forceAccumulate, _inverseMass);
// Calculate angular acceleration from torque inputs.
Vector3 angularAcceleration = _inverseInertiaTensorWorld.transform(_torqueAccumulate);
// Update linear velocity from acceleration .
_velocity.addScaledVector(_lastFrameAcceleration, deltaTime);
// Update angular velocity from acceleration .
_rotation.addScaledVector(angularAcceleration, deltaTime);
// Impose drag.
_velocity *= pow(_linearDamping, deltaTime);
_rotation *= pow(_angularDamping, deltaTime);
// Update linear position.
_position.addScaledVector(_velocity, deltaTime);
_position.z = 0;
// Update angular position
_orientation.addScaledVector(_rotation, deltaTime);
// Normalise the orientation, and update the matrice
calculateWorldLocalData();
// Clear accumulators.
clearAccumulator();
}
方向根本不起作用。我不擅長物理的東西,所以我認爲我誤解了慣性張量扭矩的物理實現...
閱讀http://gafferongames.com/game-physics/physics-in-3d/和http://gafferongames.com/game-physics/integration-basics/也許這將有所幫助。 – rashmatash 2014-10-03 11:11:51