大佬教程收集整理的这篇文章主要介绍了javascript – 如何快速找到一个点在复杂的场景中被遮掩?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
目前,我正在使用Three.js的内置raytracer,并附带以下代码:
// pos = vector with (normalized) x,y coordinates on canvas // dir = vector from camera to target point const raycaster = new THREE.Raycaster(); const d = dir.length(); // distance to point let intersects = false; raycaster.setFromCamera(pos,camera); const intersections = raycaster.intersectObject(modelObject,truE); if (intersections.length > 0 && intersections[0].distance < d) intersects = true; // if ray intersects at a point closer than d,then the target point is obscured // otherwise it is visible
但是,这些复杂的模型非常慢(帧速率从50 fps降低到8 fps).我一直在寻找更好的方式来做到这一点,但到目前为止,我没有发现任何这样的工作很好.
有没有更好的,更有效的方法来确定场景中的一个点是否可见或模糊?
如果可以使用WebGL 2.0,可以使用遮挡查询.这归结为
var query = gl.createQuery(); gl.beginQuery(gl.ANY_SAMPLES_PASSED,query); // ... draw a small quad at the specified 3d position ... gl.endQuery(gl.ANY_SAMPLES_PASSED); // some time later,typically a few frames later (after a fraction of a second) if (gl.getQueryParameter(query,gl.QUERY_RESULT_AVAILABLE)) { gl.getQueryParameter(query,gl.QUERY_RESULT); }
但是请注意,查询的结果仅在几帧之后可用.
如果WebGl 2.0不是一个选项,那么你应该可以将场景绘制到一个framebuffer,在这个框架缓冲区里,你附加你自己的纹理来代替正常的z缓冲区.有一个扩展使用适当的深度纹理(more details here),但是在那里是不可能的,您总是可以回退到使用输出每个像素深度的片段着色器绘制场景.
然后可以在深度纹理上使用gl.ReadPixels().再次,请注意GPU-> CPU传输的延迟,这总是很重要.
说完所有这一切,根据你的DOM对象的外观,将DOM对象渲染成一个纹理可以更加容易和快捷,并使用四边形作为3D场景的一部分绘制纹理.
以上是大佬教程为你收集整理的javascript – 如何快速找到一个点在复杂的场景中被遮掩?全部内容,希望文章能够帮你解决javascript – 如何快速找到一个点在复杂的场景中被遮掩?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。