C++ C++;反向矢量TL发动机
在我的游戏中,当发生碰撞时,我在反转向量时遇到了一些问题。我需要做的是,每次大理石撞击对象时,将值反转为当前值的倒数。向量是我需要反转的方向,以使反弹看起来逼真。所以你所说的是数学意义上的向量,而不是容器。我们仍然假设您已经用C++ C++;反向矢量TL发动机,c++,vector-graphics,C++,Vector Graphics,在我的游戏中,当发生碰撞时,我在反转向量时遇到了一些问题。我需要做的是,每次大理石撞击对象时,将值反转为当前值的倒数。向量是我需要反转的方向,以使反弹看起来逼真。所以你所说的是数学意义上的向量,而不是容器。我们仍然假设您已经用std::vector实现了它,例如typedef双字段t。你似乎想通过一些障碍物来反映方向。当“镜像”位于一个基向量的方向上时,很容易,然后只需对该分量求反即可–xy平面(3D)中的“镜像”即可 i、 e.翻转z组件,在yz平面中 v[0] = -v[0]; 如果反射发
std::vector
实现了它,例如typedef双字段t
。你似乎想通过一些障碍物来反映方向。当“镜像”位于一个基向量的方向上时,很容易,然后只需对该分量求反即可–xy平面(3D)中的“镜像”即可
i、 e.翻转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];
std::vector n//平面的法向量
,v//速度矢量
;
fieldT eta=0;
对于(无符号i=0;i,以下是计算平面和刚性曲面偏转的代码
CurrentVelocity
是将偏离曲面的对象的速度。
碰撞法线
是表示进行偏转的曲面法线的向量。
下面的代码返回假定瞬时偏转的新速度
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?我已经对X、Y和Z运动进行了此操作,但目前它会反弹到地板上。可能是因为大理石应该反弹到墙壁上,而不仅仅是反转方向吗?通过反转X、Y、Z方向向量,它会产生与墙壁反弹一样的效果。
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));
}