C ++反向向量TL引擎

时间:2012-01-19 18:37:18

标签: c++ vector-graphics

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

2 个答案:

答案 0 :(得分:1)

所以你所说的是数学意义上的向量,而不是容器。我们仍然假设您使用std::vector<fieldT>实现了它,例如typedef double fieldT。你似乎想要通过一些障碍反映出方向。当“镜子”位于你的一个基础向量的方向时很容易,那么你只需要否定那个组件 - xy -plane(在3D中)的“镜像”就可以了

v[2] = -v[2];

即。翻转 z - 组件,在 yz -plane中它将是

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];

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

答案 1 :(得分: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));
}