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