2012-07-28 33 views
1

我正在创建一个HTML5画布3D渲染器,并且我会说我没有SO的帮助已经变得相当远了,但我遇到了各种各样的困难。我正试图在一些法线计算的帮助下实施背面剔除。另外,我将它标记为WebGL,因为这是一个足够普遍的问题,它可以适用于我的用例和3D加速的用例。使用曲面法线进行正视3D背面剔除

无论如何,当我旋转立方体时,我发现错误的面孔被隐藏起来。例如:

Backface Culling Issue on a Cube

我使用以下的顶点: https://developer.mozilla.org/en/WebGL/Creating_3D_objects_using_WebGL#Define_the_positions_of_the_cube%27s_vertices

我使用的一般程序:

  1. 创建,通过该变换的变换矩阵立方体的顶点

  2. 对于每个面和每个f上的每个点ace,我将它们转换为vec3s,并将它们与步骤1中制作的矩阵相乘。

  3. 然后,我使用Newell的方法获取脸部的曲面法线,然后从该法线获得点积, up vec3,例如[-1,1,1],因为我想不出有什么价值。我见过一些人使用相机的位置,但是...

  4. 跳过使用相机矩阵的常用步骤,我从结果向量中拉出x和y值以发送到我的行并面对渲染器,但只有当它们的点积大于0时,我才会意识到这真的是我所拉动的那些东西。

我想知道两件事;如果我在第3步中的过程是正确的(最可能不是),并且如果我在脸上绘制的点的顺序不正确(很可能)。如果后者是真的,我不太确定如何看到问题。我曾经看到有人说法线不相关,它是线条被绘制的方向,但是......我很难围绕这一点,或者如果这是我的问题的根源。

它可能并不重要,但我使用矩阵库是GL-矩阵:

https://github.com/toji/gl-matrix

而且,我用我的开源代码库的特定文件是在这里:

http://code.google.com/p/nanoblok/source/browse/nb11/app/render.js

提前感谢!

回答

1

我还没有审查过你的整个系统,但“made-up vec3”不应该是任意的;它应该是“出屏幕的”载体,其中(因为你的投影是⟨Xÿž⟩→⟨Xÿ⟩)要么是⟨0,0, - 1⟩或⟨0,0,1⟩,具体取决于您的坐标系的旋向和屏幕轴。你没有明确的“摄像机矩阵”(通常称为视图矩阵),但是你的摄像机(视图和投影)由第4步投影隐式定义!

但是,请注意,此方法仅适用于正投影投影,而不适用于透视投影(考虑屏幕左侧的面朝右,并与视图方向平行;点积应为0,但应为可见)。在实际的3D硬件中使用的通常方法是首先进行所有的变换(包括投影),然后检查产​​生的二维三角形是逆时针还是顺时针缠绕,并根据该条件保留或丢弃。

+0

嗯,是的,我已经尝试了一些,但没有考虑到它。我简直不敢相信 - 一个简单的0,0,1(或z:-1)向量做了这个诀窍。该死的!谢谢一堆。 :) – 2012-07-29 06:42:23