现在,这似乎是一个愚蠢的问题,但如何计算曲线的法线?
为了计算曲面的法线,我前段时间写了下面的函数,而不是在此期间考虑这个问题......
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] );
}
}
}
所以,这个函数适用于任意曲面:我只需关心顶点位于正确的方向,然后传入存储它们的数组并添加一个空数组计算的法线。
但原因仅适用于三角形,但我如何计算行的法线?
计算曲线的法线是否取决于曲线本身最初的计算方式,或者是否可能存在类似于上面所写的函数,只需使用顶点数组作为输入,这样我就可以扩展这个现有的功能?
答案 0 :(得分:5)
曲线有很多可能的法向量。
一般而言:
tangent-normal-binormal的组合也称为 Frenet frame 。