我应该如何处理比近剪切平面更靠近眼睛的剪切顶点?


13

我正在用JavaScript滚动自己的3D引擎,并且仅使用画布绘图,而不使用WebGL。这是另一个Minecraft克隆版本;我喜欢盒子,不要判断我。

到目前为止,除一件事外,其他所有东西都运转良好:在3D模式下,当某些顶点在接近裁剪平面的后面时,它们在屏幕上的投影变得怪异(假定用于追踪平面的其他顶点在前面)。

我尝试剪切这些点,但是随后我可以看到使用这些顶点的曲面。在WebGL / OpenGL中,图形卡可以处理这些点,并且可以正确渲染平面,但是我无法使用硬件,因此我必须自己编写代码。

我不太确定该怎么做,目前我想到的最后一件事是反转玩家近裁剪平面后面的点的投影,这很合逻辑,因为我必须将一个点投影到前面的屏幕上顶点

这是我的想法:

在此处输入图片说明

以下是一些图像说明发生了什么:

在此处输入图片说明

从远处看,蓝色框呈现得很好。

在此处输入图片说明

当某些顶点在播放器的接近裁剪平面的后面时,我会进行反向投影,但看起来不正确:

focalLength *= -1;
2d.x = x*focalLength/z;
2d.y = y*focalLength/z;

请注意,由于用于绘制其面的所有顶点都在播放器后面,因此后面的灰色框已被完全删除。

在此处输入图片说明

这是在向上或向下查找时发生的情况。

我不知道该怎么做背后的数学运算,我希望有人已经遇到了同样的问题,可以为我提供帮助。


1
如果这些点比附近的剪切平面更靠近眼睛,则应将其剪切-确实可以让您“透视”一个对象。这是典型的行为;碰撞通常会阻止特定的视觉伪影。那是剪辑解决方案唯一的问题吗?

@JoshPetrie:我知道必须修剪点,但是如果我这样做,整个正方形将会消失,因为绘图例程必须通过的一两个顶点丢失了(在2d中),玩家可以看到通过那个广场。我希望它们位于画布的“外部”(在投影上),以便仍可以绘制正方形。我不确定我是否足够清楚。
电磁线圈2012年

您-我是说这是正常行为,您想通过防止玩家其靠近一个立方体来防止这种情况的发生。如果您确实想这样做,则应该裁剪但可以重建三角形(可能)。这仍然看起来很不正常,特别是如果您有纹理。如果我的意思没有道理,您可以加入我们的聊天室,这样我们就不会创建真正的健谈评论线程。

您说的是有道理的,重建需要太多时间,所以这不是解决方案。我希望有一种方法可以在玩家后面的2d平面上绘制该顶点以便lineTo(x,y)仍然可以调用该函数,只是我不知道它的行为方式。我同意,这是一个离奇的维度。
电磁线圈2012年

Answers:


1

接近剪切平面的目的在于它是一个剪切平面。剪切平面之外的三角形被剪切:切成碎片,使剩下的每个碎片都在剪切区域内。

如果愿意,您可以尝试忽略附近的剪辑。确实,OpenGL和D3D具有完全关闭近平面裁剪的方法(尽管深度缓冲区的近距离值仍然最小)。问题不在于附近的剪辑。

问题出在相机后面的顶点。

您无法渲染位于相机后面的三角形。没有透视投影。在透视投影背后的数学计算下,这样的三角形没有意义。此外,它们也在平截头体之外。

在剪裁附近关闭将平截头体变成金字塔。金字塔停在该点的原因是,金字塔上方的点位于金字塔所有四个侧面的后面。因此,摄像头后面的任何点(金字塔的顶端)都位于屏幕可见区域的上方,下方,左侧和右侧。全部在同一时间。

就像我说的那样:相机后面的透视投影下的顶点没有意义。

您必须实现裁剪。您必须检测剪辑空间中(透视分割之前)三角形的任何顶点何时在相机后面。如果是这样,则必须裁剪该三角形,仅生成在相机前面的三角形。

这不是一个简单的过程。如果您对同构坐标系有充分的了解,它将涉及数学。另外,如果三角形的任何顶点在相机的后面,则可以将其三角形向上平直剔除。


到目前为止,我确实剔除了整个三角形,但后来我看穿了飞机(参见上图)。我真的需要一张图片来理解为什么它在几何上没有意义。唯一的解决方案是在其中一个顶点位于裁剪平面后方时计算平面线相交,并使用该相交从前面的顶点跟踪线,不幸的是,这很昂贵。
电磁线圈2012年

0

如果三角形的一部分位于近平面的后面,那么您是否可以按像素进行检查以查看像素位置是否在剪切平面的后面?

您可能像对待其他裁剪平面一样对待近平面。例如,剪切平面用于水平面之类的东西(用于反射和折射)。我认为该裁剪平面将像近乎裁剪平面一样工作,并以每个像素为基础进行裁剪。

我知道如何使用DirectX在HLSL中处理剪切平面,但是它们的实现可能是专有的。如果您可以保留该信息,可能会有所帮助。

另外,这里是一个可能对您有帮助的链接:http : //http.developer.nvidia.com/GPUGems2/gpugems2_chapter42.html


在像Javascript这样的解释性语言中,每像素测试的成本极其昂贵,我现在几乎无法接受fps。
电磁阀2012年
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.