【发布时间】:2019-03-22 14:40:22
【问题描述】:
我正在尝试创建客户端-服务器架构。我被困在插值部分。现在,我有一个非常幼稚的插值算法实现。我让每个玩家都有一个位置历史记录,每当我从服务器收到其他玩家的位置数据时,我都会将该位置推送到该数组中。我使用最旧的位置历史记录以恒定速度插入到新位置的每个客户端框架。
// when new position for other player recieved
p.stateHistory.push(data)
// Every client frame
if(p.stateHistory.length < 1)
return false
let deltaPosition = p.stateHistory[0].position.clone().sub(p.clientPosition)
let direction = Math.atan2(deltaPosition.y, deltaPosition.x)
let velocity = new Vector2(Math.cos(direction), Math.sin(direction)).scale(30/100)
let threshold = 10
if(deltaPosition.magnitude() < threshold) {
p.clientPosition.x = p.stateHistory[0].position.x
p.clientPosition.y = p.stateHistory[0].position.y
p.stateHistory.shift()
} else {
p.clientPosition.add(velocity.clone().scale(deltaTime))
}
我找不到其他方法以恒定速度进行插值。我从 gafferongames 开始了解 Hermite 插值。但很遗憾,这篇文章没有任何关于它的数学和实现的信息。我试图通过关于 Hermite 插值的维基百科文章,但它没有帮助。我对它背后的数学一无所知。一个伪代码将不胜感激。
到目前为止我能做到的事情:http://client-side-prediction-attempt.herokuapp.com/
【问题讨论】:
-
不频繁的更新需要插值吗?你知道客户端会落后于服务器吗?
-
服务器tick设置为100ms,所以我觉得有必要。是的,我知道由于插值,客户端会落后于服务器。现在,我只希望一切都显得顺利。
-
你知道你从服务器获得的新点的速度吗?如果没有,你希望它如何表现?你对潜在的运动有一些了解吗(例如,速度是恒定的,只有方向改变)?
-
我认为 Hermite 的插值不需要我发送速度。不过我确实寄给他们。速度的大小也会发生变化。
标签: javascript node.js algorithm networking hermite