Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Webgl 如何检测网格上照亮面的数量?_Webgl_Three.js - Fatal编程技术网

Webgl 如何检测网格上照亮面的数量?

Webgl 如何检测网格上照亮面的数量?,webgl,three.js,Webgl,Three.js,我在一个THREE.scene中排列了许多对象,我想计算或检索一个相对值,该值指示每个对象从单个点光源接收的光线量。简化示例: 当光线定位在摄像机上时,1块的值可能为0.50,因为6个面中有3个面完全暴露,而2为~0.33,3为~1.67 我可以通过从光线中向每个面的中心画一条光线并观察相交点来完成这项工作,但我假设可以直接检索每个面的光线级别。我认为类似的方法应该可以实现这一目的 var金额=0; 变量面=mesh.geometry.faces; 对于(变量i=0;i0)数量++; } 此代

我在一个
THREE.scene
中排列了许多对象,我想计算或检索一个相对值,该值指示每个对象从单个
点光源接收的光线量。简化示例:

当光线定位在摄像机上时,1块的值可能为0.50,因为6个面中有3个面完全暴露,而2为~0.33,3为~1.67


我可以通过从光线中向每个面的中心画一条光线并观察相交点来完成这项工作,但我假设可以直接检索每个面的光线级别。

我认为类似的方法应该可以实现这一目的

var金额=0;
变量面=mesh.geometry.faces;
对于(变量i=0;i0)数量++;
}

此代码考虑对象的全局矩阵

var金额=0;
var rotationMatrix=新的三个.Matrix4();
var vector=new THREE.Vector3();
var centroid=新的3.Vector3();
var normal=new-THREE.Vector3();
对于(var i=0;i0)数量++;
}
}
(警告:暴力法!)

我将此作为参考,因为我目前正在使用它来满足问题中描述的所有要求。如果从灯光位置无法直接看到面中心,则此函数将考虑面未照明

我的应用没有考虑旋转矩阵。

功能getLightLevel(obj){
/*对象几何体面暴露在光线下的返回百分比*/
var-litCount=0;
变量面=obj.geometry.faces;
var faceCount=faces.length;
变量方向=新的三个向量3();
var centroid=新的3.Vector3();
对于(变量i=0;i0){
添加(对象位置,面[i].形心);
direction.sub(形心、灯光、位置).normalize();
//如果质心被其他对象遮挡,则排除面。
var射线=新的三条射线(光、位置、方向);
var intersects=光线。intersectObjects(对象);
如果(intersects.length>0&&intersects[0]。面===面[i]){
litCount++;
}
}
}
返回litCount/faceCount;
}

这对单个对象很有效,但在我的示例中,它将为所有三个多维数据集返回相同的值。我需要从计数中排除(大部分)被其他对象遮挡的面。将光线指向每个面质心,并测试第一个相交对象===
网格
,这样做有意义吗?看起来它会将
数量
设置为所有对象照亮面的总和(如果我错了,请纠正我),但这里的信息仍然非常有用,而
normal
测试确实很好地回答了标题问题。请参阅我的答案,了解我仅计算暴露面的方法。是的,这是所有对象的总和。似乎我对要求有点困惑。很高兴看到您成功地从这个代码中获得了正确的代码。这不太好。。。尝试使用我建议的代码。使用此代码,您将执行^2次检查(对于每个面,您将使用Ray再次测试所有面)。@mrdoob这是对少量对象的一次性检查,但我仍在寻找更好的方法来处理它。对我来说,知道哪些面被其他面挡住了光线是很重要的,我希望有一种方法可以在启用阴影时直接从照明系统访问某些值。