Questions tagged «physics-engine»

用于模拟物理学的软件,例如碰撞,力,质量,关节,运动等。物理学引擎的示例包括PhysX,Havok,Bullet和ODE。


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

6
如何建立2D物理引擎?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以当前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 6年前关闭。 我制作的最高级的游戏是使用物理引擎Box2dFlashAS3制作的8球台球游戏,以及带有关卡的平台游戏。 当我做平台游戏时,我一直希望知道如何制作引擎,以便我可以重复使用它。当我看到具有坡度,弯曲坡度,完美重力和真实物理学的游戏时,我一直希望我知道如何对引擎进行编码。 请为需要的任何相关知识库建议技术和文章。

7
XNA有哪些已知的2D / 3D物理引擎?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我正在寻找要在XNA项目(2D或3D)中使用的物理引擎。因为它用于XNA,所以需要满足一些要求: 不一定免费,但是接近它显然是首选 仅托管代码(否则将无法在360上运行) 对于3D,我知道-BulletX(它可以工作,并且我现在正在使用它,但是它不活跃并且可以使用更多工作) 对于2D我知道-Farseer
20 c#  xna  physics-engine 

4
是否存在任何开源JavaScript 3D物理引擎?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我正在使用WebGL,HTML5和JavaScript开发基于Web的3D FPS游戏。它应该针对安装了支持WebGL的浏览器的PC和上网本。 我想知道是否存在使用JavaScript编写的开源3D物理引擎?

5
为什么整合过度积累?
我开始学习如何进行DIY物理学,并且我有一个关于在最基本的层面上实现集成的问题(即,这不是 Euler vs. RK4问题)。 我遇到的几乎每个示例都具有一些integrate()功能,该功能获取自上次更新以来的时间步长,并自上次更新以来更新加速度(和/或速度和/或位置)。 最简单的形式: position += velocity * deltaTime 但是,我不明白为什么通过更改功能就可以很容易地获得这样的积累。例如:getPosition = makeNewFunction()可以返回带有签名的东西Time -> Position,并且该函数的内部工作是通过适当的数学公式生成的。 这样,就没有积累……只要需要获取位置,它就会在当前时间调用该函数。 我的新手理解是,这样做还可以避免由于累积而产生的错误……那为什么不起作用,我还缺少什么? (之前我确实整理了这个想法的基本概念证明,尽管它同时也在测试其他一些东西,所以它不是最干净的例子:https : //github.com/dakom/ball-bounce-frp) 编辑1:如评论中所述,可能很重要的一点是要指出,我还没有学会改变加速度,或者处理急动和其他需要比恒定加速度更高阶积分的事情。 编辑2:这是该思想的一些基本示例代码,以及伪javascript语法-注意,getKinematicPosition由于部分应用,因此它返回的只是时间->位置的新功能: 我会坚持在这里工作,但可能还有其他原因,例如getVelocity,我想... getKinematicPosition = initialVelocity => acceleration => time => ((.5 *acceleration) * (time * time)) + (initialVelocity * time); getPosition = getKinematicPosition ([0,0,0]) (GRAVITY); onTick = totalTime …

3
碰撞检测是否总是O(n ^ 2)?
物理引擎是否能够例如通过将彼此靠近的对象分组并检查该组内部而不是与所有对象的碰撞来降低复杂性?(例如,可以通过查看远处物体的速度和与其他物体的距离来将其从一个组中移除)。 如果不是,那么这对于球体(在3d中)或圆盘(在2d中)是否会使碰撞变得微不足道?我应该做一个双循环,还是创建一个成对的数组? 编辑:对于子弹和box2d之类的物理引擎,碰撞检测是否仍为O(N ^ 2)?

3
解决力量冲突
在我的2D物理引擎中,我可以检测到AABB与AABB碰撞,并通过找到最短的穿透矢量并将其添加到AABB的位置来解决它们。 这样做可以将“第一” AABB“推”到第二AABB之外,但根本不处理速度/加速度变化。 如果我在仿真中添加重力加速度,则即使第一动态ABB停在第二静态ABB的顶部,它的速度也会保持增长。最终,速度将变得太大而无法检测到碰撞(动态AABB将落入静态ABB)。 我尝试将分辨率后的速度设置为零,但显然效果不佳,并创建了不切实际的模拟。 我在线阅读了通过手动处理位置或速度不正确来解决冲突的信息。我尝试过实施力量(目前,质量是“硬编码” 1): void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; } void Body::integrate(float mFrameTime) { velocity += acceleration * mFrameTime; position += velocity * mFrameTime; acceleration = {0, 0}; } 如果我在冲突解决期间将最短的穿透向量用作力,则动态AABB将从静态AABB中“弹出”,但在没有重力的情况下其速度永远不会降低,并且将永远移动。 有没有办法施加“临时”力量?一种将第一个ABB推出第二个ABB的力,然后在该AABB不再碰撞时停止作用? 完整的源代码在这里:https : //github.com/SuperV1234/SSVSCollision

