【问题标题】:Why does this DirectX 10 "D3DXVec3Lerp" function return invalid numbers?为什么这个 DirectX 10“D3DXVec3Lerp”函数返回无效数字?
【发布时间】:2017-11-25 00:53:59
【问题描述】:

以下代码有问题:

//Make life easier by assigning the last two relevant messages to variables
Update pos0 = m_Network->positionUpdates[m_Network->positionUpdates.size() - 1];
Update pos1 = m_Network->positionUpdates[m_Network->positionUpdates.size() - 2];

//Calculate velocities for X and Z from last two messages
velX = (pos0.posX - pos1.posX) / (pos0.timeStamp - pos1.timeStamp);
velZ = (pos0.posZ - pos1.posZ) / (pos0.timeStamp - pos1.timeStamp);

//Calculate the time for when we are trying to predict
predictionTime = totalTime - pos0.timeStamp;

//Linear prediction model to calculate where we want the car to be
D3DXVECTOR3 newPos = D3DXVECTOR3((pos0.posX + velX * predictionTime), 2.0f, (pos0.posZ + velZ * predictionTime));
//Interpolate to the new position
D3DXVec3Lerp(&position, &position, &newPos, timeSinceLastFrame);

//Set the model to where the car is
m_Model->SetPosition(position.x, position.y, position.z);

如您所见,这个想法是获取从另一个客户端收到的消息,并找到对象的速度以计算其位置。

我知道那部分是有效的,因为当我简单地将汽车的位置更新为方程的输出时,汽车会去它应该去的地方(以一种非常紧张的方式)。

当我尝试从当前位置移动到新位置时,汽车甚至没有出现在屏幕上。查看 Ve3Lerp 函数实际返回的内容,我得到的只是“-1 INDEF”。

有什么想法吗?

【问题讨论】:

  • timeSinceLastFrame 是 int 还是 float?是否以毫秒为单位?可能就是这样。
  • 它是一个浮点数,时间以秒为单位(即0.016)
  • 您可以尝试将不同的向量作为第一个参数传递。由于第二个被标记为 const 它可能会做一些奇怪的事情,如果它碰巧正在修改第一个而期望第二个不会改变。
  • 刚刚试了一下,但没有任何作用,尽管欢呼,但还是不错的建议。
  • 请记住,D3DXmath 是旧版,需要在您的目标系统上部署已弃用的 D3DX9D3DX10D3DX11 DLL。请参阅 MSDNLiving without D3DX。此外,没有理由使用 Direct3D 10。请改用 DirectX 11。

标签: c++ directx-10 lerp


【解决方案1】:

哇!我想通了。

在第二个客户端上的汽车开始移动之前,它位于 0.0f、0.0f、0.0f。所以前几个位置更新就是这样完成的,导致这段代码尝试除以 0 来得到 velX 和 velY。

当然,由于我们总是在位置之间徘徊,这搞砸了未来的每一个位置,即使在得到适当的值来计算之后也是如此。

我通过这样做解决了这个问题 -

if ((isnan(newPos.x) == false) && (isnan(newPos.z) == false)) {
    D3DXVec3Lerp(&position, &position, &newPos, predictionTime);
    graphicsAngle = pos0.angle;
}

【讨论】:

    猜你喜欢
    • 2014-07-14
    • 2016-03-21
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    相关资源
    最近更新 更多