首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++反向向量TL引擎

C++反向向量TL引擎
EN

Stack Overflow用户
提问于 2012-01-20 02:37:18
回答 2查看 452关注 0票数 0

在我的游戏中,当碰撞发生时,我遇到了一些问题,当碰撞发生时,我需要做的是每次大理石击中物体时,将当前值反转为当前值的倒数。向量是我需要反转的方向,以使反弹看起来逼真。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-20 02:52:42

所以你说的是数学意义上的向量,而不是容器。我们仍然假设你已经用一个std::vector<fieldT>实现了它,比如typedef double fieldT。你似乎想要通过一些障碍来反映方向。当“镜像”位于一个基向量的方向上时,这很容易,然后你只需要否定那个分量-一个xy平面上的“镜像”(在3D中)就可以了

代码语言:javascript
复制
v[2] = -v[2];

也就是说,反转z分量,在yz平面中它将是

代码语言:javascript
复制
v[0] = -v[0];

如果反射发生在任意方向上,情况就会变得更加复杂。一种可能性是确定平面方向上的速度分量-这是通过计算速度向量和平面法向量之间的标量积-然后减去法向量的两倍,并用该因子加权。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-01-20 10:07:06

以下是用于计算平面和刚性曲面的挠度的代码。

CurrentVelocity是将偏离曲面的对象的速度。CollisionNormal是表示进行偏转的曲面的法线的向量。下面的代码返回了假设瞬间偏转的新速度。

代码语言:javascript
复制
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));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8931434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档