Есть курсор мыши (но "не обязательно мыши" , просто свободно перемещающийся в поле зрения "прицел" ) УЖЕ нарисованный "в мировых координатах" на окне "превьюшки" и есть еще "дополнительный рендер" ( для ВиАр но в рамках задачи это не существенно ) где немного "другое пространство" (хотя чисто визуально я стараюсь их "синхронизировать" )
Требуется показать курсор и там причем так чтобы "сдвиг по фазе" был минимальным.
(Выбор объекта осуществляется на окне "превьюшки" и если курсоры визуально не совпадают, то на "втором рендере" ничего выбрать не получится)
Пока что "в страшных муках творчества" написал вот такую кривулю:
- Код: Выделить всё
{ 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;
В общем нельзя сказать что эта закорючка "не работает совсем" но результаты "оставляют желать лучшего" .




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