我的ray.intersectObjects可以很好地处理场景中的对象,直到我动态修改对象的几何形状.虽然渲染器将对象显示为已修改(顶点移动并且面更改),但是当对修改的对象尝试交叉时,它会产生奇怪的结果.我需要交叉甚至在修改过的几何体上工作!
为了帮助调试和跟踪交叉在我的场景中的工作方式,我添加了一个函数:makeMiniSphere().这会在场景中发生交叉点时生成新的球体对象.使用它,您可以看到修改立方体后,有时交叉点击立方体,有时它会直接通过(主要是已修改的面).这不是一个随机问题,但是您在修改后的多维数据集周围点击的次数越多,您就越能看到模式的发展.几乎就像场景视觉效果的渲染器知道多维数据集被修改的方向一样,但是ray.intersectObjects认为它已经在不同的方向上进行了修改!
以下是测试网站的链接:http://www.littledrop.net/html/cadiverse/HelloWorld.html
显示问题的方向:
左键单击立方体以显示交叉点.在Three.js看到相交的任何地方都会创建迷你球体.如果尚未选择,则所选对象的颜色将更改为黄色.
单击多维数据集的任何面.这将A.如果它还不是黄色,则将其变为黄色.B.它将选择立方体的面,尽管选定的面看起来与立方体的其余部分没有任何不同.
按"向右"箭头键将选定的面向右移动.这将动态更改多维数据集的几何.
现在尝试单击多维数据集 - 尤其是在已修改的区域中.Mini球体将再次显示软件认为交叉点发生的位置.
这是交叉代码:
function onDocumentMouseDown (event)
{
// the following line would stop any other event handler from firing
// (such as the mouse's TrackballControls)
//event.preventDefault();
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
document.getElementById('message1').innerHTML = window.innerHeight;
var isinworkingarea = window.innerHeight-menubarh;
if (event.clientY<=isinworkingarea)
{
var vector = new THREE.Vector3( mouse.x, mouse.y, 1 );
projector.unprojectVector( …Run Code Online (Sandbox Code Playgroud) three.js ×1