例如,采用这种情况(对不起,我的绘画技巧很差):
这是基于“门户”的,火柴人正在通过蓝色门户(链接到红色门户),但是有一堵墙阻止他在红色门户上。因此,他无法完全通过门户。
所以我的问题是:如何与他们进行物理/碰撞检测?我会切播放器吗?有没有办法链接它们?是否有任何物理引擎支持此操作?如果没有,我该怎么做?
例如,采用这种情况(对不起,我的绘画技巧很差):
这是基于“门户”的,火柴人正在通过蓝色门户(链接到红色门户),但是有一堵墙阻止他在红色门户上。因此,他无法完全通过门户。
所以我的问题是:如何与他们进行物理/碰撞检测?我会切播放器吗?有没有办法链接它们?是否有任何物理引擎支持此操作?如果没有,我该怎么做?
Answers:
该门户网站游戏由他们解决了这个问题的一个好方法:
播放器穿过源门户(蓝色),并且被视为伸出目标门户(橙色)。播放器将复制到目标门户,并逐步浏览。该游戏使用第二台摄像机和渲染纹理来渲染通过源门户查看时看到的图像。
但是,播放器在目标位置的副本不会与物理相互作用。它仅用于渲染目的。相反,它们在源门户的另一侧制作虚拟碰撞对象,并使玩家与之碰撞。这使物理学变得简单。
您只需要播放器可以达到的最大虚拟对象,而无需完全通过门户。一旦玩家完全通过门户,情况就会逆转。
图片说明:蓝色门户是源门户,橙色门户是目标门户。白色虚线框是虚拟碰撞对象,而真实框是渲染的对象。播放器(带有红点)仅与周围的对象进行交互。橙色门户网站上的对象将被完全忽略。
这是我尝试做的方法。
当您在门户中时,物理引擎中将有两个播放器副本。每个副本都忽略位于门户另一侧的所有碰撞,然后将结果合并并将模拟结果应用于两个模型。
理想情况下,您应该为玩家的每半部分分别施加重力,但是只要将重力应用到玩家质心所在的传送门一侧,您就可以摆脱困境。
要忽略这些碰撞,您需要设置适当的体积,并测试其中是否有一个点。一个圆柱体(可能垂直拉伸)似乎是一个不错的选择。然后测试就像if (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();
我相信大多数物理引擎都具有用于过滤物体可能与之碰撞的系统,因此应该可以使用标准物理引擎来实现。例如 http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering
为了合并结果,最简单的选择可能是在两者之间添加某种不灵活的约束,然后由物理引擎处理。
我将如何计算玩家跌倒的距离?
你为什么要 您无需计算玩家“下场”的距离;您会发现随着对象进行模拟,它会走多远。
我什至将如何连接门户?
从游戏内的角度来看,门户仅是精心设计的传送器,它会碰到碰撞,将可碰撞的物体变成不可碰撞的物体。当物体触摸门户时,它可能开始与另一侧的物体碰撞。当对象通过门户足够远时,您可以有效地将其传送到另一个,从而立即更改其位置和方向。
物理学只是正常地进行。
When an object touches the portal, it starts potentially colliding with things on the other side
对,就是这样。我将如何使用物理引擎来做到这一点?我想这是我的问题:)