當碰撞發生時,我在遊戲中顛倒我的向量時遇到了一些麻煩,我需要做的就是每次大理石碰到物體時將值翻轉爲當前值的倒數。這些矢量是我需要反轉的方向,以使得看起來逼真的反彈。C++逆向矢量TL引擎
0
A
回答
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));
}
相關問題
- 1. C++矢量向量
- 2. C++:遍歷矢量向量
- 3. C++向量化矢量向量
- 4. 設計矢量字體引擎
- 5. 矢量圖形的最佳Flash引擎?
- 6. C#逆向FFT#
- 7. C#逆向牀#
- 8. 逆向在C + +
- 9. C++ sigabrt推向矢量
- 10. 矢量矢量C++
- 11. C++中矢量向量中索引的最有效排序
- 12. 逆向引用的反向引用
- 13. 將PowerPC逆向C
- 14. 逆向工程C++
- 15. 在C++中使用向量矢量「unique()」
- 16. 逆向引用在AWK
- 17. 矢量的矢量,C++
- 18. C++矢量矢量故障
- 19. 指向矢量
- 20. C++:向矢量中的非連續索引賦值?
- 21. 刪除矢量向量中的向量C++
- 22. 訪問指向矢量的指針C++
- 23. C++指針分配(指向矢量)
- 24. C++指向矢量的指針
- 25. 雙向矢量問題在c + +
- 26. 從本地C++逆向PInvoke
- 27. 用C++逆向數字
- 28. 地圖C++逆向迭代
- 29. c中的逆向工程#
- 30. C#XNA:AI引擎?
用-1乘以向量? – larsmoa
我已經爲X,Y和Z動作做過這個動作,但是現在它反彈到了地板上。 – bobthemac
難道大理石應該是反彈的牆壁,而不是僅僅反向? –