如何在3D Javascript引擎中实现背面剔除

如何在3D Javascript引擎中实现背面剔除,javascript,canvas,3d,Javascript,Canvas,3d,最近我一直在致力于用Javascript创建一个3D图形引擎。目前,相机可以在x、y和z轴上移动(学习如何旋转相机),并且可以旋转形状。形状是基于组成面的顶点组生成的 形状的绘图代码示例如下所示: function renderShapes() { for (i = 0; i < objects.length; i++) { // For each object for (j = 0; j < objects[i].faces.length; j++) { // For ea

最近我一直在致力于用Javascript创建一个3D图形引擎。目前,相机可以在x、y和z轴上移动(学习如何旋转相机),并且可以旋转形状。形状是基于组成面的顶点组生成的

形状的绘图代码示例如下所示:

function renderShapes() {
for (i = 0; i < objects.length; i++) { // For each object
    for (j = 0; j < objects[i].faces.length; j++) { // For each face
        var face = objects[i].faces[j];

        var P = project(face[0],objects[i].type);
        if (P == false) { // project the coordinates based on camera. 
            continue;
        }
        ctx.beginPath();
        ctx.moveTo(P.x + cx, - P.y + cy); // Start line at first vertex

        // Draw the other vertices that make up the face
        for (l = 0; l < face.length; l++) {
            P = project(face[l],objects[i].type);
            if (P == false) {
                continue;
            }
            ctx.lineTo(P.x + cx, -P.y + cy); // Draw line to the next vertex
        }


        // Close the path and draw the face
        ctx.closePath();
        ctx.stroke();
        if (objects[i].color != undefined) { // Fill in a color if the object has color property
            ctx.fillStyle = objects[i].color;
            ctx.fill();
        }
    }
}
}
函数renderShapes(){
对于每个对象(i=0;i
上面的代码根据我旋转它的方式大致生成如下内容:

除了绘制所有面之外,所有面都可以完美地工作,并且根据它们在对象数组中的顺序,可以重叠其中一个面。红色立方体就是我的问题的一个例子。蓝色钻石是我想要实现的一个例子,干净的面只根据相机所能看到的进行渲染。与其渲染菱形的所有8个面,不如只渲染4个可见面。与其渲染立方体的所有6个面,不如只渲染2个可见面

我对此进行了研究,以找到背面剔除,尽管这些例子要么不存在,要么语言错误,要么很难理解或适合我的情况

有谁能用外行的话向我解释一下背面剔除是如何工作的?如果可能,可以在我的代码中实现一个Javascript示例

或者,对于我试图实现的目标,是否有不同的词或短语,或者是否有更适合的不同过程或算法


感谢

背面剔除(防止绘制法线点远离摄影机的面)和z排序之间存在差异。软件渲染器可以使用二进制空间分区树进行后期渲染。但是,如果仅渲染单个凸面对象,则背面消隐具有相同的效果。如果你的场景更复杂,你需要一个z缓冲区(深度缓冲区),它在没有硬件支持的情况下速度很慢,或者——正如前面所说的——一个二进制空间分区树。我会调查的