Questions tagged «physics»

与物体在空间和时间上的运动有关。包括诸如加速度(推力和重力),质量,碰撞响应,摩擦等概念。

11
什么时候应该使用固定或可变时间步长?
游戏循环应该基于固定时间段还是可变时间段?一个人永远是上等的,还是正确的选择会因游戏而异? 可变时间步长 物理更新传递了“自上次更新以来经过的时间”参数,因此与帧速率有关。这可能意味着要进行计算position += distancePerSecond * timeElapsed。 优点:流畅,更易于编码 缺点:不确定性,无论步长或步长都是不确定的 deWiTTERS示例: while( game_is_running ) { prev_frame_tick = curr_frame_tick; curr_frame_tick = GetTickCount(); update( curr_frame_tick - prev_frame_tick ); render(); } 固定时间步 更新可能甚至不接受“经过的时间”,因为它们假定每次更新都是在固定的时间段内进行的。计算可以按进行position += distancePerUpdate。该示例包括渲染期间的插值。 优点:可预测,确定性(更容易进行网络同步?),更清晰的计算代码 缺点:不同步以监控垂直同步(除非进行插值,否则会引起抖动的图形),最大帧速率受限(除非进行插值),难以在框架内工作采取可变的时间步长(例如Pyglet或Flixel) deWiTTERS示例: while( game_is_running ) { while( GetTickCount() > next_game_tick ) { update(); next_game_tick += SKIP_TICKS; } interpolation …

3
如何使用动态波创建2D水?
新版《超级马里奥兄弟》拥有非常酷的2D水,我想学习如何创建。 这是显示它的视频。说明部分: 碰到水的东西会产生波浪。还有恒定的“背景”波。当摄像机不移动时,您可以在视频中00:50之后的恒定波中看到效果很好。 我假定飞溅效果与本教程的第一部分相同。 但是,在NSMB中,水在表面上也具有恒定的波浪,并且飞溅看起来非常不同。另一个区别是,在本教程中,如果创建了一个飞溅,它首先会在飞溅的起点在水中创建一个深的“洞”。在新的超级马里奥兄弟中,这个孔不存在或较小。我指的是玩家从水中跳入跳出时所产生的飞溅。 如何创建不断波动和飞溅的水面? 我在XNA中编程。我自己尝试过,但是我无法真正使背景正弦波与动态波一起很好地工作。 我不是在问“ 新超级马里奥兄弟 ”的开发者是如何做到这一点的,只是对如何重现这种效果感兴趣。

5
好的2D Platformer物理[关闭]
我为Box2D的2D平台游戏者设置了基本的角色控制器,并且我开始对其进行调整以使其感觉良好。物理引擎有很多旋钮需要调整,我不清楚,我是第一次使用物理引擎编写,我应该使用哪种。跳跃应该施加力几次tick吗?一时冲动?直接设定速度?如何在不消除化身的所有摩擦的情况下阻止化身粘在墙上(或者我消除了所有的摩擦,但仅限于空中)?我应该将角色塑造成胶囊吗?有圆角的盒子吗?一个有两个轮子的盒子?只是一个大轮子?我觉得以前一定有人做过! 在网络上,似乎只有很少的资源不是“婴儿的第一物理学”,这一切都切断了我希望有人已经解决了这些问题的地方。用于平台游戏的物理引擎的大多数示例都具有浮动感控件,空中跳跃或当临时穿透力过高时容易利用的行为等。 我的意思的一些例子: 轻按一下跳会跳很短距离;长按会跳得更高。 高速停止或反转方向时打滑短。 稳定地站在斜坡上(但在避开时可能会滑下)。 使用模拟控制器时的模拟速度。 所有其他将优秀平台游戏者与劣质平台游戏者区分开的事物。 我敢说,稳定的移动平台吗? 我并不是真正在寻找“嘿,这样做”。显然,正确的做法取决于我在游戏中想要的东西。但是我希望某个地方的人经历了各种可能性,并说“技术A的X很好,技术B的Y很好,但是不适用于C”,或者除了“如果(key = = space)character.impulse(0,1)“
76 box2d  physics  input 

7
2D Platformer AABB碰撞问题
我的AABB冲突解决方法有问题。 我先解析X轴,然后解析Y轴,以解决AABB相交问题。这样做是为了防止此错误:http : //i.stack.imgur.com/NLg4j.png 当物体移入播放器且必须水平推动播放器时,当前方法可以正常工作。如您在.gif文件中所见,水平尖峰正确地推动了播放器。 但是,当垂直峰值移动到播放器中时,X轴仍将首先解析。这使得“将钉鞋用作升降机”是不可能的。 当玩家进入垂直尖峰(受重力影响而掉入)时,他被推向Y轴,因为开始时X轴上没有重叠。 我尝试过的方法是此链接的第一个答案中描述的方法:2D矩形对象碰撞检测 但是,尖峰和移动的对象是通过更改位置而不是速度来移动的,直到调用Update()方法之前,我才计算它们的下一个预测位置。不用说此解决方案也不起作用。:( 我需要以上述两种情况都可以正常工作的方式解决AABB碰撞。 这是我当前的碰撞源代码:http : //pastebin.com/MiCi3nA1 如果有人可以研究这个问题,我将非常感激,因为这个错误从一开始就一直存在于引擎中,并且我一直在努力寻找一个好的解决方案,但没有成功。这严重使我整夜都在看碰撞代码,并阻止我进入“有趣的部分”并对游戏逻辑进行编码:( 我尝试实现与XNA AppHub平台演示中相同的碰撞系统(通过复制粘贴大部分内容)。但是,“跳跃”错误发生在我的游戏中,而AppHub演示中没有发生。[跳虫:http : //i.stack.imgur.com/NLg4j.png ] 要跳,我检查播放器是否为“ onGround”,然后将-5添加到Velocity.Y。 由于玩家的Velocity.X高于Velocity.Y(请参见图中的第四个面板),因此onGround在不应该设置为true时设置为true,从而使玩家跳入半空中。 我相信这在AppHub演示中不会发生,因为播放器的Velocity.X永远不会高于Velocity.Y,但我可能会误会。 我先在X轴上解析,然后在Y轴上解析,从而解决了这个问题。但是,如上所述,这加剧了与尖峰的碰撞。

3
如何确定打开哪些推进器以旋转船舶?
船的配置会动态更改,因此当我想顺时针或逆时针旋转船时,必须确定要打开哪个推进器。推进器始终与船舶轴线对齐(永远不成角度),并且可以打开或关闭。这是可能的设置之一: 到目前为止,我已经尝试过将发射向量和方向向量可视化到船的质心: 不幸的是,我对此并不了解。


2
如何使角色跳跃?
我目前正在使用Direct X 9.0在C#中制作游戏。游戏重制为《大金刚》。我几乎完成了所有工作,但是我对Mario跳高的物理学存在疑问。我为Y和X坐标声明了变量。 我想知道是否有一个简单的方法来做到这一点。我在上下搜索了一个答案,但是找到的答案不相关/或使用其他编程语言(例如XNA)。 我目前设置了一个bool变量来检查是否按下了W,这将触发任何代码使他跳转。我一直在诸如此类的混乱。 if (jump == true) { Playerypos -= vel; Playerxpos += vel; } 哪个效果不好。我一直在寻找一个答案,但现在我很绝望,如果有人可以向我指出简单解决方案的正确方向。那很好啊。非常感谢您的任何回应。
44 physics  input  jumping 

8
如何执行确定性的物理模拟?
我正在创建一个涉及刚性物体的物理游戏,玩家可以在其中移动零件和零件来解决难题/地图。游戏中一个非常重要的方面是,当玩家开始进行仿真时,无论其操作系统,处理器等如何,它在任何地方都可以运行。 存在很多复杂性的空间,并且模拟可能会运行很长时间,因此,对于浮点运算,物理引擎必须完全确定,这一点很重要,否则解决方案似乎可以在一个玩家的机器上“解决”并在另一个上“失败”。 如何在游戏中获得这种确定性?我愿意使用各种框架和语言,包括Javascript,C ++,Java,Python和C#。 Box2D(C ++)以及其他语言的等效语言吸引了我,因为它似乎可以满足我的需求,但是它缺乏浮点确定性,尤其是对于三角函数。 到目前为止,我所看到的最好的选择是Box2D的Java等效项(JBox2D)。它似乎通过使用StrictMath而不是Math用于许多操作来尝试浮点确定性,但是由于我尚未构建游戏,因此尚不清楚此引擎是否可以保证我需要的一切。 是否可以使用或修改现有引擎以满足我的需求?还是我需要自行构建引擎? 编辑:如果您不关心为什么有人需要这样的精度,请跳过本文的其余部分。发表评论和回答的人似乎都认为我正在寻找不该做的事情,因此,我将进一步解释游戏的工作原理。 给玩家一个难题或关卡,其中包含障碍物和目标。最初,模拟未运行。然后,他们可以使用提供给他们的零件或工具来构建机器。一旦按下开始,模拟就会开始,并且他们不再可以编辑其机器。如果机器解决了地图问题,则玩家已经击败了关卡。否则,他们将必须按Stop(停止)按钮,更换机器,然后重试。 一切都需要确定性的原因是因为我计划通过记录每台机器的位置,大小和旋转,来生成将每台机器(一组试图解决一个关卡的零件和工具)映射到xml或json文件的代码。这样,玩家就可以共享解决方案(由这些文件表示),以便他们可以验证解决方案,相互学习,举行比赛,合作等等。当然,大多数解决方案,尤其是简单或快速的解决方案不会因为缺乏确定性而受到影响。但是解决真正困难水平的缓慢或复杂的设计可能会出现,而那些可能会是最有趣且值得分享的设计。

6
马里奥游戏物理分析[关闭]
我知道在这里可以找到刺猬索尼克(Sonic the Hedgehog)物理学的分类,我想知道,是否有任何Mario游戏的分类?与此类似,但马里奥(Mario)是我感兴趣的东西!
42 physics 

2
水/海洋模拟与物理
我正在寻找有关水模拟的参考资料,以及如何模拟水与物体(如船,船,潜艇)的相互作用。 我发现了很多关于水的视觉方面(波浪,反射等)的参考,但是关于如何处理水与人体相互作用的方式却很少。我在游戏开发方面的经验非常有限,我真的很固守在这里。 Bascally我希望能够使船的位置根据波浪而变化。我怎样才能做到这一点? 我正在使用Panda3D,但希望听到有关任何可用技术中使用的技术和实现的信息。
42 physics 


2
为什么我们在游戏物理学中使用勾股定理?
我最近了解到,我们在物理计算中经常使用勾股定理,恐怕我并没有真正理解这一点。 这是一本书的示例,以确保对象MAXIMUM_VELOCITY在水平面中的移动速度不会快于常量: MAXIMUM_VELOCITY = <any number>; SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY; function animate(){ var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity); if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){ scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY; x_velocity = x_velocity / scalar; z_velocity = x_velocity / scalar; } } 让我们用一些数字尝试一下: 对象试图在x中移动5个单位,在z中移动5个单位。总共只能水平移动5个单位! MAXIMUM_VELOCITY = 5; …

