C++反向矢量TL引擎

C++ reverse vectors TL engine

本文关键字:TL 引擎 C++      更新时间:2023-10-16

当发生碰撞时,我在游戏中反转矢量时遇到了一些问题,我需要做的是每次大理石击中物体时将值翻转为当前值的倒数。矢量是我需要反转的方向,以使的反弹看起来逼真。

所以你所说的是数学意义上的向量,而不是容器。让我们仍然假设您已经用std::vector<fieldT>实现了它,例如typedef double fieldT。你似乎想通过一些障碍物来反映方向。当"镜像"位于基向量的一个方向时,很容易,然后你只需要否定该分量——xy-平面(在3D中)中的"镜像"将执行

v[2] = -v[2];

即翻转z-分量,在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];

一种更通用的方法是通过矩阵应用对反射进行建模:反射本质上是正交线性映射的应用。

以下是计算平面和刚性表面偏转的代码。

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