Three.js [r65]: сборка через Raycaster работает странно после вращения через TrackballControls

Немного контекста:

У меня есть сцена, заполненная достаточно большим количеством объектов (не объединенных), которые должны выбираться индивидуально.

Каждый из этих объектов представляет собой Object3D со следующей структурой:

parent Object3D
|_ child_1
|_ child_2
|_ etc

По умолчанию и при начальном рендеринге видны только child_1s.

Каждый 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 ответов

Другие вопросы по тегам