我正处于这个项目的最后阶段,我一直在努力,我遇到了点击和拖动对象的问题。我已将它们全部添加到一个名为items的数组中,它现在可以正常工作。 Here是操作页面的链接。如果您从右上方的菜单中添加任何项目,它将显示,但您只能逐个拖动它。据我所知,问题是它将每个项目视为一系列项目而不是一个项目。这是有道理的,因为每个模型拼凑在一起的几个模型,但我不知道如何解决这个问题。有什么想法吗?
以下是我控制鼠标互动的三个功能:
function onMouseMove( event ){
event.preventDefault();
mouse.x = ( event.clientX / width ) * 2 - 1;
mouse.y = - ( event.clientY / height ) * 2 + 1;
var vector = new THREE.Vector3( mouse.x, mouse.y, 0 );
projector.unprojectVector( vector, camera );
var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
if ( SELECTED ) {
var intersects = ray.intersectObject( plane );
SELECTED.position.copy( intersects[ 0 ].point.subSelf( offset ) );
return;
}
var intersects = ray.intersectObjects( items );
if ( intersects.length > 0 ) {
if ( INTERSECTED != intersects[ 0 ] ) {
INTERSECTED = intersects[ 0 ].object;
plane.position.copy( INTERSECTED.position );
}
container.style.cursor = 'pointer';
}
else {
INTERSECTED = null;
container.style.cursor = 'auto';
}
}
function onMouseDown( event ) {
event.preventDefault();
var vector = new THREE.Vector3( mouse.x, mouse.y, 0 );
projector.unprojectVector( vector, camera );
var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
var intersects = ray.intersectObjects( items );
if ( intersects.length > 0 ) {
SELECTED = intersects[ 0 ].object;
var intersects = ray.intersectObject( plane );
offset.copy( intersects[ 0 ].point ).subSelf( plane.position );
container.style.cursor = 'move';
}
}
function onMouseUp( event ) {
event.preventDefault();
if ( INTERSECTED ) {
plane.position.copy( INTERSECTED.position );
SELECTED = null;
}
container.style.cursor = 'auto';
}
它主要基于this示例,但没有颜色位。
通过更改onMouseDown中的代码,如此
// OLD
SELECTED = intersects[0].object;
// NEW
SELECTED = intersects[0].object.parent;
我现在可以移动整个对象了。这仅在对象只有一个父对象时才有效,因此某些项目无法使用此代码移动。任何人都有一个关于确定它是否有父对象的建议,如果有的话会向上移动吗?
答案 0 :(得分:2)
如果有人对这个问题感兴趣,subSelf
方法现在称为sub
。
答案 1 :(得分:0)
通过将以下内容添加到onMouseDown
来解决SELECTED = intersects[0].object;
while(SELECTED.parent != scene){
SELECTED = SELECTED.parent;
}
这可以确保抓取的对象将是场景中的最高级别,并且可以拖动所有模型。