Реализация инструмента панорамирования "захватить" камеру в 3D-сцене - PullRequest
2 голосов
/ 03 июня 2011

В моей сцене у меня есть рельеф, который я хочу "захватить", а затем передвинуть курсор на панораму камеры (с ее высотой, вектором обзора, полем зрения и т. Д., Все остальными),

Итак, начальная точка «захвата» будет рабочей точкой в ​​мировом пространстве, и я бы хотел, чтобы эта точка оставалась под курсором при перетаскивании.

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

// Calculate scene points
MthPoint3D current_scene_point =
   camera->screenToScene(current_point.x, current_point.y);
MthPoint3D previous_scene_point =
   camera->screenToScene(previous_point.x, previous_point.y);

// Make sure the cursor didn't go off the terrain
if (current_scene_point.x != MAX_FLOAT &&
    previous_scene_point.x != MAX_FLOAT)
{
   // Move the camera to match the distance
   // covered by the cursor in the scene
   camera->translate(
      MthVector3D(
         previous_scene_point.x - current_scene_point.x,
         previous_scene_point.y - current_scene_point.y,
         0.0));
}

Любые идеи приветствуются.

1 Ответ

1 голос
/ 03 июня 2011

Еще немного поспав:

  • Получите начальную позицию вашей точки пересечения в мировом пространстве и в пространстве модели (относительно источника модели)

т.е. используйте screenToScene ()

  • Создать луч, который идет от камеры через положение мыши: {ray.start, ray.dir}

ray.start - это camera.pos, ray.dir - (screenToScene () - camera.pos)

  • Решить NewPos = ray.start + x * ray.dir, зная, что NewPos.y = initialpos_worldspace.y;

-> ray.start.y + x * ray.dir.y = initialpos_worldspace.y

-> x = (initialpos_worldspace.y - ray.start.y) /rad.dir.y (остерегайтесь divbyzeroexception)

-> повторно внедрить x в NewPos_worldspace = ray.start + x * ray.dir

  • вычесть initialpos_modelspace из этого в-центр "модель

Последний бит кажется подозрительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...