提交 15a3f8e9 编写于 作者: A alteredq

Added computeVertexNormals to BufferGeometry.

上级 34a42e26
因为 它太大了无法显示 source diff 。你可以改为 查看blob
此差异已折叠。
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -152,6 +152,115 @@ THREE.BufferGeometry.prototype = {
}
},
computeVertexNormals: function () {
var indices = this.vertexIndexArray;
var vertices = this.vertexPositionArray;
if ( vertices && indices ) {
var i, il;
var j, jl;
var nElements = vertices.length;
if ( this.vertexNormalArray === undefined ) {
this.vertexNormalArray = new Float32Array( nElements );
} else {
// reset existing normals to zero
for ( i = 0, il = this.vertexNormalArray.length; i < il; i ++ ) {
this.vertexNormalArray[ i ] = 0;
}
}
var offsets = this.offsets;
var normals = this.vertexNormalArray;
var vA, vB, vC, x, y, z,
pA = new THREE.Vector3(),
pB = new THREE.Vector3(),
pC = new THREE.Vector3(),
cb = new THREE.Vector3(),
ab = new THREE.Vector3();
for ( j = 0, jl = offsets.length; j < jl; ++ j ) {
var start = offsets[ j ].start;
var count = offsets[ j ].count;
var index = offsets[ j ].index;
for ( i = start, il = start + count; i < il; i += 3 ) {
vA = index + indices[ i ];
vB = index + indices[ i + 1 ];
vC = index + indices[ i + 2 ];
x = vertices[ vA * 3 ];
y = vertices[ vA * 3 + 1 ];
z = vertices[ vA * 3 + 2 ];
pA.set( x, y, z );
x = vertices[ vB * 3 ];
y = vertices[ vB * 3 + 1 ];
z = vertices[ vB * 3 + 2 ];
pB.set( x, y, z );
x = vertices[ vC * 3 ];
y = vertices[ vC * 3 + 1 ];
z = vertices[ vC * 3 + 2 ];
pC.set( x, y, z );
cb.sub( pC, pB );
ab.sub( pA, pB );
cb.crossSelf( ab );
normals[ vA * 3 ] += cb.x;
normals[ vA * 3 + 1 ] += cb.y;
normals[ vA * 3 + 2 ] += cb.z;
normals[ vB * 3 ] += cb.x;
normals[ vB * 3 + 1 ] += cb.y;
normals[ vB * 3 + 2 ] += cb.z;
normals[ vC * 3 ] += cb.x;
normals[ vC * 3 + 1 ] += cb.y;
normals[ vC * 3 + 2 ] += cb.z;
}
}
// normalize normals
for ( i = 0, il = normals.length; i < il; i += 3 ) {
x = normals[ i ];
y = normals[ i + 1 ];
z = normals[ i + 2 ];
var n = 1.0 / Math.sqrt( x * x + y * y + z * z );
normals[ i ] *= n;
normals[ i + 1 ] *= n;
normals[ i + 2 ] *= n;
}
this.normalsNeedUpdate = true;
}
}
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册