2013-07-04 3 views
0

Я думаю, это нормально способ получить xyplane (если это не так, или есть лучший способ, дайте мне знать):Найти координаты нижнего правого угла холста на плоскости ху данной камеры

xyplane = new THREE.Plane().setFromCoplanarPoints(
     new THREE.Vector3(0, 0, 0), 
     new THREE.Vector3(10, 15, 0), 
     new THREE.Vector3(100, -90, 0), 
    ); 

У меня есть камера, которая находится на (0, 0, 1000), глядя на источник. Я могу найти координаты, является точным верхней левой частью моего смотровым:

projector = new THREE.Projector(); 
    topleft = new THREE.Vector3(-1, 1, 0); 
    through = projector.unprojectVector(topleft, camera); 

through тогда THREE.Vector3 {x: -31.425217496422327, y: 22.169468302342334, z: 900.0000201165681} который совершенно на нижнем правый угле холста. Тем не менее, я хочу найти эквивалентную точку, где z = 0. Я пытаюсь сделать это с помощью луча; но я терпеть неудачу.

ray = new THREE.Ray(camera.position, through); 
    point = ray.intersectPlane(xyplane); 

point тогда {x: 34.91690754890442, y: -24.632742007573448, z: 0}, который не является даже близко. Я недопонимаю что-то основное. Я буду изучать Coordinates of intersection between Ray and Plane и другие, пока я пытаюсь понять это. Может быть, кто-то может объяснить простым языком.

+1

Вы почти там. Второй аргумент 'THREE.Ray()' должен быть вектором направления единичной длины, который указывает от камеры к вашей целевой точке. – WestLangley

+0

Спасибо @WestLangley, ваш комментарий дал понять. –

ответ

0

Право, спасибо @WestLangley за комментарий. Переменная through не является правильным вторым аргументом для конструктора Ray. Нам нужен единичный вектор для направления. С позиции камеры и through точки, мы можем получить направление вектора с:

direction = through.sub(camera.position).normalize(); 

Тогда остальные работает, как ожидалось:

ray = new THREE.Ray(camera.position, direction); 
    p = ray.intersectPlane(xyplane); 
Смежные вопросы