在我的游戏中,当碰撞发生时,我遇到了一些问题,当碰撞发生时,我需要做的是每次大理石击中物体时,将当前值反转为当前值的倒数。向量是我需要反转的方向,以使反弹看起来逼真。
发布于 2012-01-20 02:52:42
所以你说的是数学意义上的向量,而不是容器。我们仍然假设你已经用一个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];一种更一般的方法是通过矩阵应用对反射进行建模:反射本质上是正交线性映射的应用。
发布于 2012-01-20 10:07:06
以下是用于计算平面和刚性曲面的挠度的代码。
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));
}https://stackoverflow.com/questions/8931434
复制相似问题