Three.js [r65]:通过TrackballControls轮换后,Raycaster通过奇怪的方式进行挑选

时间:2014-01-27 16:42:51

标签: javascript rotation three.js picking

一点背景:

我有一个填充了大量对象(非合并)的场景,这些对象必须是可以单独挑选的。

这些对象中的每一个都是具有以下结构的Object3D:

parent Object3D
|_ child_1
|_ child_2
|_ etc

默认情况下,在初始渲染时,只有child_1可见。

每个child_1都是一个平面几何体,其四元数设置为相机的四元数,因此它始终面向它(类似于广告牌)

相机声明如下:

camera = new THREE.PerspectiveCamera(
 70,
 WIDTH / HEIGHT,
 0.1,
 10000000
);
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 500000;
camera.lookAt(new THREE.Vector3( 0, 0, 0 ));
scene.add(camera);

每个child_1都插入场景中,如下所示:

child_1 = new THREE.Mesh(
  new THREE.PlaneGeometry(child_1_scale, child_1_scale),
  new THREE.MeshBasicMaterial({
    map: child_1_texture,
    blending: THREE.AdditiveBlending,
    color: new THREE.Color('rgb('+child_1_data.color.r+','+child_1_data.color.g+','+child_1_data.color.b+')'),
    transparent: true
  })
);

child_1.quaternion = camera.quaternion;
child_1.castShadow = false;
child_1.receiveShadow = false;

parent.add(child_1);

在最初的渲染帧上一切正常:以下拾取功能起作用。

var pick_object = function(el, coords){

  var mousevector = new THREE.Vector3(
    ( coords.x / $(el).width() ) * 2 - 1,
    -( coords.y / $(el).height() ) * 2 + 1,
    0
  );

  var projector = new THREE.Projector();
  projector.unprojectVector(mousevector, camera);

  var raycaster = new THREE.Raycaster(
    camera.position,
    mousevector.sub(camera.position).normalize()
  );

  var intersects = raycaster.intersectObjects(scene.children, true);

  // one or more hits: we take only the first one that DOES NOT match the ignored entity types for selection (helpers, etc)
  if( intersects.length>0 ){
    for( var i=0, n=intersects.length; i<n; i++ ){
      if (
        picking_ignored_entity_types.indexOf( intersects[i].object.entity_type ) == -1
        && intersects[i].object.visible == true
      ) {
        return intersects[i];
      }
    }
  }

  return null;
};

但是,只要(轨迹球)控件用于围绕其中一个旋转:

  • 初始lookAt()或相机([0,0,0])
  • 或一组不同的坐标(如对象的中心)

然后挑选开始表现得很糟糕。

在平移之后也是如此,并且在放大/缩小后,在较小程度上(但可能是出于错误的原因)。

我的问题是:在旋转期间或之后,我是否需要在某处更新矩阵?做点别的吗?就好像相机没有根据控件处理的旋转/平移更新。

小提琴:

http://jsfiddle.net/Hal9/TrfpU/

如果你玩控制,缩放,旋转和平移,我希望你会注意到一些“蓝色方块”,当盘旋时,不会触发红色助手外观。他们中的大多数都这样做,但不是全部。

0 个答案:

没有答案