我需要通过单击它们来选择对象,并弹出非模态对话框以显示有关该对象的信息。它可以正常工作,但是如果用户点击任何GUI项目,包括对话框,并且后面有一个对象,则会选择三个js对象,从而更改弹出窗口中的信息。
以下是摘录。
document.addEventListener( 'mousedown', onDocumentMouseDown, false );
jQuery对话框生成器:
function createDialog(title, text, top) {
return $("<div class='dialog' title='" + title + "'><p id='bodyText'> " + text + "</p></div>")
.dialog({ position: { my: ("right" + 0 + "top+" + top), at: "right top" },
close : setDialogNull, });
}
onMouseDown函数:
function onDocumentMouseDown( e ) {
e.preventDefault();
console.log(dialog);
var mouseVector = new THREE.Vector3();
mouseVector.x = 2 * (e.clientX / window.innerWidth ) - 1;
mouseVector.y = 1 - 2 * ( e.clientY / window.innerHeight );
var raycaster = new THREE.Raycaster();
raycaster.setFromCamera( mouseVector, camera );
var intersects = raycaster.intersectObjects(objectCollection );
if (intersects.length > 0) {
var selectedObject = intersects[0];
console.log("Intersected object", intersects[0]);
selectedObject.object.material = (selectedObject.object.material.wireframe) ? selectedBoxMaterial : unselectedBoxMaterial;
var text = intersects[0].distance;
var title = "Shelf info";
if (dialog == false) {
createDialog(title, text, offset);
offset = offset - 50;
console.log(offset);
dialog = true;
console.log(dialog);
}
if (dialog == true) {
{jQuery("#bodyText").text(text);
}
}
}
使用dat.GUI创建其他GUI元素。
在搜索此问题时,大多数结果都是关于Unity的,而不是一个经验丰富的开发人员,我真的不明白如何适应它们。
答案 0 :(得分:0)
如果没有更多代码来了解您的设置和事件,很难知道解决方案是什么。我会给保存你的three.js的元素一个特定的ID,并在onDocumentMouseDown中检查它是否是活动元素。您可能需要检查document.activeElement.parentElement.id,或者其他任何内容,具体取决于您的设置。
#include <boost/pending/disjoint_sets.hpp>
int main(){
boost::disjoint_sets_with_storage<> union_find;
union_find.make_set(1);
//..
}
理想情况下,您应该为three.js容器设置特定事件,而不是使用全局文档事件,但现在应该有一个例外。许多代码示例都使用document.addEventListener而不是简单,而不是最佳实践。