Articles of 插值

内插旋转的对象

我终于有了插值工作来“平滑”运动,但是对于旋转的物体(在他们自己的中心附近)似乎不起作用 – 当我尝试这样做时,所讨论的物体会“摆动”。 注意:我不是在说插入实际的旋转,而是在旋转的物体的移动 所以,假设我有一个从左到右的对象。 使用下面的代码(与插值),它移动很好,顺利。 但是,在旋转物体(假设为45度,但可以是任意角度)之后,它不再平稳移动,它仍然沿着它的path(在这种情况下从左到右)移动,但不再平滑。 主游戏循环 @Override public void onDrawFrame(GL10 gl) { //Grab time newTime = System.currentTimeMillis()*0.001; frameTime = newTime – currentTime; if ( frameTime > (dt*25)) frameTime = (dt*25); currentTime = newTime; accumulator += frameTime; //Save game-state and update logic while (accumulator >= dt){ saveGameState(); //Back up positions before updating them updateLogic(); […]

努力阻止网状小行星的插值

问题:当我们用插值绘图时,碰撞检测代码应该在哪里? 在以下情况下值得实施插值吗? 这是滚动的小行星。 目前我的游戏没有内插工作。 它使用固定步长时间增量进行物理更新。 帧显示速率与此分离。 所以,它可能是每秒钟进行40次物理更新和每秒75帧的绘制。 到目前为止,我在物理更新例程中做了碰撞检测和响应。 你的船可能会碰到一块岩石。 你的光子(子弹)可以与岩石相撞。 现在我正在考虑改进它使用插值按照所有好的文章推荐: deWiTTERS Game Loop 和 http://gafferongames.com/game-physics/fix-your-timestep/ 所以当这个被实现的时候,我可能会做以下的调用: update(dt) draw(0.24) draw(0.64) update(dt) draw(0.24) draw(0.76) 显示的浮点数是实际计算的插值的例子,即在绘制帧时完成的物理更新的比例。 我将不得不改变绘制代码,以绘制物体在他们以前的和当前的价值位置和旋转之间的距离的一小部分。 这还没有完成。 问题:我还必须将我的碰撞检测代码移出更新例程并进入绘制例程,看到我将绘制这些插值帧吗? 请记住,我最重要的目标是使这种networking化:多个玩家尽可能大的宇宙。 所以物理更新解决scheme与所需的networking游戏兼容。 插值是值得的吗? 马上。 我很less看到光滑的问题。 如果我把我的物理更新减less到每秒25次,而我只是做了一个实验,那么它有点生涩。 但是游戏的运行速度比较快,所以可能永远不会有问题。 所以这两个问题: 碰撞检测在哪里? 正在引入值得努力的插值还是应该立即进入联网版本? 非常感谢:

基于定时器来提供一个对象

我试图根据计时器在两个对象之间建立一个目标lerp。 目前,我有以下代码: float distCovered = (Time.time – waitTime) * speed; float fracJourney = distCovered / journeyLength; if (_moveDown == false) { if (startTime + waitTime < Time.time) { transform.position = Vector3.Lerp(start.position, end.position, fracJourney); if (transform.position == end.position) { Debug.Log("going down"); _moveDown = true; transform.position = Vector3.Lerp(end.position, start.position, fracJourney); } } } if (_moveDown == true) […]

360度四元数插值?

在阅读臭名昭着的“修复你的时间步”文章 (这是令人惊讶的)之后,我正在执行一个简单的游戏循环插补过程。 我有位置插值工作正常,从我可以告诉,但是,当试图实现插值旋转使用three.js的四元数对象的斯莱普方法我遇到奇怪的行为。 现在发生的事情是,只要你试图旋转360度,你就会停在180度的范围内。 看着控制台日志的输出,它似乎正在试图旋转过去这一点,但随后正在重新设置。 这似乎很奇怪,但也许有一些我正在做的事情是奇怪的? 更新:这个场景的一个工作示例可以在这里find: https : //stashcube.com/stackexamples/quaternion-interpolation/ // Run the main game loop as fast as we can setInterval(function(){ var newTime = (+new Date()) / 1000.0; world.renderDeltaTime = (newTime – world.currentTime); world.totalRenderRunTime += world.renderDeltaTime; // Increment world.physicsAccumulator by world.renderDeltaTime. If it takes longer than // a quarter of a second for a […]

多人游戏中的可延迟的延迟范围

我正在编程一个多人游戏。 我以毫秒计算ping: ping = the_time_i_recieved_pong – the_time_i_sent_ping 我实现了客户端预测和插值algorithm。 当我和朋友们一起testing游戏的时候,对于那些在100ms以下的游戏者来说,这样的游戏效果相当不错,但是在120ms之后,他们告诉我这些游戏变得无法玩了。 所以我的问题是,我应该尝试在超过120毫秒的延迟时间内改善客户的游戏体验(是否超过120毫秒被认为是可以容忍的)? 谢谢你们 ! 注:我的游戏是一个快节奏的游戏,所以滞后赔偿很重要。

实时多人游戏服务器,插值和预测validation

我正在为Facebook构建一个基于HTML5 / Websockets的多人游戏canvas游戏,而且现在我已经在为服务器代码工作了几天。 虽然游戏非常简单,自上而下的2D,WSAD控制和鼠标点击发射到光标x / y – 我从来没有做过实时多人游戏。 我已经阅读了一些优秀的文档,但是我希望能够概述我对这个主题的一般理解,并且有人可以validation这个方法和/或指出需要改进的地方。 权威的多人游戏服务器,客户端预测和实体插值(以及下面的问题) 客户端连接到服务器 客户端将时间同步到服务器 服务器有两个主要的更新循环: 以每秒30次的频率更新服务器上的游戏物理(或游戏状态)(tick rate?) 将游戏状态以每秒10次的频率广播给所有客户端 客户端在被允许移动之前存储三个更新,这为更新状态之间的实体内插建立了caching(在丢包的情况下,旧到新的一个重定位) 从用户input时,客户端以每秒10次的频率向服务器发送input命令 – 这些input命令带有客户端时间的时间标记 客户端在屏幕上移动播放器,作为服务器将作为客户端的最终(权威)位置返回的预测 服务器在前面提到的更新循环中将所有更新应用于其物理/状态 服务器发送时间戳世界更新。 客户端(如果在服务器时间之后&&在队列中有更新)将旧位置线性插入新的位置。 问题 在1:使用NTP时间和两者之间的同步的可能性? 5:时间戳? 这里的主要目的是为每个数据包添加时间戳 在7:进入的input命令将不同步客户端的不同的延迟。 我猜这需要在应用之前进行sorting? 或者这是矫枉过正? 在9:是lerp总是一个固定的数额? 例如0.5f? 我应该做些更聪明的事情吗? 我知道很多的问题,但任何帮助将不胜感激!

实施“修复你的时间步骤”

到目前为止,我已经实施了“FYTS” 。 但是我面临几个问题。 final int TICKS_PER_S = 60; double accumulator = 0.0; //The timestep final double dt = 1/(double)TICKS_PER_S; long previousTime = System.currentTimeMillis(); //State previous; //State current; while(running){ long currentTime = System.currentTimeMillis(); double frameTime = (currentTime – previousTime)/1000; if(frameTime > 0.25){ frameTime = 0.25; } previousTime = currentTime; accumulator += frameTime; while(accumulator >= dt){ //previousState […]

平滑旋转对象,而轨道

我正在制作一个3D游戏,您可以使用屏幕上的虚拟游戏杆来控制一个围绕着一个球体的物体。 到目前为止,我已经有了这个部分的工作,但是这个对象完全遵循了操纵杆的角度,并且“咬合”到角度上,而不是顺利地插入操纵杆的新角度。 我想重做这个,并插入值。 我使用下面的代码非常接近: angle = Mathf.Atan2(joystickY, joystickX) * Mathf.Rad2Deg; Quaternion targetRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, currentAngle); transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, TURNING_SPEED * Time.deltaTime); 这在球体的一侧很好地工作,但是当我在球体的一半处移动物体时,旋转现在被镜像并且物体旋转180度,直到它再次到达另一侧。 我在这里错过了什么? 我基本上是试图计算操纵杆的角度,然后将其应用到物体上,但是使用slerp来平滑地进行操作。 让我知道你是否需要任何进一步的信息。 谢谢!

平滑减速,插补?

我有两个点A和B.我想要在A时间停止在A平稳减速。 我到目前为止做的唯一一件事就是一个lerp,这当然不对,因为它不自然。 我也尝试用一些因子(0.9或类似的因子)乘以速度,但是我不知道如何select这个因子,使得达到了终点B(或者说近似于某个ε值似乎是合理的)。 有没有人有相对简单的东西,我可以使用? 我可以阅读C ++和C#代码。

如何在使用小地图时(在典型的RTS中)平滑视口平移?

让我们以典型的现代RTS游戏为特色的一个大地图(比如256×256瓦)。 GUI中还有一个小地图,通常尺寸最大为256×256像素。 (让我们把这些数字作为即将到来的例子) 我们可以使用滚动(WASD或屏幕边缘)或拖动(例如鼠标中键),以非常高的准确度和精度移动视窗,例如精确到0.001瓦。 但是,当使用小地图移动视口时,这意味着对于GUI中每个1像素的光标移动,我们需要将视口移动1个方格。 问题是,这感觉非常紧张。 没有插值的余地,因为GUI不能超过1px的精度。 这导致了一个问题:在使用迷你地图时如何平滑视口移动?