我认为问题可能是因为它是一个加载的对象而不是“已创建”的几何体,但我希望能够选择一个对象并显示它已被选中,就像在this示例中一样。
我加载了多个对象,并且我跟踪每个对象的索引(因此第一个加载的对象有objIndex = 0等),我知道我的代码可以识别出我从控制台“向下鼠标”的时间。但是,它表示intersects.length = 0,因此跳过了函数的其余部分。
我也不确定“intersects.length”的实际长度是什么。
所以我想我的问题是:
什么是“intersects.length”取长度?
为什么我的对象的“intersects.length”为0?
我可以做些什么来识别对象?
以下是相关代码:
function onDocumentMouseDown(event) {
event.preventDefault();
// default action of event will not be triggered
var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5).unproject(camera);
// used to pass 3D positions and directions
var raycaster = new THREE.Raycaster(camera.position,
vector.sub(camera.position).normalize());
var intersects = raycaster.intersectObjects(objects);
console.log('Mouse is down.');
console.log(intersects.length);
if (intersects.length > 0) {
controls.enabled = false;
SELECTED = intersects[0].object;
var intersects = raycaster.intersectObjects(plane);
offset.copy(intersects[0].point).sub(plane.position);
container.style.cursor = 'move';
console.log('Clicked object: ' + object.name);
}
}
如果您需要了解更多信息,请与我们联系!谢谢。 :)
答案 0 :(得分:2)
回答你的问题:
以下是关于光线投射的有趣读物,以帮助澄清光线投射: http://soledadpenades.com/articles/three-js-tutorials/object-picking/
因此,光线投射基本上是(真的)施放假想的光线。当你“鼠标按下”时,所谓的程序会将直线阵列投射到场景中。现在回答你的问题:
对于问题一(1)和二(2):现在当你投射一条光线时,它可能会或可能不会与一个物体相交。例如,如果单击进入空白区域,则光线将不会捕获对象。然而,正如其名称所暗示的那样,光线投射会投射一条光线,并且它也可能会沿途撞击多个物体。例如,如果您有一个对象和另一个直接位于第一个对象后面的对象,则将光线投射到第一个对象中也将与第二个对象相交。光线投射将“捕获”两个对象,并将两个对象放入数组“相交”。因此,命令
if (intersects.length > 0)
声明如果光线投射“捕捉”并反对,请执行这些。此外,它继续调用intersects [0]来引用intersects数组中的第一个对象。在这种情况下,光线投射捕获的最前面的对象。您可以通过创建数百个对象来测试我的答案,并声明对于intersects数组中的每个成员,您将颜色更改为红色(例如)。您将看到,如果光线投射捕获多个对象,则所有对象都将变为该颜色。希望前两个问题!
我不确定你要求的第三个问题。你能进一步澄清吗?识别对象的一种方法是将它们放入场景中并将光线投射放在场景上。但是,我不太确定你要求给你答案我想你想要什么。