连接具有不同坐标系的物理模拟


9

我希望对象在两个物理模拟之间通过“窗口”移动,并在两个物体与窗口平面相交的情况下与两个模拟碰撞。

模拟的坐标系不具有相同的原点,并且可能具有不同的方向。将模拟本身包装起来不是必需的,但是会更好。

如何在不克隆单个对象的情况下有效地连接系统?

编辑:

计算应尽可能准确,这样,如果对象同时从相反的方向穿过窗口,则不会卡住。


第一个问题是,物理模拟在整个窗口中是否准确?因为方向改变使正确的扫掠几乎是不可能的。这有点像改变规模的门户网站-一个充满痛苦的世界。第二个问题:不同的方向(例如任意角度或至少90度角)仅交换一个轴?
Kaj 2010年

现在,这听起来像是他们必须在Portal中解决的问题。如果我没记错的话,他们会在游戏中的一些评论中提及这些问题以及如何解决这些问题。您可能在某处在线找到这些。
Nailer 2010年

@Kaj我认为最好将计算路径拆分为任意和直角过渡。这样,直角的可能具有更高的精度和速度,而其他角度也将是可能的。
Tamschi 2010年

@Nailer如果我没记错的话,他们在门户网站打开时创建了一个新的物理环境,然后克隆了接近此附加仿真的每个物理对象。他们说他们以某种方式限制了物体,但是很可能它们只是在改变力并在每个物理步骤上定位。<br>我很确定他们会在目的地创建第三个副本,因为玩家的移动方式是在Source中模拟。
Tamschi

Answers:


2

有一个很酷的项目称为Pseudoform,以前称为“ Portalized”,该项目以常规方式使用门户来处理物理模拟:

伪形

一探究竟!

尤其是视频-太酷了。

它是开源的,因此您可以了解他们的工作方式。

我敢打赌,这就是您想要的。:)


2
我只是阅读了以下代码:它们的执行方式几乎与Valve的解决方案相似,但是没有附加的物理环境。Portalized引擎中的Portal会在对象接触门户表面后创建一个副本,然后在离开门户一定时间后将其删除。这个答案还是有帮助的:用于约束重复项的关节显示了对象如何在门户中转换。
Tamschi

0

好的-我不知道这是否行得通。
基于以上信息,我将在“窗口”上放置触发器,以便可以检测到物体何时脱离世界。碰撞时抓取当前速度矢量。根据到达触发点的位置和结束该帧的位置计算剩余的时间步长(在世界范围内,您的世界需要一个虚拟边界来允许这样做)。此时,您知道了速度和剩余的时间,因此可以将其重新定位在即将进入的世界的边界上,并重新投影速度。但是,这将需要在一帧中进行两次物理更新,并且在同一位置存在一个对象从a到b而另一个对象从b到a的边界情况-根本不会检测到碰撞。
有点粗略


这似乎是最快的方法,但是如果两个物体从同一侧越过窗口,就会出现问题:如果第一个物体卡在边界的中途,那么第二个直到它到达边界时才发生碰撞,也出现在目的地的第一个
Tamschi

键入时稍作编辑,这确实是我添加的问题:o \
Kaj 2010年

我要学会读书。我的加入是另一个边境案件。会思考。
Kaj 2010年

不,边界在世界之外。因此对象1会像物体b一样以自身的速度射入世界2(从世界2的边界-不在窗口位置)。他们会在边界上的世界2中正确碰撞。...我认为:o?但是我自己的边境案件仍然成立。
Kaj 2010年

好像我误读了有关虚拟边框的部分。无论如何,如果物体被卡住,还有另一个问题。目标窗口背面的部分仍将在原始位置进行渲染,但是不接触边框的对象不会与它碰撞。解决这些问题的一种方法是统一模拟,但是我不确定如何有效地完成。
Tamschi

0

我阅读了一些有关物理模拟的信息,并找到了可能的解决方案。通过将每个物理步骤分为三个阶段来工作:

1.前置步骤:

在每个物理步骤中,都有一个窗口创建四​​个变换,每个连接边各两个:

  • 输入转换,将对象的位置,速度(以及可能的大小和重量)转换为目标坐标系,并且
  • 输出转换将力转换回对象的原始系统。

(静态窗口只需要执行一次。)

此外,每个坐标系中的对象分为三组:

物理分组http://content.wuala.com/contents/Tamschi/Stack%20Exchange/WindowGrouping.png

  1. 窗口前面的对象(绿色)。
    如果某个对象与窗口平面相交或可能从窗口后面穿过该对象(未显示),则该对象也计入该组。

  2. 在此物理步骤中,对象与窗口相交或可能与窗口相交(橙色)。

  3. 窗口后面的对象(蓝色)。如果有物体飞向窗口的背面,它仍被标记为第三组的成员。

如果窗口位于模拟的边界,则可以简化分组。

2.主要步骤:

物理计算通常照常进行,但有一些例外:

  • 第二组的对象永远不会与第三组的对象发生碰撞,反之亦然。

  • 窗口的输入转换用于第二组对象,并根据目标系统中的前向和相交对象评估结果。产生的力使用输出变换进行变换,并应用于原始对象。

(如果在计算过程中击中了一个对象,则必须将其重新分组!)

3.后续步骤:

如果来自第二组的对象已经越过窗口,则使用输入变换将其移动到目标系统中。

其他想法:

如果在计算物理量后保留了变换,则可以将其用于加速渲染并简化AI计算。分组可用于从渲染过程中删除裁剪平面。

该解决方案的缺点是必须将窗口直接添加到物理引擎中。

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.