Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;反向矢量TL发动机_C++_Vector Graphics - Fatal编程技术网

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