2013-10-03 1 views
2

Я новичок в three.js и WebGL.Как определить, когда маленький объект находится перед большим объектом и видим для камеры?

В моем приложении есть 3D-сцена, в которой находятся два объекта.

  1. объект - это большая сфера;
  2. объект - меньшая сфера, расположенная на поверхности первого объекта.

Большая сфера вращается вокруг своей оси. А также есть возможность повернуть камеру вокруг сфер.

Как маленькая сфера на поверхности большой сферы, она также вращается вместе с ней. Малая сфера будет видна для нас, так как большая камера поворачивается к камере, и она не будет видна, когда перед ней будет большая сфера.

Вопрос в том, как определить, когда маленькая сфера видима для камеры и когда она не видна?

Кроме того, мне нужно получить координаты в 2d для небольшой сферы, где она видна. Как я могу это сделать?

+0

Привет, Майк, добро пожаловать в stackoverflow :) Этот вопрос кажется хорошо изученным, но он может использовать некоторые изменения от вас, чтобы получить конструктивный ответ. Было бы неплохо, если бы вы могли указать на часть реализации, которую вы используете для сфер, чтобы отслеживать их пространственное положение. –

+0

Спасибо :) Вы правы - формат меньше меньше ответов. – Mike

ответ

1

Это может быть выполнено с помощью встроенных функций. raycaster и projector. Для начала попробуйте взглянуть на this demo и его исходный код. Вот another example. Таким образом, вы можете определить, какие объекты ближе к невидимой линии, которая испускается из положения камеры.

В противном случае, если вас просто интересует, какой из двух объектов находится ближе к камере, вы можете просто проверить, какое из их значений положения имеет меньшее расстояние до координат камеры. Трехмерный расстояние формула пригодится:

bigSphereDistance = Math.sqrt(Math.pow(camera.position.x - big.position.x,2) + 
           Math.pow(camera.position.y - big.position.y,2) + 
           Math.pow(camera.position.z - big.position.z,2)); 
smallSphereDistance = Math.sqrt(Math.pow(camera.position.x - small.position.x,2) + 
           Math.pow(camera.position.y - small.position.y,2) + 
           Math.pow(camera.position.z - small.position.z,2)); 
//then check... 
bigSphereDistance > smallSphereDistance ? /*case*/ : /*case*/; 

Наглядно малая сфера видна, когда ее расстояние меньше, чем в большой сфере, с буфером радиуса небольшой сферы.

Чтобы ответить на второй вопрос, находите 2D-координаты любого объекта can accomplished like this.

Смежные вопросы