THREE.Raycaster пересекает исходную позицию сетки после position.set()

Используя Three.js, когда я позиционирую объект с помощью position.set(), THREE.Raycaster, похоже, не знает о новой заданной позиции объектов. Если я оставлю объекты равными 0,0,0, сетка будет правильно пересечена.

function init(){
var targets = [];
var object;
// More scene initializing code...

// creating a cube object and placing it at (-10,0,-10)
    var objectGeometry = new THREE.CubeGeometry(2,2,2);
    var objectMaterial = new THREE.PhongMeshMaterial({color: 0xEEEEEE });
    object = new THREE.Mesh(objectGeometry, objectMaterial);
    object.position.set(-10, 0, -10);
    scene.add(object);
    targets.push(object);

// more objects created and added to the scene

}

У меня есть контроллер персонажа, который я могу перемещать с камерой, которая следует за ним, поэтому я подключаю персонажа (obj) и цели для тестирования в функции testRay();

function testRay(obj,targets,distance){
// code to keep the ray pointing out in front of the character at all times
    var endRayX = (Math.cos((270*(Math.PI/180))-obj.rotation.y)*distance + obj.position.x);
    var endRayZ = (Math.sin((270*(Math.PI/180))-obj.rotation.y)*distance + obj.position.z);
    var vector = new THREE.Vector3(endRayX,obj.position.y,endRayZ);
    var raycaster = new THREE.Raycaster(obj.positon,vector);
    intersects = raycaster.intersectObjects(targets);
    if(intersects.length>0){
        console.log("intersects.length: "+ intersects.length);
        console.log("intersects.distance: "+ intersects[0].distance);
        console.log("intersects.face: "+ intersects[0].face);
        console.log("intersects.point: " + intersects[0].point);
        console.log("intersects.object: " + intersects[0].object);
    }
}

Затем при каждом вызове requestAnimationFrame(main) я testRay() подключаю контроллер персонажа и цели, чтобы увидеть, пересекаются ли они.

function main(){
    // some other code
    testRay(character,targets,30)
    window.requestAnimationFrame(main);
}

Итак, проблема не в том, чтобы заставить его пересекаться, это прекрасно работает. Он заставляет его пересекать новое местоположение объектов после использования position.set() во время создания. Я заметил, что могу перемещать объекты, просто пересекая их, и это, кажется, также перемещает координаты пересечения. Не лучше ли переместить объект после его добавления на сцену? Есть ли разница?


person SacWebDeveloper    schedule 06.01.2013    source источник
comment
Никто не знает ответа...?   -  person SacWebDeveloper    schedule 03.02.2013


Ответы (1)


Этот вопрос немного устарел, но, возможно, это кому-то поможет: у меня была аналогичная проблема. Кажется, что three.js использует матрицу преобразования мира объектов для пересечения лучей, и в зависимости от вашего порядка операций это могло не обновляться после position.set(); и до вызова raycaster.intersectObject();. Я полагаю, что это делается автоматически с помощью three, когда объект рендерится в сцене, но в моем случае объекта на самом деле не было в сцене. Все, что мне нужно было сделать, это позвонить object.updateMatrixWorld() перед выполнением рейкастинга.

person rydrman    schedule 11.01.2015