ТРИ. 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) тествамRay() включвам контролера на знаците и целите, за да видя дали се пресичат.

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(); извикването. Вярвам, че това се прави автоматично от три, когато обектът се визуализира в сцената, но в моя случай обектът всъщност не беше в сцената. Всичко, което трябваше да направя, беше да се обадя на object.updateMatrixWorld(), преди да направя raycasting.

person rydrman    schedule 11.01.2015