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/
Если вы поиграете с элементами управления, масштабированием, вращением и панорамированием, я надеюсь, вы заметите, что некоторые "синие квадраты", когда они отображаются, не вызывают появление красного помощника. Большинство из них делают, но не все.