我正在创建一个html5帆布3d渲染器,我会说我没有得到的帮助,我已经得到了很远,但我遇到了各种各样的Showstopper。我正在尝试在一些法线计算的帮助下实现立方体的背面剔除。此外,我将此标记为WebGL,因为这是一个足够的问题,它可以适用于我的用例和3D加速的问题。

以任何速度,正如我旋转立方体的那样,我发现错误的面部正在隐藏。示例:

我正在使用以下顶点: https://developer.mozilla.org/en/webl/creating_3d_objects_using_webl#define_the_positions_of_the_cube _ 27s_vertices

我使用的一般程序是:

  1. 通过该转换矩阵来改造多维数据集的顶点

  2. 对于每个面,对于每张面上的每个点,我将它们转换为vec3s,Andn将它们乘以步骤1所做的矩阵。

  3. 我使用Newell的方法获取面部的表面法线,然后从该正常和一些构造的Vec3获得一个点产品,例如[-1,1,1],因为我无法“想到这里有一个很好的价值。我见过一些人使用相机的位置,但...

  4. 跳过使用相机矩阵的通常步骤,我从得到的向量中拉动x和y值,以发送到我的线和面部渲染器,但只有它们有一个上面的dot-master 0.我意识到我拉的是它相当任意的,真的。

  5. 我想知道两件事;如果步骤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三角形是否逆时针缠绕,并根据该条件保持或丢弃。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top