在three.js中提高光线投射精度
我使用重铸将光线从网格的每个面中点投射到网格本身,以找到局部厚度。有趣的是,由于网格排列的原因,有时光线会在三角形之间通过,并且不会显示正确的厚度。有人对我说浮动精度有问题。我想知道是否有人知道如何改进我的代码。 多谢各位在three.js中提高光线投射精度,three.js,raycasting,Three.js,Raycasting,我使用重铸将光线从网格的每个面中点投射到网格本身,以找到局部厚度。有趣的是,由于网格排列的原因,有时光线会在三角形之间通过,并且不会显示正确的厚度。有人对我说浮动精度有问题。我想知道是否有人知道如何改进我的代码。 多谢各位 var scene=new THREE.scene(); var摄像机=新的三透视摄像机(45,window.innerWidth/window.innerHeight,0.11000); 摄像机位置设置刻度(500); var renderer=new THREE.Web
var scene=new THREE.scene();
var摄像机=新的三透视摄像机(45,window.innerWidth/window.innerHeight,0.11000);
摄像机位置设置刻度(500);
var renderer=new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth、window.innerHeight);
document.body.appendChild(renderer.doElement);
var controls=新的三个.OrbitControls(摄影机、渲染器.doElement);
var loader=new THREE.STLLoader();
loader.load('https://sos-ch-dk-2.exo.io/stl-upload-test/uploads/stl/5bd15fae89ff9a1cb7816af9/stl/hexagon.STL,函数(几何){
var material=new THREE.MeshBasicMaterial({side:THREE.DoubleSide,vertexColors:THREE.vertexColors});
var mesh=新的三个网格(几何体、材质);
场景。添加(网格);
彩色网格(网格);
});
函数colorMesh(网格){
//var minDist=0.6;
var colorArray=[];
var raycaster=new THREE.raycaster();
var相交=[];
var pos=mesh.geometry.attributes.position;
var ori=新的3.Vector3();
var dir=new THREE.Vector3();
var trc=new THREE.Vector3();
var a=new THREE.Vector3(),
b=新的三个向量3(),
c=新的三个向量3(),
中点=新的3.Vector3(),
tri=新的三个三角形();
var最近=新的3.Vector3();
变量面=位置计数/3;
for(设i=0;i1?1:0]。距离);
Minist=相交[intersects.length>1?1:0]。距离;
console.log(minDist);
var col=新的三个向量3(数学地板((10/明德主义者)*255),数学地板(0.01*明德主义者*255),0);
//var col=新的三个向量3(0,0,0);
对于(var j=0;j=0.6;
}
renderer.setAnimationLoop(()=>{
渲染器。渲染(场景、摄影机)
});
正文{
溢出:隐藏;
保证金:0;
}
问题是,它不考虑所有可能的情况。事实上,它返回的是交点,或者NULL,这是不足以处理你的边问题。
问题是:
当光线与网格相交时,可能存在许多特殊情况:
光线正好穿过网格-->的一个顶点在当前实现中,这将报告为零或一个或两个或最多N个交点(取决于浮点精度如何作用于基于此顶点的N个面中的每个面)
雷沿着其中一张脸走
光线沿面移动,最后与顶点相交
…还有更多类似的情况,但你明白了
有一种方法可以显著降低陷入这些情况的风险:不要使用面部中点,而是在面部随机选取一个点
例如:
//tri.getmiddpoint(ori);
//在脸上得到一些随机点
设r0=0.33*Math.random();
设r1=0.33*Math.random();
设r2=1.0-r0-r1;
设ori=新的3.Vector3(
r0*a.x+r1*b.x+r2*c.x,
r0*a.y+r1*b.y+r2*c.y,
r0*a.z+r1*b.z+r2*c.z
);
你必须向我们展示你的代码才能得到任何有意义的答案。当然,我如何添加我的代码,代码有点长,无法添加JSFIDLE链接!编辑你的答案。不要发布所有答案,只发布相关部分。复制粘贴代码到你的答案中,不要发布代码的屏幕截图(文字图片对于试图帮助您是无用的)。您可以添加谢谢!我已经想到了获取一个随机点,因此光线在两个三角形之间通过或遇到的情况的风险较小?风险一定要小得多,我也有这个问题,这对我帮助很大。顺便说一句,您不应该做Math.random()
对于每个面,生成两个随机数并在任何地方重复使用(性能更好)