7
关于浮点精度以及为什么仍要使用它
在大世界中,浮点数一直是精度问题。 此文章解释了背后的幕后,并提供明显的选择-定点数。一些事实确实令人印象深刻,例如: “高达64位的精度使您可以达到亚微米级精度的冥王星距太阳最远的距离(74亿公里)。” 亚微米精度远胜过任何fps所需的精度(对于位置甚至速度),这将使您能够构建真正的广阔世界。 我的问题是,如果定点具有这样的优势,为什么还要使用浮点数呢?大多数渲染API和物理库都使用浮点数(并且存在浮点数的缺点,因此开发人员需要绕开它们)。 他们这么慢吗? 另外,您如何看待可扩展的行星发动机(例如:outerera或infinity)能够大规模处理?他们使用固定点作为位置还是有一些空间划分算法?
38 graphics  physics 

4
非射击者的运动预测
我正在开发具有中等规模的多人游戏的等距2D游戏,大约有20-30个玩家同时连接到持久性服务器。在实现良好的运动预测实现方面,我遇到了一些困难。 物理/运动 游戏没有真正的物理实现,但是使用基本原理来实现运动。状态更改(即/鼠标下移/上移/移动事件)不是持续轮询输入,而是用于更改玩家正在控制的角色实体的状态。玩家的方向(即东北方向)与恒定速度结合在一起,并转换为真实的3D矢量-实体的速度。 在主游戏循环中,在“平局”之前调用“更新”。更新逻辑触发“物理更新任务”,该任务以非常零的速度跟踪所有实体,并使用非常基本的积分来更改实体位置。例如:entity.Position + = entity.Velocity.Scale(ElapsedTime.Seconds)(其中“ Seconds”是浮点值,但相同的方法适用于毫秒整数值)。 关键是没有插值用于运动-基本物理引擎没有“先前状态”或“当前状态”的概念,只有位置和速度。 状态更改和更新数据包 当玩家控制的角色实体的速度发生变化时,“移动化身”数据包将发送到服务器,其中包含该实体的动作类型(站立,行走,奔跑),方向(东北)和当前位置。这与3D第一人称视角游戏的工作方式不同。在3D游戏中,速度(方向)会随着玩家的移动而逐帧变化。发送每个状态更改将有效地每帧发送一个数据包,这太昂贵了。取而代之的是3D游戏似乎忽略了状态更改,而是以固定的时间间隔(例如,每80-150毫秒)发送“状态更新”数据包。 由于速度和方向更新在我的游戏中的发生频率要低得多,因此我可以避免发送每个状态更改。尽管所有物理模拟都以相同的速度发生并且具有确定性,但是延迟仍然是一个问题。因此,我发出常规的位置更新数据包(类似于3D游戏),但发送频率却要低得多-现在每250毫秒发送一次,但是我怀疑有了良好的预测,我可以轻松地将其提高到500毫秒。最大的问题是,我现在已经偏离规范了-所有其他在线文档,指南和示例都会发送例行更新并在这两种状态之间进行插补。看来与我的架构不兼容,我需要提出一种更好的运动预测算法,该算法更接近(非常基本的)“网络物理学”架构。 然后,服务器接收该数据包,并根据脚本根据其移动类型确定玩家的速度(玩家是否可以跑步?获取玩家的跑步速度)。一旦具有速度,便将其与方向相结合以获得向量-实体的速度。会进行一些作弊检测和基本验证,并且服务器端的实体将使用当前速度,方向和位置进行更新。还执行基本限制,以防止玩家因移动请求而淹没服务器。 更新其自身的实体后,服务器向范围内的所有其他玩家广播“头像位置更新”包。位置更新包用于更新远程客户端的客户端物理模拟(世界状态),并执行预测和滞后补偿。 预测和滞后补偿 如上所述,客户具有自己的地位。除作弊或异常情况外,服务器将永远不会重新定位客户端的头像。客户的化身不需要进行推断(“立即移动并稍后更正”)-玩家看到的是正确的。但是,所有正在移动的远程实体都需要某种类型的外推或内插。客户的本地模拟/物理引擎中显然需要某种类型的预测和/或滞后补偿。 问题 我一直在努力使用各种算法,并且遇到许多问题: 我应该外推,内插还是同时进行?我的“直觉”是我应该使用基于速度的纯外推法。客户端接收状态更改,客户端计算出补偿滞后的“预测”速度,而常规物理系统则完成其余工作。但是,它与所有其他示例代码和文章都不一样-它们似乎都存储了许多状态并在没有物理引擎的情况下执行插值。 当数据包到达时,我尝试在固定的时间段内(例如200ms)用数据包的速度对数据包的位置进行插值。然后,我利用插值位置和当前“错误”位置之间的差值来计算新矢量,并将其放置在实体上而不是发送的速度上。但是,假设另一个数据包将在该时间间隔内到达,并且很难猜测下一个数据包何时到达-尤其是因为它们并非都按固定的时间间隔到达(即,状态也发生变化)。这个概念从根本上是有缺陷的,还是正确的,但是需要一些修复/调整? 远程播放器停止播放时会发生什么?我可以立即停止该实体,但是它将定位在“错误”位置,直到再次移动为止。如果我估计一个矢量或尝试进行插值,则会遇到一个问题,因为我不存储先前的状态-物理引擎无法说“到达X位置后需要停止”。它只是了解速度,没有什么更复杂的了。我不愿意将“数据包移动状态”信息添加到实体或物理引擎,因为它违反了基本的设计原则,并在游戏引擎的其余部分流失了网络代码。 当实体碰撞时会发生什么?共有三种情况-控制玩家在本地发生冲突,两个实体在位置更新期间在服务器上发生冲突,或者远程实体更新在本地客户端上发生冲突。在所有情况下,我都不确定如何处理碰撞-除了作弊外,这两种状态都是“正确的”,但是处于不同的时间段。在远程实体的情况下,将其拖过墙是没有意义的,因此我在本地客户端上执行碰撞检测并使其“停止”。基于上面的第二点,我可能会计算出一个“校正向量”,该向量将不断尝试将实体“穿过墙”移动,但此操作将永远不会成功-远程化身被卡在那儿,直到错误变得过高并“捕捉”到位置。游戏如何解决这个问题?

2
计算2D精灵的旋转力
我想知道是否有人有一种优雅的方式来计算以下情况。 我有一个(n)个正方形,随机形状的对象,但我们会假装它们都是矩形。 我们没有重力,因此从上到下的角度考虑空间中的物体。我在一个特定的正方形上向对象施加力(如下图所示)。 如何根据所施加的力在所施加的位置计算旋转角度。如果应用在中心方块中,它将笔直。我离开中心越远,应该如何表现?如何计算转速?
35 2d  rotation  physics  vector 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.