首先,我不是很擅长计算机图形学。我试着实现一个GUI工具包,其中一个功能是能够对2D“层”应用3D变换(一个层只有一个Z坐标,因为在预转换阶段它是一个二维轴对齐的矩形)。
现在,这很简单,直到你遇到需要将层推回的3D转换,需要将层分成几个多边形来正确呈现它,如下图所示。由于可以有透明度,层可能没有完全被遮挡,同时需要分割。
下面是描述问题和期望结果的插图。在这种情况下,蓝色层(称之为B)在红色层(R)上方,具有相同的Z位置(但是B是在R之后添加的)。在这种情况下,如果我们旋转B,其顶部两个点将获得低于0的Z索引,而底部点将获得高于0的索引(锚点是唯一剩下的点/线为0)。 请问有人能够建议一种在CPU上完成此操作的好方法吗?我已经很难找到适合这种情况的算法实现(使用C ++或C)。 编辑: 为了澄清,此阶段尚未进行渲染。我们只需要为每个层生成一组多边形,这些多边形将表示层的变换和遮挡几何。然后,如果需要,进行渲染(软件或硬件),并不总是必须的(例如,在执行命中测试时)。 编辑2: 我考虑过二进制空间分割作为实现这一目标的选项,但我只能找到一个实现(在
我需要的算法是将图层B几何地分成两个蓝色形状,其中一个形状会被“上面”绘制,另一个则会被“下面”的R覆盖部分遮盖,但这不是主要问题。因此,只需将B分成两个多边形,这样在以顺序绘制这些多边形时,它们似乎穿过了R。无需担心混合效果。编辑4:就此而言,我们不能渲染任何内容。这一切都必须纯粹地通过几何方式实现(生成2D多边形)。这就是我最初想到的。 编辑5:我应该指出,每个子场景的总四边形数量约为30(平均值)。除非图层被3D变换(这就是这个问题出现的地方),否则它们只是按Z位置进行基数排序,然后按添加顺序(先进先出)绘制具有相同Z位置的图层。如果我没有在原始问题中表述清楚,那我很抱歉。
现在,这很简单,直到你遇到需要将层推回的3D转换,需要将层分成几个多边形来正确呈现它,如下图所示。由于可以有透明度,层可能没有完全被遮挡,同时需要分割。
下面是描述问题和期望结果的插图。在这种情况下,蓝色层(称之为B)在红色层(R)上方,具有相同的Z位置(但是B是在R之后添加的)。在这种情况下,如果我们旋转B,其顶部两个点将获得低于0的Z索引,而底部点将获得高于0的索引(锚点是唯一剩下的点/线为0)。 请问有人能够建议一种在CPU上完成此操作的好方法吗?我已经很难找到适合这种情况的算法实现(使用C ++或C)。 编辑: 为了澄清,此阶段尚未进行渲染。我们只需要为每个层生成一组多边形,这些多边形将表示层的变换和遮挡几何。然后,如果需要,进行渲染(软件或硬件),并不总是必须的(例如,在执行命中测试时)。 编辑2: 我考虑过二进制空间分割作为实现这一目标的选项,但我只能找到一个实现(在
GL2PS
中),我不知道如何使用它。我对BSP的工作原理有些模糊的了解,但我不确定它们如何用于遮挡剔除。
编辑3: 我不是在尝试进行颜色和透明度混合。仅处理纯几何体。透明度可以由渲染器处理,并且重绘是可以接受的。在这种情况下,蓝色多边形可以在红色多边形下面绘制,但对于更复杂的情况,可能需要深度排序甚至拆分多边形(像下面这样的可怕案例的示例)。虽然视口是固定的,但由于所有层都可以在3D中变换,因此可以创建下面显示的形状。我需要的算法是将图层B几何地分成两个蓝色形状,其中一个形状会被“上面”绘制,另一个则会被“下面”的R覆盖部分遮盖,但这不是主要问题。因此,只需将B分成两个多边形,这样在以顺序绘制这些多边形时,它们似乎穿过了R。无需担心混合效果。编辑4:就此而言,我们不能渲染任何内容。这一切都必须纯粹地通过几何方式实现(生成2D多边形)。这就是我最初想到的。 编辑5:我应该指出,每个子场景的总四边形数量约为30(平均值)。除非图层被3D变换(这就是这个问题出现的地方),否则它们只是按Z位置进行基数排序,然后按添加顺序(先进先出)绘制具有相同Z位置的图层。如果我没有在原始问题中表述清楚,那我很抱歉。