2012-01-19 1 views
0

私は、大理石がオブジェクトに当たるたびに現在の値の逆数に値を反転する必要があるため、衝突が発生したときに自分のベクトルを逆転させるのに何らかの問題を抱えています。ベクタは、見た目のバウンスを現実的にするために逆にする必要のある方向です。C++リバースベクトルTLエンジン

+0

ベクトルに-1を掛けます。 – larsmoa

+0

私はX、Y、Zの動きに対してこれを行ったが、現在は床に跳ね返っている。 – bobthemac

+0

大理石は逆の方向ではなく壁をはね返すことになっていますか? –

答えて

1

あなたが話しているのは、コンテナではなく、数学的な意味でのベクトルです。 std::vector<fieldT>で実装したとします。 typedef double fieldT。あなたは方向をある障害に反映させたいと思うようです。 (3Dで)XY -planeの「ミラー」を

v[2] = -v[2]; 

を行うだろう - 「ミラー」は、あなただけで、そのコンポーネントを否定する必要があり、あなたの基底ベクトルの1の方向にあるとき、それは簡単ですすなわちYZで、Z -componentを反転それは反射が任意の方向に発生した場合、それはより複雑になります

v[0] = -v[0]; 

だろう-plane。 1つの可能性は、速度ベクトルと平面の法線ベクトルとの間のスカラー積を計算することによって行われる、平面の方向の速度成分を決定し、次いで、その因子で重み付けされた法線ベクトルの2倍を引くことである。

より一般的なアプローチは、マトリクスアプリケーションによるリフレクションをモデル化することです。リフレクションは基本的に直交線形マッピングの適用です。

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)); 
}