Это выглядит довольно разумно для меня, и я использовал подобные шаблоны в прошлом.
Структурирование синхронизированных симуляций - огромная тема, но то, что у вас есть, является хорошей отправной точкой и может быть достаточно в зависимости от сложности вашей игры.
редактировать: немного подробнее ...
Да, он работает одинаково, за исключением того, что this.dt всегда одинаков. т. е. 1000 / желаемый FPS для игрового цикла.
Если вы хотите выполнить сглаживание / интерполяцию между кадрами ... вам также нужно будет записать предыдущее состояние вашего объекта ... и вы, вероятно, не захотите использовать вращения Эйлера, поскольку Эйлер не не интерполировать хорошо. потому что угол 360 градусов, переворачивается на 0, поэтому логика интерполяции становится странной ...
Но вместо этого ... вы можете записать состояние до и после обновления ...
и вместо этого интерполируйте .quaternion .. который при небольших изменениях вращения прекрасно работает только с линейной интерполяцией .. Если изменения слишком велики, вы можете использовать quaternion.slerp (), который может обрабатывать интерполяцию на большие расстояния.
Итак, у вас есть lastTickTime, currentTime и nextTickTime ....
каждый кадр .. вы делаете что-то вроде:
Для интерполяции вы делаете что-то вроде:
var alpha= (currentTime-lastTickTime) / (nextTickTime-lastTickTime);//nextTickTime-lastTickTime = your framerate delta so for 60fps = 1000/60 = 16.666666666666668
var recip = 1.0 - alpha;
object.position.x = (object.lastPosition.x * recip)+(object.nextPosition.x*alpha)
object.position.y = (object.lastPosition.y * recip)+(object.nextPosition.y*alpha)
object.position.z = (object.lastPosition.z * recip)+(object.nextPosition.z*alpha)
object.scale.x = (object.lastScale.x * recip)+(object.nextScale.x*alpha)
object.scale.y = (object.lastScale.y * recip)+(object.nextScale.y*alpha)
object.scale.z = (object.lastScale.z * recip)+(object.nextScale.z*alpha)
object.quaternion.x = (object.lastQuaternion.x * recip)+(object.nextQuaternion.x*alpha)
object.quaternion.y = (object.lastQuaternion.y * recip)+(object.nextQuaternion.y*alpha)
object.quaternion.z = (object.lastQuaternion.z * recip)+(object.nextQuaternion.z*alpha)
object.quaternion.w = (object.lastQuaternion.w * recip)+(object.nextQuaternion.w*alpha)
В правильных трех приложениях вам, вероятно, не следует хранить lastPosition и nextPosition непосредственно на объекте, а вместо этого помещать его в object.userData, но как бы то ни было ... оно, вероятно, все еще будет работать ..