单击并拖动仅抓取对象的一部分

时间:2011-12-07 07:26:00

标签: javascript webgl three.js

我正处于这个项目的最后阶段,我一直在努力,我遇到了点击和拖动对象的问题。我已将它们全部添加到一个名为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;

我现在可以移动整个对象了。这仅在对象只有一个父对象时才有效,因此某些项目无法使用此代码移动。任何人都有一个关于确定它是否有父对象的建议,如果有的话会向上移动吗?

2 个答案:

答案 0 :(得分:2)

如果有人对这个问题感兴趣,subSelf方法现在称为sub

答案 1 :(得分:0)

通过将以下内容添加到onMouseDown

来解决
SELECTED = intersects[0].object;
while(SELECTED.parent != scene){
    SELECTED = SELECTED.parent;
}

这可以确保抓取的对象将是场景中的最高级别,并且可以拖动所有模型。