WebGL / Box2D绘制问题:物体之间存在间隙。

3
我还是一个图形编程新手,以下问题可能只是配置错误的问题。
我正在使用WebGL进行图形和Box2dweb进行物理的游戏开发。不幸的是,绘图显示物体之间存在间隙(左侧是我的实际渲染结果,右侧是在另一个画布中使用Box2dweb的调试绘图的渲染结果):
两个Box2D和WebGL使用相同的坐标系和盒子大小。没有转换。红色的盒子实际上是纹理,但这并没有什么区别。红色的盒子是动态物体,绿色的盒子是静态物体。
显然,我不能仅仅调整图形或物理。如果我让图形变大,绿色的盒子会重叠,如果我让物理变小,就会有物理间隙。
这里是另一个例子:
此外,有时候没有间隙,就像在下面的图像中(只是将物理物体向右移动了一点)
黑色的盒子只是彩色绘制(无纹理)。看着前面的图片,我想这与将浮点世界坐标转换为屏幕像素坐标有关,但我不知道修复此问题的选项是什么。
非常感谢您的帮助。
【更新】
这是一个正交投影矩阵,我是这样初始化的:
mat4.ortho(-this.vpWidth * this.zoom, this.vpWidth * this.zoom, -this.vpHeight * this.zoom, this.vpHeight * this.zoom, 0.1, 100.0, this.pMatrix);

vpWidth和vpHeight是画布的尺寸(640 * 480)。投影矩阵传递给顶点着色器,与模型视图矩阵和顶点位置相乘。我试着调整了缩放因子。越缩小,间隙就越大。

[更新2]

好的zeppelin提供了一个好的提示:box2d在物体之间留下间隙以避免穿透,但这并不是完整的解释。我查看了调试绘图代码-没有调整任何尺寸。我进行了一项小测试,在webgl和调试绘制中进行了放大,得到了如下结果:

enter image description here

10倍缩放时,两者都有相同大小的间隙,但在“正常”缩放时,webgl绘制的间隙比canvas 2d更大。可能的解释是抗锯齿,在canvas 2d上启用,但在webgl上未启用(我使用firefox - 猜测今天稍后会进行chrome测试以查看结果)


我认为在我们提供帮助之前,我们需要更多的信息。我的第一印象是你的正交投影矩阵与画布尺寸不匹配。你能否给我们提供有关场景设置的更多细节? - Toji
我稍微更新了一下帖子。确实是一个正交投影。谢谢。 - CodeSalad
相关 https://gamedev.stackexchange.com/questions/15092/rectangles-render-with-gaps-in-between-them-box2d - Ciro Santilli OurBigBook.com
2个回答

2
如果你查看 box2d手册 的第4.2章节,它会告诉你box2d引擎保持多边形稍微分离以避免隧道效应。检查Box2d调试绘图代码来查看他们如何将box2d坐标转化为绘制坐标可能是一个好主意,以便了解如何在你的应用程序中实现相同的功能。

非常好的提示!这是真的,尽管它并没有解决整个谜团。间隙大小取决于缩放级别。我已经更新了我的问题,并提供了更多信息。非常感谢! - CodeSalad
根据同一文档,多边形形状从形状类继承半径字段。这就在形状之间创建了差距。您可以使用此值并稍微放大您的形状。 - rgngl

0

通过提供的矩阵,您将创建一个视口,其“虚拟大小”为您画布尺寸的两倍。如果您正在尝试逐像素匹配,请尝试以下操作(缩放为1.0):

mat4.ortho(-(this.vpWidth/2) * this.zoom, (this.vpWidth/2) * this.zoom, -(this.vpHeight/2) * this.zoom, (this.vpHeight/2) * this.zoom, 0.1, 100.0, this.pMatrix);

这样,您的640*480画布将具有[-320,-240]到[320 * 240]的范围,总共为640*480个单位。请注意,这可能不会完全消除间隙,因为正如bad zeppelin所指出的那样,box2d是有意放置它们的,但它应该使它们不那么明显。

减少可见间隙的另一种选择是将您的几何图形缩放一点,以使其在物理表示周围显示一个或两个额外像素。最糟糕的情况是几何图形可能会稍微重叠,但这取决于您确定是否比间隙更令人反感。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接