【问题标题】:WebGL / Box2D drawing issue: gap between bodiesWebGL / Box2D 绘图问题:身体之间的间隙
【发布时间】:2011-12-04 00:59:52
【问题描述】:

我还是个图形编程新手,我敢打赌下面的问题只是配置错误。

我正在使用 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]

好的。我对此进行了更多调查。糟糕的齐柏林飞艇有一个很好的暗示。 box2d 在主体之间有间隙以避免隧道效应。虽然这不是完整的解释。我查看了调试绘制代码——它没有调整任何东西的大小。我做了一个小测试,在 webgl 和 debug draw 中都放大了,结果如下:

使用 10 倍缩放两者具有相同的间隙,但在“正常”缩放中,webgl 绘制的间隙比画布 2d 更大。可能是什么解释?我的猜测是 anti-aliasing,它为 canvas 2d 启用,但不适用于 webgl(我正在使用 firefox - 我想我今天晚些时候会进行 chrome 测试,看看会发生什么)

【问题讨论】:

  • 我认为我们需要更多信息才能提供帮助。我的第一印象是您的正交投影矩阵与您的画布尺寸不匹配。您能否详细介绍一下您的场景设置?
  • 我稍微更新了帖子。它确实是一个正交投影。谢谢。

标签: graphics opengl-es box2d webgl


【解决方案1】:

如果你检查box2d manual,它在第 4.2 章中说 box2d 引擎保持多边形稍微分开以避免隧道。检查 Box2d 调试绘图代码以了解它们如何从 box2d 转换为绘图坐标可能是一个好主意,以了解如何在您的应用程序中执行相同操作。

【讨论】:

  • 非常好的提示!这是真的,尽管它并没有解开整个谜团。间隙大小取决于缩放级别。我用更多信息更新了我的问题。非常感谢!
  • 根据同一个文档,多边形形状继承了形状类的半径字段。这会造成形状之间的差距。您可以使用此值并将形状画得稍大。
【解决方案2】:

使用您提供的矩阵,您将创建一个“虚拟大小”为画布尺寸两倍的视口。如果您正在尝试逐像素匹配,请尝试以下操作(缩放为 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 故意将它们放在那里,但它应该使它们不那么明显。

另一个减少可见间隙的方法是绘制几何图形,使其在物理表示的基础上稍微放大一点,以便在边缘周围显示一两个额外的像素。可能发生的最糟糕的情况是,几何图形可能看起来只是重叠了一点,但由您决定这是否是比间隙更令人反感的伪影。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多