C++ 由位置矢量求速度矢量

C++ 由位置矢量求速度矢量,c++,math,game-physics,C++,Math,Game Physics,我看了一大堆类似的问题,我似乎找不到一个特别能回答我问题的。我正在编写一个简单的3d游戏,我试图让玩家在我的地图上拾取和移动实体。我基本上想要得到一个速度向量,它将把物理物体“推”到离玩家眼睛一段距离的地方,不管他们在看什么。这是在另一个游戏中完成的(玩家在眼前拿着一个椅子实体) 要做到这一点,我要找出玩家的眼睛角度,然后从这些角度得到前向向量,然后计算物体的速度。这是我的工作代码: void Player::PickupOtherEntity( Entity& HoldingEntit

我看了一大堆类似的问题,我似乎找不到一个特别能回答我问题的。我正在编写一个简单的3d游戏,我试图让玩家在我的地图上拾取和移动实体。我基本上想要得到一个速度向量,它将把物理物体“推”到离玩家眼睛一段距离的地方,不管他们在看什么。这是在另一个游戏中完成的(玩家在眼前拿着一个椅子实体)

要做到这一点,我要找出玩家的眼睛角度,然后从这些角度得到前向向量,然后计算物体的速度。这是我的工作代码:

void Player::PickupOtherEntity( Entity& HoldingEntity )
{
    QAngle eyeAngles = this->GetPlayerEyeAngles();
    Vector3 vecPos = this->GetEyePosition();
    Vector3 vecDir = eyeAngles.Forward();

    Vector3 holdingEntPos = HoldingEntity.GetLocation();

    // update object by holding it a distance away
    vecPos.x += vecDir.x * DISTANCE_TO_HOLD;
    vecPos.y += vecDir.y * DISTANCE_TO_HOLD;
    vecPos.z += vecDir.z * DISTANCE_TO_HOLD;

    Vector3 vecVel = vecPos - holdingEntPos;
    vecVel = vecVel.Scale(OBJECT_SPEED_TO_MOVE);

    // set the entity's velocity as to "push" it to be in front of the player's eyes
    // at a distance of DISTANCE_TO_HOLD away
    HoldingEntity.SetVelocity(vecVel);
}

所有这些都很好,但我想转换我的数学,这样我就可以应用冲动。我不想为对象设置一个全新的速度,而是想在其现有速度上“添加”一些速度。假设我有它的流速,我需要什么样的数学来“加”流速?这本质上是一个游戏物理问题。谢谢大家!

一个非常简单的实现可以如下所示:

velocity(t+delta) = velocity(t) + delta * acceleration(t)
acceleration(t) = force(t) / mass of the object
速度、加速度和力是矢量。t、 δ和质量标量


这仅适用于较小且间距相等的三角洲。基本上,你要用它来实现的是用经典力学来模拟物体。

从技术上讲,脉冲是F∆t表示常数F。这里我们可以假设a∆因为质量是不相关的。如果你想给一个冲动设置动画,你必须决定速度的变化应该是什么,需要多长时间。事情很快变得复杂起来

老实说,冲动不是正确的做法。相反,最好设置一个恒定的拾取速度(人们不倾向于使用脉冲拾取东西),并在每次对象提升速度时刷新位置。y,直到它达到正确的水平:

while(entPos.y < holdingEntPos.y)
{
    entPos.y += pickupVel.y;
   //some sort of short delay
}
while(entPos.y
至于漂浮在玩家眼前,设置某种类型的EyeMovementEvent,它也会向玩家持有的任何实体发送正确的位置变化


如果我错过了什么,那就是你已经在做的,记住,当人类施加一个冲动时,通常在很短的时间内,它是非常高的加速度,远小于一帧。不管怎样,你都不会在游戏中看到它。

牛顿/达朗贝尔基本物理学规定:

derivate(position)=velocity
derivate(velocity)=acceleration
而且是向后的:

integrate(acceleration)=velocity
integrate(velocity)=position
因此,对于您的发动机,您可以使用:

矩形求和代替积分(积分的数值解)。定义时间常数
dt[seconds]
,它是更新之间的间隔(计时器或1/fps)。因此,更新代码(必须每隔
dt
定期调用):

vx+=ax*dt;
vy+=ay*dt;
vz+=az*dt;
 x+=vx*dt;
 y+=vy*dt;
 z+=vz*dt;
其中:

  • a{x,y,z}[m/s^2]
    是实际加速度(在您的例子中,方向向量缩放为
    a=力/质量
  • v{x,y,z}[m/s]
    是实际速度
  • x,y,z[m]
    是实际位置

  • 必须将这些值
    a,v
    初始化为零,并
    x,y,z
    初始化为初始位置
  • 所有对象/玩家…都有自己的变量
  • 通过
    v=0;a=0;
  • 仅通过更改
    a
  • 如果发生碰撞,则镜像
    v
    向量通过碰撞
    法线

  • 也许乘以某个
    kVelocity是时间的导数,我有一个有效的投掷函数。我只需要加上一个速度脉冲,让物体在玩家眼前“浮动”。忘了提到,如果玩家转身,物体应该在玩家眼前“浮动”这基本上就是我的代码所做的,但它设置了绝对向量。我需要将其转换为应用脉冲,而不是覆盖其当前速度向量。
    
    vx+=ax*dt+gx*dt;
    vy+=ay*dt+gy*dt;
    vz+=az*dt+gz*dt;