如何在3D Javascript引擎中实现背面剔除
最近我一直在致力于用Javascript创建一个3D图形引擎。目前,相机可以在x、y和z轴上移动(学习如何旋转相机),并且可以旋转形状。形状是基于组成面的顶点组生成的 形状的绘图代码示例如下所示:如何在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
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缓冲区(深度缓冲区),它在没有硬件支持的情况下速度很慢,或者——正如前面所说的——一个二进制空间分区树。我会调查的