2011-12-07 23 views
1

我正在处理这个项目的最后一段时间,我一直在处理,并且遇到了单击和拖动对象的能力问题。我已经将它们全部添加到一个名为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

通过添加以下到onmousedown事件

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

这保证了对象抓起将是不现场,让所有的车型拖能够在最高水平的解决。

+0

您是否可以通过点击投票箭头下方的复选标记来标记接受的答案,以便它未在未解答的问题下列出?谢谢! –

2

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