使用JavaScript

时间:2015-07-04 19:40:00

标签: javascript webgl

现在,这似乎是一个愚蠢的问题,但如何计算曲线的法线

为了计算曲面的法线,我前段时间写了下面的函数,而不是在此期间考虑这个问题......

function calcNormals (source, destination) {

  var subtract = function (a, b) {

    var vec3 = new Array(3);

    vec3[0] = a[0] - b[0],
    vec3[1] = a[1] - b[1],
    vec3[2] = a[2] - b[2];

    return vec3;

  }


  var crossProduct = function (a, b) {

    var vec3 = new Array(3);

    vec3[0] = a[1] * b[2] - a[2] * b[1];
    vec3[1] = a[2] * b[0] - a[0] * b[2];
    vec3[2] = a[0] * b[1] - a[1] * b[0];

    return vec3;

  }


  var normalize = function (a) {

    var vec3 = new Array(3);

    var len = a[0] * a[0] + a[1] * a[1] + a[2] * a[2];

    if (len > 0) {

      len = 1 / Math.sqrt(len);

      vec3[0] = len * a[0];
      vec3[1] = len * a[1];
      vec3[2] = len * a[2];

    }

    return vec3;

  }


  for (var i = 0; i < source.length / 9; i++) {

    var index = i * 9;

    var v1 = [

     source[index],
     source[index + 1],
     source[index + 2]

    ];

    var v2 = [

      source[index + 3],
      source[index + 4],
      source[index + 5]

    ];

    var v3 = [

      source[index + 6],
      source[index + 7],
      source[index + 8]

    ];

    var p12 = subtract(v2, v1),
        p23 = subtract(v3, v2);

    var cp = crossProduct(p12, p23);

    var normal = normalize(cp);


    for (var n = 0; n < 3; n++) {

      destination.push( normal[0], normal[1], normal[2] );

    }

  }

}

所以,这个函数适用于任意曲面:我只需关心顶点位于正确的方向,然后传入存储它们的数组并添加一个空数组计算的法线。

但原因仅适用于三角形,但我如何计算的法线?

计算曲线的法线是否取决于曲线本身最初的计算方式,或者是否可能存在类似于上面所写的函数,只需使用顶点数组作为输入,这样我就可以扩展这个现有的功能?

1 个答案:

答案 0 :(得分:5)

曲线有很多可能的法向量。

一般而言:

  • 您可以通过导数找到曲线的正切向量 曲线的功能和规范化。
  • 选择与切线向量正交的任意向量 并规范化它。这是正常。一个这样的载体 是曲线函数的归一化二阶导数。另一个 通过取切线和任意选择来找到这样的矢量 矢量,采取他们的交叉产品,并将结果标准化。
  • 取正切向量并取正则向量 交叉产品,并将结果标准化。这是 binormal

tangent-normal-binormal的组合也称为 Frenet frame