1
任何定点便携式开源3D物理引擎?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 2年前关闭。 我正在寻找定点3D物理引擎(基本动力学和碰撞检测分辨率...没什么花哨的。) 我需要定点数学运算,因为我想获得确定性的结果(出于可重复性目的)和较高的可移植性,因为我希望我的游戏对于不带浮点运算单元的手机或便携式游戏机等设备具有很高的便携性。

4
我应该如何处理物理引擎中的微小物体?
我正在制作用于掷骰子的3D物理引擎。到目前为止,骰子为1x1x1m,重力为9.82 m / s ^ 2。当然,这看起来并不现实,因为骰子会以看起来有点慢的方式响应所有内容。 为了解决这个问题,我尝试仅改变所有尺寸以使骰子沿侧面大约0.02m。反过来,这使我的反质量和反惯性矩阵获得了非常大的值,从而导致了数值不稳定。 处理此问题的最佳途径是什么?我可以保持规模扩大,以使骰子为1x1x1并仅改变作用力的质量或大小吗?还是应该调整其他内容? 我猜如果您使用大型宇宙飞船或类似物体制作游戏时,可能会遇到同样的问题,因此我希望有人遇到过类似的问题。

3
物理引擎所需的建议
我最近开始了一个项目,构建了一个物理引擎。我希望您能给我一些有关文档和/或最佳技术的建议。 首先,我发现强烈建议将Game-Physics-Engine-Development用于手头的任务,我想知道您是否可以给我第二个意见,我应该得到吗?另外,在浏览Amazon时,我偶然发现了 Game Engine Architecture,并且由于我想为游戏构建物理引擎,因此我认为这可能也是一本好书。 其次,我知道模拟物理是高度计算密集型的,所以我想使用CUDA或OpenCL。现在我倾向于OpenCL,因为它可以在NVIDIA和ATI芯片组上使用。 PS:我将在Linux上用C ++实现。

1
如何将子弹物理学整合到我的游戏中?
我下载了在此处找到的发行文件,但不确定从哪里开始。在我的游戏中,我有多个椭圆和一个球体,我希望所有这些相互碰撞。(它们都有网格和相关的边界体积) 编辑-我只是意识到长方体实际上与AABB关联。我想至少得改变一下。 我需要遵循哪些步骤?

3
如何修复物理引擎中“弹出”或抖动的对象?
我有一个简单的物理引擎,可以通过直接校正重叠物体的位置(现在仅是圆形)来解决碰撞,而不仅仅是更改速度或施加脉冲。仅在影响已解决后或在集成过程中才更改速度。 我遇到的问题是,在对象堆中,顶部对象在堆底部的对象上施加了过多的压力(隐式存在,算法中没有压力建模),这导致它们被推过地板,等等 我想通过按其y坐标对对象进行排序来解决此问题,因此可以从下至上解决冲突。但是现在,引擎显示了实际上应该处于静止状态的对象的奇怪弹出行为(请参阅gif) 不只是提供源代码,这可能是什么?

3
惯性张量的计算
我承认,这是一个复杂而冗长的问题,我还不太了解,所以我将尽力解释。 简短版:是否有通用的c ++ / physx公式可根据对象形状计算惯性张量? 长版: 对于我们的物理学,我们需要指定x,y和z惯性张量。当前,我们的方法几乎只是基于质量的比率。因此,如果一个对象在X轴上较长,而在Y和Z上较薄,并且质量为10000,则将Z和Y设置为7000,将X设置为3000。(这不确切,只是给出一个想法) 这比较好用,但是我们最大的问题是当某处存在关节不稳定性时,我们必须不断猜测张量,直到找出最合适的。如果我们进行非常大的物理模拟,而20个以上的关节中有一个关节使所有其他关节失去稳定性,则这将变得非常耗时。 我正在研究的是一个函数,它将采用对象的边界框并希望计算出相对准确的张量。我已经从http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors进行了一些数学运算,并制作了一个函数,该函数基本上可以像下面的类似旋转一样工作。 或者,如果旋转结束,则如下所示: 因此,这似乎给了我类似于我们一直使用的方式的结果,但是我不想切换到这种方式而不确保它能正常使用。以下是基于具有立方体和中心枢轴的第一个图像的我的函数的代码。 NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m ) { float width = boundingBox.GetSizeX(); float height = boundingBox.GetSizeZ(); float depth = boundingBox.GetSizeY(); float xTensor = 0.083f * m*(height*height + depth*depth); float yTensor = 0.083f * m*(width*width + depth*depth); float zTensor = …


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.