C++反向矢量TL引擎
C++ reverse vectors TL engine
当发生碰撞时,我在游戏中反转矢量时遇到了一些问题,我需要做的是每次大理石击中物体时将值翻转为当前值的倒数。矢量是我需要反转的方向,以使的反弹看起来逼真。
所以你所说的是数学意义上的向量,而不是容器。让我们仍然假设您已经用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];
一种更通用的方法是通过矩阵应用对反射进行建模:反射本质上是正交线性映射的应用。
以下是计算平面和刚性表面偏转的代码。
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));
}
相关文章:
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- Unity在虚幻引擎4中的"Vector3.Slerp"等效C++?
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- 在虚幻引擎中删除NXOpen对象时崩溃
- 引擎节点:未定义的符号:_ZTV6Config
- Agora.io 虚幻引擎插件构建错误
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 无法在 Arch Linux 中启动虚幻引擎 4
- 在虚幻引擎中触发C++ dll的事件
- 在 C/C++ 中加载 OpenSSL 自定义引擎
- 组件上的虚幻引擎可蓝图UFUNCTION会导致构建错误
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- 提高基于组件的游戏引擎的效率
- 在C++中嵌入 Mozilla 的 JavaScript 引擎
- 如何在虚幻引擎4中将char*转换为TCHAR?
- 如何将外部代码包含在虚幻引擎4 C++项目中
- 如何使用虚幻引擎"filter"多播?
- 我可以在没有Xcode的情况下在Mac上使用带有C++的虚幻引擎吗?
- 虚幻引擎C++生成演员错误
- C++反向矢量TL引擎