我有一些排列在a中的对象THREE.scene,我想计算或检索一个相对值,表示每个对象从单个PointLight源接收多少光.简化示例:

与位于摄像机的光,块1的值可能是因为0.50 3 6的表面被完全暴露,而2是〜0.33和3是〜1.67.
我可以通过从光线向每个面的中心绘制光线并观察相交来做到这一点,但我认为可以直接检索每个面部的光线水平.
此代码考虑了对象的全局矩阵.
var amount = 0;
var rotationMatrix = new THREE.Matrix4();
var vector = new THREE.Vector3();
var centroid = new THREE.Vector3();
var normal = new THREE.Vector3();
for ( var i = 0; i < objects.length; i ++ ) {
var object = objects[ i ];
rotationMatrix.extractRotation( object.matrixWorld );
for ( var j = 0; j < object.geometry.faces.length; j ++ ) {
var face = object.geometry.faces[ j ];
centroid.copy( face.centroid );
object.matrixWorld.multiplyVector3( centroid );
normal.copy( face.normal );
rotationMatrix.multiplyVector3( normal );
vector.sub( light.position, centroid ).normalize();
if ( normal.dot( vector ) > 0 ) amount ++;
}
}
Run Code Online (Sandbox Code Playgroud)