У меня проблемы со следующим кодом:
//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».
Есть идеи, что может быть?
Doh! Я понял.
Прежде чем машина второго клиента начала движение, она сидела на отметке 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;
}
Других решений пока нет …