Russian Qt Forum
Ноябрь 25, 2024, 15:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] получение координат точки на сфере  (Прочитано 18710 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Июнь 24, 2013, 17:16 »

Код:
void EarthView::mouseDoubleClickEvent(QMouseEvent *e)
{
    QVector3D pick = mapPoint(e->pos());
...
Камера находится на расстоянии 10 от центра координат.
Получаю примерно такой вектор в координатах камеры QVector3D(0.0935829, -0.0614973, -5). Это тот самый "данный луч/вектор".
Не знаю что возвращает mapPoint - похоже на точку (не вектор) в мире. Это можно проверить сдвинув камеру напр по X на 100. Если точка в мире, тогда

pt_on_world_sphere = (pick - cam_Pos).normalized()  * R + cam_Pos;
где
cam_Pos - позиция камеры в миое
R - радиус сферы (0.5)

То есть я знаю точку камеры, знаю направление и знаю расстояние. Можно посчитать саму точку (формулу ещё не искал).
В этом решении есть какие-то косяки?
А зачем если известно что камера в центре сферы? Достаточно просто нормировать направление и домножить на радиус
Записан
spirits25
Гость
« Ответ #16 : Июнь 24, 2013, 18:43 »

А зачем если известно что камера в центре сферы? Достаточно просто нормировать направление и домножить на радиус
Камера не в центре сферы. Начало мировых координат в центре сферы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Июнь 25, 2013, 08:53 »

Камера не в центре сферы. Начало мировых координат в центре сферы.
Тогда да, надо искать пересечение луча  (pick - cam_Pos).normalized() 

Записан
spirits25
Гость
« Ответ #18 : Июнь 25, 2013, 12:07 »

Тогда да, надо искать пересечение луча  (pick - cam_Pos).normalized() 

Да, но pick и cam_Pos в разных системах (pick - в координатах камеры, а cam_Pos в мировых координатах). Я всё остальное сделал, пересечение могу найти, а вот как перевести просто точку из координат камеры в мировые пока не догоняю=)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Июнь 25, 2013, 12:50 »

Да, но pick и cam_Pos в разных системах (pick - в координатах камеры, а cam_Pos в мировых координатах). Я всё остальное сделал, пересечение могу найти, а вот как перевести просто точку из координат камеры в мировые пока не догоняю=)
Ну вот, "much better", грамотно излагаете. Я глянул исходники и вроде там пишут что getPos mapPoint возвращает точку в мире (хотя хз на чем она лежит). Это легко проверить - сдвиньте камеру напр на 100 по Х. Если это точка в мире - то и у pickPos будет большое X
« Последнее редактирование: Июнь 25, 2013, 13:57 от Igors » Записан
spirits25
Гость
« Ответ #20 : Июнь 25, 2013, 13:36 »

Ну вот, "much better", грамотно излагаете. Я глянул исходники и вроде там пишут что getPos возвращает точку в мире (хотя хз на чем она лежит). Это легко проверить - сдвиньте камеру напр на 100 по Х. Если это точка в мире - то и у pickPos будет большое X

Не понимаю, что такое getPos, чей это метод?
pickPos - если это
Код:
QVector3D pick = mapPoint(e->pos());
То он в координатах камеры и как бы я камеру не смещал, это значение всё равно вертится около значения QVector3D(0.0360963, -0.152406, -5), причём координата z -5, получается, что это точка на плоскости xoy, со значением z = -5.

Чтобы перевести координату из координат камеры в мировые координаты необходимо домножить на modelViewMatrix, например:
Код:
QVector3D pickWorld = camera()->modelViewMatrix() * pick;
Вроде так всё правильно. Сейчас поразбираюсь дальше, вроде данных хватает=)

P.S.: проверил ещё раз - такой перевод неверен. То есть перевести из координат камеры в мировые координаты пока не могу.
« Последнее редактирование: Июнь 25, 2013, 13:42 от spirits25 » Записан
spirits25
Гость
« Ответ #21 : Июнь 25, 2013, 13:45 »

Цитировать
QVector3D QGLCamera::mapPoint(const QPoint & point, qreal aspectRatio, const QSize & viewportSize) const

Maps point from viewport co-ordinates to eye co-ordinates. The size of the viewport is given by viewportSize, and its aspect ratio by aspectRatio.

The returned vector will have its x and y components set to the position of the point on the near plane, and the z component set to -nearPlane().

This function is used for converting a mouse event's position into eye co-ordinates within the current camera view.

Не понимаю, почему "the z component set to -nearPlane()"? может поэтому у меня неверные данные.
Записан
spirits25
Гость
« Ответ #22 : Июнь 25, 2013, 14:15 »

Умножение на camera()->modelViewMatrix() переводит из мировых координат в координаты камеры.
Для обратного перевода мне необходимо умножить на обратную матрицу?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Июнь 25, 2013, 14:55 »

Умножение на camera()->modelViewMatrix() переводит из мировых координат в координаты камеры.
Для обратного перевода мне необходимо умножить на обратную матрицу?
Да
Записан
spirits25
Гость
« Ответ #24 : Июнь 25, 2013, 15:44 »

Да, всё верно
Код:
camera()->modelViewMatrix().inverted() * pointVector;
где pointVector - координаты точки в координатах камеры (масло масленное))).
Причём важно умножать матрицу на точку, а не наоборот=)

Igors, ещё раз большое спасибо за помощь=)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.253 секунд. Запросов: 23.