Perspective Projection的背面移除

时间:2016-02-08 15:30:49

标签: canvas 3d

我正在进行3D练习,并且我已经实施了Backface Removal技术,该技术仅适用于正交投影,并且需要更改它以支持其他投影。

到目前为止我所做的是:

  1. 为每个多边形I循环所有顶点
  2. 执行过渡和投影计算
  3. 通过Newell方法计算表面法线
  4. 仅在矢量方向为<时才绘制多边形。 0
  5. 正如我所说,这只适用于正投影,我正在与其他预测斗争。 请任何帮助都很棒

    顺便说一下,我在某处看到了这个解释,但并不了解它: " ..在实际3D硬件中使用的常用方法是首先进行所有变换(包括投影),然后检查生成的2D三角形是逆时针还是顺时针缠绕,并根据该条件保留或丢弃#34 ;. 或许某人如何解释生成的二维三角形是什么?

    我使用的是html5 canvas和js。

1 个答案:

答案 0 :(得分:1)

这种方法在3d硬件中调用graphic pipeline。无论您使用哪种类型的投影,它总是会被转换为2D三角形,然后才会进行背面剔除测试。

function Triangle (a, b, c) {
    this.pointA = a;
    this.pointB = b;
    this.pointC = c;
}

Triangle.prototype.isBackface = function () {
    var ax = this.pointA.getProjectedX() - this.pointB.getProjectedX();
    var ay = this.pointA.getProjectedY() - this.pointB.getProjectedY();
    var bx = this.pointA.getProjectedX() - this.pointC.getProjectedX();
    var by = this.pointA.getProjectedY() - this.pointC.getProjectedY();
    var cz = ax * by - ay * bx;
    return cz < 0;
};

// before drawing a triangle you call a isBackface method. This method check
// either this triangle is counterclockwise or clockwise but just after 
// all projections.
Triangle.prototype.draw = function (context) {
    if (this.isBackface()) {
        return;
    }
    this._draw();
};