2012-01-19 51 views
0

當碰撞發生時,我在遊戲中顛倒我的向量時遇到了一些麻煩,我需要做的就是每次大理石碰到物體時將值翻轉爲當前值的倒數。這些矢量是我需要反轉的方向,以使得看起來逼真的反彈。C++逆向矢量TL引擎

+0

用-1乘以向量? – larsmoa

+0

我已經爲X,Y和Z動作做過這個動作,但是現在它反彈到了地板上。 – bobthemac

+0

難道大理石應該是反彈的牆壁,而不是僅僅反向? –

回答

1

所以你說的是數學意義上的矢量,而不是容器。我們仍然假定您已經使用std::vector<fieldT>來實現它,例如, typedef double fieldT。你似乎想要讓方向反映出一些障礙。這很容易當「鏡子」就在你的基礎載體的一個方向,那麼你只需要否定該組件 - 在XY - 平面(三維)的「鏡像」會做

v[2] = -v[2]; 

即翻轉ž -component,在YZ - 平面那就

v[0] = -v[0]; 

它得到,如果發生在任意方向上的反射更加複雜。一種可能性是確定平面方向上的速度分量 - 這是通過計算速度向量和平面法向量之間的標量積來完成的 - 然後減去法向量的兩倍,用該因子加權。

std::vector<fieldT> n // normal vector of the plane 
        , v // speed vector 
        ; 

fieldT eta=0; 
for (unsigned i=0; i<n.size(); ++i)  //scalar product between v and n 
    eta += v[i]*n[i]; 
for (unsigned i=0; i<n.size(); ++i)  //substract twice the weighted normal vector 
    v[i] -= 2*eta*n[i]; 

一個更普遍的方法是通過建模矩陣應用反射:反射基本上是正交的線性映射的應用程序。

0

下面是計算平坦和剛性表面偏轉的代碼。

CurrentVelocity是將偏離表面的物體的速度。 CollisionNormal是表示做偏轉的表面法線的向量。 下面的代碼返回假設瞬時偏轉的新速度。

Vector3 CalculateDeflection(const Vector3& CurrentVelocity, const Vector3& CollisionNormal) 
{ 
    Vector3 newVelocity = (-2 * Vector3.Dot(CurrentVelocity, CollisionNormal) * CollisionNormal + CurrentVelocity); 

    return newVelocity; 
} 

float Vector3::Dot(const Vector3& lhs, const Vector3& rhs) 
{ 
    return ((lhs.X * rhs.X) + (lhs.Y * rhs.Y) + (lhs.Z * rhs.Z)); 
}