OpenGL и "проекция влияния" на 3D и из 3D

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

OpenGL и "проекция влияния" на 3D и из 3D

Сообщение Alex2013 » 27.02.2021 23:12:51

Вообщем довольно странная задача:
Есть курсор мыши (но "не обязательно мыши" , просто свободно перемещающийся в поле зрения "прицел" ) УЖЕ нарисованный "в мировых координатах" на окне "превьюшки" и есть еще "дополнительный рендер" ( для ВиАр но в рамках задачи это не существенно ) где немного "другое пространство" (хотя чисто визуально я стараюсь их "синхронизировать" )

Требуется показать курсор и там причем так чтобы "сдвиг по фазе" был минимальным.
(Выбор объекта осуществляется на окне "превьюшки" и если курсоры визуально не совпадают, то на "втором рендере" ничего выбрать не получится)

Пока что "в страшных муках творчества" написал вот такую кривулю:

Код: Выделить всё
  { viewport to world coordinates translation }
//Вход vx, vy -  экранные координаты 
//Выход wx, wy, wz - мировые координаты
procedure Viewport_3_World( vx, vy : integer; var wx, wy, wz : real);
  var
     viewport : array[0..3] of integer;
     modelview : array[0..15] of real;
     projection : array[0..15] of real;

  begin
     glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);     //get the modelview info
     glGetDoublev(GL_PROJECTION_MATRIX, @projection); //get the projection matrix info
     glGetIntegerv(GL_VIEWPORT, @viewport);           //get the viewport info
//Если Рендер превью то ...
    if FRender=FR_W then   begin
    gluUnProject(vx, viewport[3]-vy-1, 0,
       @modelview, @projection, @viewport, @wx, @wy, @wz);
    MS_X:=Wx;    MS_Y:=Wy;    MS_Z:=Wz; //Запоминаю результат в глобальных переменных
  end
//Иначе ...
    else
     begin
      gluUnProject(vx, viewport[3]-vy-1, 0,
       @modelview, @projection, @viewport00, @wx, @wy, @wz);
//Пересчитываю с учетом смещения... 
        Wx:=Wx-Abs(Wx-MS_X);
        Wy:=Wy-abs(Wy-MS_Y);
        Wz:=Wz-Abs(Wz-MS_Z);
     end;
  end;


В общем нельзя сказать что эта закорючка "не работает совсем" но результаты "оставляют желать лучшего" . :idea: :roll:

ИзображениеИзображение
("Центральный курсор"(на скрине он красный ) работает как надо, а "свободный" (желтый) только при достаточно бизком "наезде" и минимуме поворотов. Затрудняется дело тем, что там "два источника поворотов и смещений" от программы и от "6-ти мерного"(6DOF) движка OpenVR )
(без моего "кривого пересчета" свободного курсора чаще всего вообще не видно).

Так что совет местных экспертов точно лишним не будет. (Форум на предмет старых обсуждений уже обыскал - кое что нашел, но увы "маловато будет" .... )
Зы
"Двойной пересчет" пробовал - не работает ! (У превьюшки "аномальное пространство " без GL_PROJECTION_MATRIX а gluUnProject без нее "тухнет" выдавая "тихие не числа"(даже writeln пишет что-то странное ) вместо результата. )

Зы Зы
В крайнем случае можно сделать "отдельный выбор" для "второго рендера" но тогда придется "переключать курсор" показывая его или на "первом" или на "втором рендере" .
Alex2013
долгожитель
 
Сообщения: 2089
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и "проекция влияния" на 3D и из 3D

Сообщение DedFrend » 28.02.2021 09:46:55

Мне кажется правильнее курсоры поместить в моделируемое пространство. Тогда задача отображения будет тривиальной, и что происходит будет понятнее. Там, наверняка, тоже будет куча проблем, типа где он по z-координате или его видимость, но это более естественный путь и решения будут более естественными.
ЗЫ. Я, правда, абсолютно не в теме
DedFrend
новенький
 
Сообщения: 97
Зарегистрирован: 25.11.2018 12:21:50

Re: OpenGL и "проекция влияния" на 3D и из 3D

Сообщение Alex2013 » 28.02.2021 14:53:55

DedFrend писал(а):Мне кажется правильнее курсоры поместить в моделируемое пространство. Тогда задача отображения будет тривиальной, и что происходит будет понятнее. Там, наверняка, тоже будет куча проблем, типа где он по z-координате или его видимость, но это более естественный путь и решения будут более естественными.
ЗЫ. Я, правда, абсолютно не в теме


1 Спасибо за поддержку! ( А от что "не в теме" это нестрашно бо "мозговой штурм" рулит ! :idea: )

2 "курсоры поместить в моделируемое пространство" В принципе я уже так и сделал .
(Оба курсора рисуются в мировых координатах а "центральный " вообще привязан центру локального поля зрения. (Спасибо "чукче-образному" подходу OpenGL ! :wink: ...у которого вид на сцену всегда открывается из точки с нулевыми координатами и понятно, что центр поля зрения при "визуальной синхронизации" всегда совпадает ) )

3 Узнать про курсор "где он по z-координате" проблемы не представляет. Во первых если я его рисую значит знаю ВСЕ его координаты, узнать что находится "под ним по вектору" на удивление просто ( прикол в том что метод с "буфером глубины" похоже совершенно нематематический ).
4 "решения будут более естественными." Это да, но проблема в том что этих "более естественных решений" будет "немного многовато".

5 Кстати пока писал пришла мне очередная "идея фикс"! "Если у меня все хорошо с "центром координат " то почему бы, при "выборе из второго рендера", не переместить это самый центр в точку нахождения курсора ?" :idea: (Правда придется придется писать вторую процедуру "векторного опознавания" но визуально ничего не изменится ... впрочем при рабочем "втором рендере" можно оставить только её. )
Alex2013
долгожитель
 
Сообщения: 2089
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru