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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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
在three.js中提高光线投射精度_Three.js_Raycasting - Fatal编程技术网

在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()
    对于每个面,生成两个随机数并在任何地方重复使用(性能更好)