2014-10-03 27 views
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(); 
} 

方向根本不起作用。我不擅長物理的東西,所以我認爲我誤解了慣性張量扭矩的物理實現...

+0

閱讀http://gafferongames.com/game-physics/physics-in-3d/和http://gafferongames.com/game-physics/integration-basics/也許這將有所幫助。 – rashmatash 2014-10-03 11:11:51

回答

1

如果你的遊戲在2D中自上而下,那麼你只能在Z方向旋轉。 I.E.進出屏幕。因此,您可以簡化問題並避免3D張量。在這種情況下,在您的汽車類中,我將擁有一個名爲rotation的私有變量。例如

private: 
    double angle; 
    double tourque; 
public: 
    void updateTorque(*some way of passing forces*) 
    { 
     double total_t = 0; 
     for each force 
     { 
      double t = use cosine and length to point to generate a tourque 
      total_t = t + total_t 
     } 
    } 
    void update_angle // place your integration routine here and call once per loop