使用曲面法线的正射矫正3D背面剔除
-
13-12-2019 - |
题
我正在创建一个html5帆布3d渲染器,我会说我没有得到的帮助,我已经得到了很远,但我遇到了各种各样的Showstopper。我正在尝试在一些法线计算的帮助下实现立方体的背面剔除。此外,我将此标记为WebGL,因为这是一个足够的问题,它可以适用于我的用例和3D加速的问题。
以任何速度,正如我旋转立方体的那样,我发现错误的面部正在隐藏。示例:
我使用的一般程序是:
-
通过该转换矩阵来改造多维数据集的顶点
-
对于每个面,对于每张面上的每个点,我将它们转换为vec3s,Andn将它们乘以步骤1所做的矩阵。
-
我使用Newell的方法获取面部的表面法线,然后从该正常和一些构造的Vec3获得一个点产品,例如[-1,1,1],因为我无法“想到这里有一个很好的价值。我见过一些人使用相机的位置,但...
-
跳过使用相机矩阵的通常步骤,我从得到的向量中拉动x和y值,以发送到我的线和面部渲染器,但只有它们有一个上面的dot-master 0.我意识到我拉的是它相当任意的,真的。
我想知道两件事;如果步骤3中的程序是正确的(它很可能不是),如果我在面上绘制的点的顺序不正确(很可能)。如果后者是真的,我并不完全确定如何想象这个问题。我见过人们说,正常没有涉及,这就是线的方向被绘制,但是我很难将我的头包裹在那个地方,或者这是我问题的来源。 它可能没关系,但我正在使用的矩阵库是gl-matrix:
https://github.com/toji/gl-matrix
此外,我正在使用的我的开源代码库中的特定文件在此处:http://code.google.com / p/nanoblok/source/browse/nb11/papp/render.js
提前感谢!
解决方案
我还没有审查整个系统,但“制作vec3”不应该是任意的;它应该是“出屏幕”向量,这是(由于您的投影是⟨ x , Y , Z ⟩→ x , y ⟩)是χ0,0,-1⟩或⟨0,0,1°,具体取决于您的坐标系的手性和屏幕轴。您没有明确的“相机矩阵”(通常称为视图矩阵),但您的相机(视图和投影)由步骤4投影隐式定义!
然而,注意,该方法仅适用于正交投影,而不是透视的投影(考虑屏幕左侧的脸部,向右面对视图;圆点产品是0但应该是0可见的)。在实际3D硬件中使用的通常方法是首先做所有的转换(包括投影),然后检查所得到的2D三角形是否逆时针缠绕,并根据该条件保持或丢弃。