当前位置: 首页 > 知识库问答 >
问题:

物理发动机-相位顺序和其他一般信息

秦涵涤
2023-03-14

我想建立我自己的2D微型物理引擎,将包括(目前)刚性体,和约束(关节,接触,Spring...)。我试图弄清楚,当我开始一个时间步时,当一般阶段是:宽阶段、窄阶段(碰撞检测和接触生成)、解析(约束求解)和集成时,这些阶段的正确顺序是什么--希望您能告诉我正确的顺序。

我对每个阶段都有一般性的问题:

狭窄阶段--当我发现碰撞时,我需要在发现碰撞后将物体分离,还是在解析阶段对它们的速度施加一个冲量?

解析-在解析阶段使用constaints求解器可以吗?如果通过解决一个约束,我会解决其他约束或产生更多约束呢?(我是否需要在每次约束求解后检查它是否求解了其他约束或生成更多约束?

Infration-这是我收集所有信息的部分(脉冲,力…)用我选择的积分方法把它们和速度相结合,而不是和位置相结合?

一个辛欧拉积分对我的物理引擎就足够了?

因此,感谢所有愿意阅读这篇文章的人,特别是那些愿意帮助我回答所有问题的人:)

共有1个答案

范鸿畅
2023-03-14
    null

它应该是你的引擎的封装。它保存了所有对象/东西的列表。主界面与GUI/APP。要更深入地了解我现在的意思,请看这里的C++中的Drag&Drop editor,您可以将它作为起点,只需添加物理、迭代/更新就可以了。不要忘记将对象接口实现到这个主类中,如:

  • 加载(文件名)...加载所有对象
  • 绘制(...)...绘制所有对象...

模拟仿真

如果您的代码编写得很好,您可以将迭代循环并行化,但您必须记住,它会产生很少的麻烦,如双重碰撞反应等

碰撞

在so/se上有很多关于这个的东西,所以只要搜索一下就可以了。我想你应该看看这里:粒子碰撞的模拟,得到多重碰撞处理的想法。

    null

它使用了我在这里写过的所有东西,此外,它还使用了一个特殊的类来处理键合,比如Spring或接头。这是看起来的样子:

struct _bond
    {
    physics_point *pnt0,*pnt1;
    double l0,l1;
    int _beg0,_end0;
    int _beg1,_end1;
    List<int> depend0,depend1;
    int _computed;
    _bond()     {}
    _bond(_bond& a) { *this=a; }
    ~_bond()    {}
    _bond* operator = (const _bond *a) { *this=*a; return this; }
    //_bond* operator = (const _bond &a) { ...copy... return this; }
    };
List<_bond> bnds;

我可以用这背后的东西覆盖整本书,但我太懒了,而且这个站点也不是合适的地方,所以只是匆忙,重要的东西是每个bond都有它的开始和结束对象指针(pnt0,pnt1),并且在计算期间填充依赖项列表(depend0,depend1)。

    null

然后,在每次迭代过程中,递归更新所有键以匹配键/冲突条件,只有当它们都匹配时,才立即更新所有键的位置。

  • _computed flag只是宣布此绑定正常(满足条件)。

其余的只是临时变量,以减轻递归堆/堆栈垃圾的负担

 类似资料:
  • 我正在开发一个React Native软件包,以获取Android设备上摄像头的信息。问题是并不是所有的摄像机都出现了。 我的代码如下: 这段代码返回以下内容: 这表明它缺少REQUEST\u AVAILABLE\u CAPABILITIES\u LOGICAL\u MULTI\u摄像头。然而,我正在测试的手机有3个后摄像头和1个前摄像头。我错过了什么?

  • 问题内容: 我试图在Go中启动一个HTTP服务器,该服务器将使用自己的处理程序来提供自己的数据,但与此同时,我想使用默认的http FileServer来提供文件。 我在使FileServer的处理程序在URL子目录中工作时遇到问题。 该代码不起作用: 我期望在localhost:1234 / files /中找到本地目录,但是它返回一个。 但是,如果我将文件服务器的处理程序地址更改为/,它将起作

  • void 运算符 void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 void 0 // undefined void(0) // undefined 上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用圆括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7。

  • 我想知道JVM关机序列。是有一个关机的顺序,还是程序突然结束?更详细地说,假设有一个有500行代码的methodA()。当执行第250行时,使用Spring靴的关机执行器启动关机。这里发生了什么?做 JVM等待完成500行代码,然后继续关机,或者 JVM在代码本身的第250行终止,程序结束吗? 谢了!

  • 问题内容: 问题的上下文是Android环境中的OpenGL ES 2.0。我有质地。没问题显示或使用它。 是否有一种方法可以仅从其绑定ID开始知道其宽度和高度以及其他信息(例如内部格式)? 我需要在不知道纹理大小的情况下将纹理保存到位图。 问题答案: ES 2.0中没有。实际上不存在该功能真让人感到惊讶。您可以获取渲染缓冲区的大小,但不能获取纹理的大小,这似乎是不一致的。 唯一可用的是您可以通过

  • 物理机用于创建裸金属设备,裸金属独占物理机资源。 物理机是在云管平台注册IPMI信息,可以被云管平台完全管理和控制的物理服务器。物理机用于创建裸金属设备,裸金属独占物理机资源。 物理机支持纳管的服务器包括Dell、HP、华为、浪潮、联想、超微等主流x86服务器厂商和机型。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “主机/基础资源/物理机” 菜单项,进入物理机页面。 列表右上方