OpenGL и Стереопара + Использование данных Трекинга в VR

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

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

OpenGL и Стереопара + Использование данных Трекинга в VR

Сообщение Alex2013 » 29.01.2021 19:17:44

Столкнулся с внезапной "проблемой на ровном месте" : Не получается нарисовать 'правильную стереопару" в OpenGL .
Простейший вариант со смещением модели по оси Х почем-то "не склеивается" при просмотре результата в ВиАр-шлеме.
Изменение glViewport вообще все запутали ...

В общем есть ли где-то мануалы и примеры по простому "Стерео OpenGL" для VR ?
(То "псевдо стерео" что есть в примере похоже в основном основано на "обмане зрения"(возникающего путем использования заложенного в программу отставания поворота кубиков ) и вообще "переусложнено" из за использования шейдеров )
Зы
Нашел вот что ... Буду пробовать.
http://www.orthostereo.com/geometryopengl.html
https://github.com/kristov/opengl-stereo

Добавлено спустя 4 часа 46 минут 26 секунд:
Немного оффтопа...
Захотел я текст через OpenGL стандартным образом "нарисовать"...
Но есть такая хитрая штуковина glut32.dll (и в 64 битной версии программы поджидал меня "небольшой полярный лис" в виде вылета с ошибкой ) так вот оказывается есть ее 64 битная версия которая называется... внезапно glut32.dll ! :wink:
Для машинки с NVIDIA все просто...
...
c:\Program Files\NVIDIA Corporation\Cg\bin\glut32.dll
c:\Program Files\NVIDIA Corporation\Cg\lib\glut32.lib
The 64-bit (x64) versions are installed at:
c:\Program Files\NVIDIA Corporation\Cg\bin.x64\glut32.dll
c:\Program Files\NVIDIA Corporation\Cg\lib.x64\glut32.lib

Но я всё еще в процессе "переезда" + привык для программирования юзать два внешних экрана.

Вначале я как "лопух обыкновенный" обнаружил где-то в дебрях "пампасов китая" загадочную glut64.dll переименовал в glut32.dll... и оно даже заработало ....но со странным тормозом (FPS пишет под 100, а изображение дергается как при 15-ти ). В общем помог freeglut-MSVC-3.0.0-2.mp.zip переименовал x64\freeglut.dll в glut32.dll и ура! ...ничего не тормозит . Но пляски с бубном знатные получились. :idea: Умф !
Последний раз редактировалось Alex2013 08.02.2021 17:00:12, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара

Сообщение Pavia » 04.02.2021 10:11:34

Простейший вариант со смещением модели по оси Х почем-то "не склеивается" при просмотре результата в ВиАр-шлеме.

Перемещать надо не модель, а камеру.

http://lavoptics.ru/articles/283802

У 95% взрослых мужчин среднее расстояние между зрачками равно 69 мм.
У 95% взрослых женщин параметр PD равен 64 мм.

По поводу первой ссылки. Там смещают на 0,5 в играх зап 1 еденицу принят 1 метр. Так что это промашка очень большая.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: OpenGL и Стереопара

Сообщение Alex2013 » 04.02.2021 11:32:57

Ну что ж спасибо за отклик !
(Сейчас пытаюсь "курить трекинг"... так так что стерео пока оставил на потом )
В демке он сделан "методом чукчи" (то есть пересчитываются координаты всех объектов сцены )

Код: Выделить всё
procedure LoopRenderer(const View, Proj: TMatrix4f);
var
  T, R, M: TMatrix4f;
  I, J, K: Integer;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glEnable(GL_DEPTH_TEST);

  glUseProgram(FlatShader.ProgramID);
  glUniformMatrix4fv(FlatShader.Loc[1], 1, GL_FALSE, @View);
  glUniformMatrix4fv(FlatShader.Loc[2], 1, GL_FALSE, @Proj);
  glBindVertexArray(VertexArray);
  CreateRotate(R, Vector(0, BaseA, 0));
  for K := CMIN to CMAX do
    for J := CMIN to CMAX do
      for I := CMIN to CMAX do
      begin
        CreateTranslate(T, Vector(I * 5, J * 5, K * 5));
        M := T * R;
        glUniformMatrix4fv(FlatShader.Loc[0], 1, GL_FALSE, @M);
        glUniform3fv(FlatShader.Loc[3], 1, @ColorArray[K,J,I]);
        glDrawArrays(GL_TRIANGLES, 0, Length(Vertices) div 3);
      end;
  glBindVertexArray(0);
  glUseProgram(0);
//!! Именно сюда я добавляю совой код ...
//
//...
BaseA := BaseA + 0.005;
end;

Меня понятное дело это не устраивает ...
И я пытаюсь юзать gluLookAt
Например как то так...

Код: Выделить всё

...
radius:=0.3;
  centerX:=0;   centery:=0;   centerZ:=0;
//  rx:=  0;   ry:= 0;

rx :=  View[0,0]; //элемент матрицы явно реагирующий на вращение вокруг оси Y
ry :=  View[0,1];//элемент матрицы явно реагирующий на вращение вокруг оси X

   eyeX := centerX + radius*cos(ry)*sin(rx);
   eyeY := centerY + radius*sin(ry)*sin(rx);
   eyeZ := centerZ  + radius*cos(rx);

glLoadIdentity;
  glScalef(0.5,0.5,0.5);
gluLookAt( eyeX, eyeY, eyeZ,centerX, centerY, centerZ,  0,1,0);
if FRender= FR_L  then  M_RGB:=CL else M_RGB:=cr;

OGL_DrawLoad3e(0,0,0);  //!!! Внешняя модель
...

Да я в курсе что нужно использовать ВСЮ матрицу преобразования, а не взятые наобум параметры
Но так хоть что-то видно !
А когда я пытаюсь использовать glMultMatrixd(@View); НЕВИДНО НИЧЕГО ! :idea:
Но все равно выходит криво... :roll:

Добавлено спустя 38 минут 27 секунд:
Есть более мнене простой пример на С++
Код: Выделить всё
void render(osvr::clientkit::DisplayConfig &disp) {

    // Clear the screen to black and clear depth
    glClearColor(0, 0, 0, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /// For each viewer, eye combination...
    disp.forEachEye([](osvr::clientkit::Eye eye) {

        /// Try retrieving the view matrix (based on eye pose) from OSVR
        double viewMat[OSVR_MATRIX_SIZE];
        eye.getViewMatrix(OSVR_MATRIX_COLMAJOR | OSVR_MATRIX_COLVECTORS,
                          viewMat);
        /// Initialize the ModelView transform with the view matrix we
        /// received
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glMultMatrixd(viewMat);

        /// For each display surface seen by the given eye of the given
        /// viewer...
        eye.forEachSurface([](osvr::clientkit::Surface surface) {
            auto viewport = surface.getRelativeViewport();
            glViewport(static_cast<GLint>(viewport.left),
                       static_cast<GLint>(viewport.bottom),
                       static_cast<GLsizei>(viewport.width),
                       static_cast<GLsizei>(viewport.height));

            /// Set the OpenGL projection matrix based on the one we
            /// computed.
            double zNear = 0.1;
            double zFar = 100;
            double projMat[OSVR_MATRIX_SIZE];
            surface.getProjectionMatrix(
                zNear, zFar, OSVR_MATRIX_COLMAJOR | OSVR_MATRIX_COLVECTORS |
                                 OSVR_MATRIX_SIGNEDZ | OSVR_MATRIX_RHINPUT,
                projMat);

            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glMultMatrixd(projMat);

            /// Set the matrix mode to ModelView, so render code doesn't
            /// mess with the projection matrix on accident.
            glMatrixMode(GL_MODELVIEW);

            /// Call out to render our scene.
            renderScene();
        });
    });
    /// Successfully completed a frame render.


Но попытки переписать его в свой программу пока порвались ...
(Компилируется но ничего не показывает )

Добавлено спустя 1 час 12 минут 24 секунды:
Что-то я запутался ... Изображение
Это матрица для glMultMatrixd...
С первыми тремя векторами более менее понятно, но что за "трансформация"?
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара

Сообщение olegy123 » 04.02.2021 14:17:31

olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: OpenGL и Стереопара

Сообщение Alex2013 » 04.02.2021 19:24:19

olegy123 писал(а):Это видовая матрица
https://songho.ca/opengl/gl_transform.html

http://aco.ifmo.ru/el_books/computer_vi ... res/4.html

Ок! Спасибо .

...Мдя хитро ! Глова распухла так что пришлось срочно читать ранобе чтобы не отрубится от перегрузки...
Новый затык с использованием glUniformMatrix4fv БЕЗ ШЕЙДРОВ или поиске чего-то похожего .
(Бо лень пересчитывать все эти матрицы и векторы самостоятельно )

+ решил сделать "хук" в рендер своей модели ...
Код: Выделить всё
...
type
  XYZ= Record
    X,Y,Z:Extended;
  end;
TTrFunc = Function (C:XYZ):XYZ;
...
procedure OGL_DrawLoad3e_TR(DX_,DY_,XZ_:Longint; const TF:Pointer);
Var
  A,b,c,AB,BC,CA,LI:LongInt;

//======================
Var
SaCol:integer;
Speed:          Double;
CK:real;


begin

DX:=DX_;
DY:=DY_;
XZ:=XZ_;

ff:=False;
//Показ модели

for LI:=0 to sl.count-1 do
begin
Sscanf(sl[LI],'A:%d B:%d C:%d AB:%d BC:%d CA:%d' ,
   [@A,@B,@C,@AB,@BC,@CA]);

glBegin(GL_TRIANGLES );
CK:=RANDOM(50)/100;
glColor3f(m_rgb.r-ck,m_rgb.g-ck,m_rgb.b-ck); // Set The Color

With  TTrFunc(TF)(Getv(A)) do  glVertex3f(DX+x/100,DY+y/100,DZ+z/100);
With  TTrFunc(TF)(Getv(b)) do  glVertex3f(DX+x/100,DY+y/100,DZ+z/100);
With  TTrFunc(TF)(Getv(c)) do  glVertex3f(DX+x/100,DY+y/100,DZ+z/100);
glEnd();
end;
ff:=True;
end;

Но при вызове функция-крюк не возвращает результат ... (Хотя и объявлена как "Far" )...
(Вызов TTrFunc(TF) срабатывает как надо что подтвердила контрольная точка ) впрочем наверное в общем виде достаточно просчитать смещение + повороты , но мне хотелось получит простую возможность делать разные "локальное искажение "
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара

Сообщение Pavia » 04.02.2021 21:45:40

Меня понятное дело это не устраивает ...
И я пытаюсь юзать gluLookAt
Например как то так...

В OpenGL неудобная камера. Понятно что Вам хочется разобраться. Лично мне пришлось нарисовать и прорешать задачу проектирования. А вот для задачи стерео зрения надо действовать на результат. Вы должны реализовать свой класс камеры.
Чтобы у неё была позиция в 3-д мири и все объекты вы размещаете так же в абсолютных координатах мира.
Как в OGRE3D


radius:=0.3;
centerX:=0; centery:=0; centerZ:=0;
// rx:= 0; ry:= 0;

rx := View[0,0]; //элемент матрицы явно реагирующий на вращение вокруг оси Y
ry := View[0,1];//элемент матрицы явно реагирующий на вращение вокруг оси X

eyeX := centerX + radius*cos(ry)*sin(rx);
eyeY := centerY + radius*sin(ry)*sin(rx);
eyeZ := centerZ + radius*cos(rx);


Тут чушь написана. Вам следует прочитать про матрицу вращений
https://wiki.sources.ru/doku.php?id=art ... 1%82%D0%B0

Для трекинга я реализовал так.

Код: Выделить всё
// создание матрицы вращения вокруг оси z
//стр 291-292 Ф.Хилл OpenGL. Программирование компьютерной графики(2002)
function buildRotatematrixZ(Angle:Real):TMatrix44;
var c,s:Real;
begin
c:=Cos(Angle); S:=Sin(Angle);
Result[0,0]:=c;  Result[0,1]:=-s; Result[0,2]:=0;   Result[0,3]:=0;
Result[1,0]:=s;  Result[1,1]:=c;  Result[1,2]:=0;   Result[1,3]:=0;
Result[2,0]:=0;  Result[2,1]:=0;  Result[2,2]:=1;   Result[2,3]:=0;
Result[3,0]:=0;  Result[3,1]:=0;  Result[3,2]:=0;   Result[3,3]:=1;
end;

// создание матрицы вращения вокруг оси x
//стр 291-292 Ф.Хилл OpenGL. Программирование компьютерной графики(2002)
function buildRotatematrixX(Angle:Real):TMatrix44;
var c,s:Real;
begin
c:=Cos(Angle); S:=Sin(Angle);
Result[0,0]:=1;  Result[0,1]:=0;  Result[0,2]:=0;   Result[0,3]:=0;
Result[1,0]:=0;  Result[1,1]:=c;  Result[1,2]:=-s;  Result[1,3]:=0;
Result[2,0]:=0;  Result[2,1]:=s;  Result[2,2]:=c;   Result[2,3]:=0;
Result[3,0]:=0;  Result[3,1]:=0;  Result[3,2]:=0;   Result[3,3]:=1;
end;

// создание матрицы вращения вокруг оси y
//стр 291-292 Ф.Хилл OpenGL. Программирование компьютерной графики(2002)
function buildRotatematrixY(Angle:Real):TMatrix44;
var c,s:Real;
begin
c:=Cos(Angle); S:=Sin(Angle);
Result[0,0]:=c;  Result[0,1]:=0;  Result[0,2]:=-s;  Result[0,3]:=0;
Result[1,0]:=0;  Result[1,1]:=1;  Result[1,2]:=0;   Result[1,3]:=0;
Result[2,0]:=s;  Result[2,1]:=0;  Result[2,2]:=c;   Result[2,3]:=0;
Result[3,0]:=0;  Result[3,1]:=0;  Result[3,2]:=0;   Result[3,3]:=1;
end;

// https://wiki.sources.ru/doku.php?id=articles:%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%B0
function buildWordView(Yaw,Pitch,Roll:Real; T:TPoint3D):TMatrix44;
var RotR, RotP, RotY:TMatrix44;
begin
Result:=IdentityMatrix44;

RotR:=buildRotatematrixZ(Roll);   // Меняем Y, Z
RotP:=buildRotatematrixX(Pitch);
RotY:=buildRotatematrixY(Yaw);

Result:=MatrixMulMatrix(RotY,Result);
Result:=MatrixMulMatrix(RotP,Result);
Result:=MatrixMulMatrix(RotR,Result);
Result[0,3]:=T.x;
Result[1,3]:=T.y;
Result[2,3]:=T.z;
Result[3,3]:=1;
end;


Что-то я запутался ... Изображение
Это матрица для glMultMatrixd...
С первыми тремя векторами более менее понятно, но что за "трансформация"?

Это не трансформация. Это структуру упаковали в матрицу. Абсолютно бесполезная вещь.

Код: Выделить всё
// Создаёт структуру камеры
// Yaw,Pitch,Roll - в градусах
// NearPlan - размер передней плоскости на которую идёт проекция
// В чем-то схож с размером матрицы

function Cam(Yaw,Pitch,Roll:Real; T:TPoint3D; Fov, NearPlane,k,a:Real):TCam;
begin
Result.Yaw:=Rad(Yaw);
Result.Pitch:=Rad(Pitch);
Result.Roll:=Rad(Roll);
Result.T:=T;
Result.D:=NearPlane*FovToFocal(Rad(Fov)); // Примечание для метода оптимизации необходимо для нормировки
Result.k:=k*0.000001;
Result.a:=a;
Result.NearPlane:=NearPlane;
end;

// Целевая функция переводит точки 3-х мерного пространства в 2-х мерные точки камеры.
//  Yaw,Pitch,Roll и T  положение камеры в мировых координатах
//   D,k,a внутренние параметры камеры.
function F(v:TPoint3D; Cam:TCam):TPoint2D;  overload;
var WordView,Perspective, Project:TMatrix44;
V4:TPoint4D;
begin
v4:=Point4D(v);
WordView:=buildWordView(Cam.Yaw,Cam.Pitch,Cam.Roll,Neg(Cam.T));
Perspective:=buildPerspectiveMatrix(Cam.D);
Project:=MatrixMulMatrix(Perspective,WordView);
Result:=S(L(P(v4,Project),Cam.k),Cam.a);
end;


Добавлено спустя 7 минут 24 секунды:
Калибровка камеры.

Задача калибровки выяснить параметры камеры. У нас есть шахматная доска и есть камера.
Она снимает шахматную и на экране мы видим рисунок с некоторыми искажениями.

1)Параллельные прямые собираются в точку, а иногда и в три точки. Горизонтальные вертикальные и перпендикулярные каждые линии собираются в свою точку.
2)Квадраты становятся пухлыми округлыми. А плоская доска похожа на подушку или бочку.
3)А если присмотреться, то прямые линии становятся кривыми.

4)А если в кадр попадает девушка, то у ней моментально прибавляются килограммы.

5)Даже неподвижные объекты выглядывают друг из-за друга стараясь попасть в кадр.
6)Ах да и основное чуть не забыли центр доски не по центру кадра.

Задача калибровки устранить все эти искажения. Для чего нам надо разработать модель камеры.

Внешние параметры камеры. Это положение камеры в пространстве мира-сцены.
Положение камеры 3 параметра Cam.T=(x,y,z) и 3 угла Эйлера Cam.YPR=(Yaw,Pitch,Roll)
Еще не стоит забывать что у доски тоже самое.
Положение доски 3 параметра Board.T=(x,y,z) и 3 угла Эйлера Board.YPR=(Yaw,Pitch,Roll)

Они кодируют смещение точек на фото. А так же вращение относительно точки на экране.
*Оставшиеся углы* кодируют сжатие и растяжение по горизонтали и вертикали.

Внутренние параметры.
У камеры есть фокусное расстояние cam.D. Оно связано с углом обзора. И при этом создаёт перспективу.

Есть матрица камеры но она может быть установлена неровно относительно линзы.
Из за чего нарушается соотношение сторон пикселей. cam.Aspect (Выше было cam.a)

В потогонных трубах стоит пара линз которая должна скомпенсировать перспективное искажение.
Однако оптическая система линз не идеальна и создаёт геометрическое искажение по краям картинки более узкая, а по серёдке более. Будем называть это дисторсией линз.

Даже система из единичной линзой не идеальна и с фронтальной и тыльной стороны имеют разный радиус кривизны. Будем использовать приближение первого порядка.
Тут k- это коэффициент определяющий геометрические искажения линзы.
Код: Выделить всё
// Оператор геометрических искажений от линзы.
function L(x,k,r:Real):Real; Overload;
begin
if ((1+k*r*r)=0) then result:=MaxInt
else
  result:=x/(1+k*r*r);

end;

function L(v:TPoint2DReal; k3:Real):TPoint2DReal; Overload;
var r:Real;
begin
r:=Hypot(v.x,v.y); // расстояние от 0 до точки, Hypot точнее чем sqrt.
Result.x:=L(v.x,k3,r);
Result.y:=L(v.y,k3,r);
end;
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: OpenGL и Стереопара

Сообщение Alex2013 » 05.02.2021 02:48:28

Ну "я это я" и я разумеется не гений "это выше моих человеческих сил "... :wink: :roll: (К тому-же вожусь с трекингом всего не несколько дней )

Однако, насчет чуши с параметрам для gluLookAt полностью согласен! Пока задача была "увидеть хоть что-то" ...ну что-то я определенно увидел! (Хотя и не понял что именно... ) :mrgreen:

Но еще раз спасибо ! Буду читать и изучать дальше... (Эх говорил-же мне Зуб "Займись кватернионами - пригодится !" :idea: )
Зы
"Калибровка камеры." и т.п. ... Более чем интересно! Но сейчас задача попроще: надежно повесить "виртуальный экран " в полностью виртуальном пространстве с учетом трекинга головы . :idea:
+ задача чуть более отдаленная : добавить в сцену разные виртуальное кнопки и научиться и нажимать их контроллером .

ИМХО: Это почти все что может понадобится, для не больших но полезных ВиАр дополнений к обычным проектам .

До уровня реального "ВиАр движка" я пока добираться не планирую, хотя каюсь есть мысль когда нибудь попробовать сделать "народный Ворпикс" , (vorpX прога отличная но отсутствие нормальной альтернативы напрягает )
Зы
vorpX и прочие костыли для запуска игр без поддержки VR

Добавлено спустя 16 часов 54 минуты 29 секунд:

Если не понятно "что откуда взялось" то эта тема "боковая ветка" темы
OpenVR for Lazarus (Программирование VR на паскале)
...начиная с поста где я нашел ссылку на проект OpenVR-Pascal
( https://github.com/Kagamma )
Который в отличии то предыдущих вариантов отлично собирается в свежем Лазарусе 2.0.10. и работают в реальном SteamVR-окружении с реальным трекингом головы и отображением в ВиАр-шлеме .
Но проблема том что там используется шейдеры я пока не вижу особой нужды в их использовании да и все мои невеликие наработки в OpenGL находятся на "дошейдерном уровне" .
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара

Сообщение Alex2013 » 08.02.2021 02:25:13

Новая порция "чуши наваристой"! (Код для прорисовки трекинга без шейдеров ) :wink:
Код: Выделить всё
   
glLoadIdentity();                   // reset modelview matrix
glMatrixMode(GL_PROJECTION);        // switch to projection matrix
T:=Proj;// Данные из трекинга
LookAt(T,vector(0,-0.3,-1.3),vector(0,0,-0.3),vector(0,1,0)); 
// Как оказалось достаточно полный набор для "ручной работы  с матрицей" есть в модуле Math3D.pas из поставки исходной демки .
glLoadMatrixf(@T);  // вот эта функция вполне понимает нужный формат данных формат
  glMatrixMode(GL_MODELVIEW);
  T:=View; // Данные из трекинга
// Translate(T,0.0.9,-1); // тут я пробовал использовать смещение
  glLoadMatrixf(@T);
// Дальше все каки было раньше.
if FRender= FR_L  then  M_RGB:=CL else M_RGB:=cr;
BaseA := BaseA + 0.005;// для вращения кубов
glScalef(0.5,0.5,0.5); // Не уверен что это хорошее решение.
OGL_DrawLoad3e(0,0,0);  //!!! Внешняя модель
...


Уже заметно лучше но проблема пусть не очень важная осталась ( не совпадает вращение вокруг оси Y моделей из демки и моей, что довольно странно ! - Данные вроде всюду одинаковые... :roll: )
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара

Сообщение Seenkao » 08.02.2021 09:09:17

Хотелось бы знать насколько хорошо ты знаешь OpenGL?

Пробуй выводить изображение изначально без gluLookAt. Если всё будет работать, делай смещение. Работает или нет. И уже отталкиваясь от того что работает используй gluLookAt.

Очки - это такой же экран монитора. Смог вывести изображение и в какой-то момент оно пропадает, значит ты делаешь что-то не так.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: OpenGL и Стереопара

Сообщение Alex2013 » 08.02.2021 12:02:08

Seenkao писал(а):Хотелось бы знать насколько хорошо ты знаешь OpenGL?

OpenGL знаю на уровне "нарисуй что-то похожие на эту модель и покрути по всем осям "..

Seenkao писал(а):Пробуй выводить изображение изначально без gluLookAt. Если всё будет работать, делай смещение. Работает или нет. И уже отталкиваясь от того что работает используй gluLookAt.

Так gluLookAt я УЖЕ не использую . LookAt это НЕ gluLookAt, а "работа с матрицей напрямую" .
...
Seenkao писал(а):Очки - это такой же экран монитора. Смог вывести изображение и в какой-то момент оно пропадает, значит ты делаешь что-то не так.

Уже не пропадает (возню со стерео я пока отложил в "долгий ящик" и разбираюсь с трекингом поворотов головы ). А "пропадало" потому, что как оказалось вместо glMultMatrixd нужно использовать glLoadMatrixf. ( Суть отличия этих процедур хорошо описана тут https://www.gamedev.ru/articles/?id=20105 )

Но прикол в другом есть два разных метода использования одних и тех же данных трекинга .
Один в был в исходной демке см LoopRenderer в этом посте
Второй я придумал сам (см мой предыдущий прост ). Но если вращение "вокруг оси X" у обоих методов полностью совпадает, то с осью Y этого не происходит . Использовать метод из демки у меня пока не выходит, потому что там задействованы шейдеры, а я в них "не взуб ногой" (к тому-же для моей простой задачи их использование ИМХО явный перебор ).

Добавлено спустя 3 часа 44 минуты 49 секунд:
Вообщем почти разобрался ! Вывод "Пространство лучше не трогать - а то искривляется!" :idea:
Действительно выбросил LookAt и трекинг успешно синхронизировался но теперь сбились пространственные координаты модели (ушла "в подполье" то бишь совместилась с кубом пришлось писать что-то вроде OGL_DrawLoad3e(2,2.5,0); и это вроде неплохо работает но есть новая проблема не знаю как задать центр поворота ... в результате модель красиво "летает по орбите" вместо нормального вращения ).
Зы
Приятная нежданность ! Трекинг у меня оказывается сразу "6-мерный" (поддерживает шесть степеней свободы ) и стереопара похоже считается автоматом. (То есть "обзорная матрица" создается отдельно для левого и правого глаза "другом уровне абстракции" с нативной поддержкой "стерео-сдвига-по-фазе" ) :idea: Но при этом,что особенно приятно , сохраняется возможность "влезть в кадр" нарисовать что угодно .
Зы Зы
Отлаживать программы для ВиАр используя только симуляцию плохая практика . Сколько возни из за того на что можно просто посмотреть утомляет круче необходимости изредка нахлобучивать шлем.
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара + Использование данных Трекинга в VR

Сообщение Seenkao » 08.02.2021 19:11:23

Alex2013 писал(а):стереопара похоже считается автоматом.

это норма! Но всё же советую изучить OpenGL больше чем "нарисуй что-то похожие на эту модель и покрути по всем осям" - потому что он автоматически за тебя всё сделает. И ты сможешь смотреть на обычном мониторе что происходит и спокойно то же самое видеть в очках, когда понадобится.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: OpenGL и Стереопара + Использование данных Трекинга в VR

Сообщение Alex2013 » 08.02.2021 21:21:20

Seenkao писал(а):это норма!

Только там уже не OpenGL а OpenVR (или SteamVR и т.п. ).
+ многое зависит от конкретной реализации использующего OpenVR движка.
(Например, полно вполне продвинутых игр и программ где 6Dof-режим не применяется принципиально но при этом полностью поддерживается управление контроллерами )
Seenkao писал(а): всё же советую изучить OpenGL

Разумеется, это совет уместен ! Но если честно то я сильно сомневаюсь что даже самые продвинутые разработчики реального софта ПОЛНОСТЬЮ используют и даже знают все возможности современных фреймворков которые используют в своих программах .
Обычно ситуация примерно такая же как с компонентами из поставки Лазаруса: много ли народа активно использует Pascal Script или Virtual Controls ? Ну Pascal Script я использовал довольно полно но опять же далеко не на 100% возможностей а по мере необходимости .
Seenkao писал(а): И ты сможешь смотреть на обычном мониторе что происходит и спокойно то же самое видеть в очках, когда понадобится.
Я и сейчас это вижу (в переделываемой мной демке есть соответствующее "окно отображения", но это не очень важно подобные возможности есть в стандартных расширениях ОС для поддержки ВиАр )
Другое дело что хорошим тоном для реальной ВиАр программы будет полноценная поддержка "не ВиАр" - режима для использования без шлема.
Зы
ИзображениеИзображение
Что видно ?
1 Большое окно по центру отображение моей программы ..
2 Окно справа снизу отображение SteamVR
3 Окно справа сверху отображение "протала WMR"
( в движении видно что "шестёренка " летает "по орбите" вокруг центра верхней грани куба )
Но это все 2д проекция а в шлеме виден стерео эффект и можно немного ходить по верхней грани куба внутри сцены ...
(Кстати в это демке дольно легко реализовать "шаг в пропасть" - вышел за радиус и вся сцена тупо "полетела вверх" что будет ощущаться падением -между прочим, "падать" в ВиАр довольно забавно "обманутая зрением вестибулярка" буквально "кричит" , что наоборот поднимешься в лифте с неслабым ускорением )

Добавлено спустя 3 часа 32 минуты 42 секунды:
У кого есть на чем запустить ... Требует рабочего SteamVR Win64
Но может работать через "портал WMR" в режиме эмуляции да и SteamVR вроде можно поставить "без шлема".
https://yadi.sk/d/a4O73bJMzQ7Ppg
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара + Использование данных Трекинга в VR

Сообщение Alex2013 » 10.02.2021 16:27:00

Новый уже более осмысленный но все равно чуть "загадочный" фрагмент кода ...
Код: Выделить всё

   glPushMatrix();                     // save current modelview matrix
   glLoadIdentity();                   // reset modelview matrix
   glMatrixMode(GL_PROJECTION);        // switch to projection matrix
   glLoadIdentity();
   T:=Proj;
glLoadMatrixf(@T);
   glMatrixMode(GL_MODELVIEW);
  T:=View;
  glLoadMatrixf(@T);

  if FRender= FR_L  then  M_RGB:=CL else M_RGB:=cr;

BaseA := BaseA + 0.005;

// первая модель "Шестеренка"
//(крутится по орбите  и строится динамически и "с переливами цветов"   )
glPushMatrix();
glTranslatef(0,1.5,0);
glScalef(0.5,0.5,0.5);
glRotatef( BaseA*100, 0,1.0, 0);
glRotatef(90,1.0,0.0,0.0);
OGL_DrawLoad3e(2,2.8,1);  //!!! Внешняя модель
glPopMatrix();
// Вторая модель "золотой бублик" строится заранее и прорисовывается через   glCallList
// вращается на одном месте иногда красиво пресекаясь с орбитой "шестеренки" 
glPushMatrix();
glTranslatef(-2,1.5,1);
glRotatef((pi/180)*90+BaseA*100,1.0,0.0,0.0);
// glScalef(0.5,0.5,0.5);
glCallList(MM1); //вместо OGL_DrawLoad3e(0,0,0);
glPopMatrix();
//-------------
glPopMatrix();


https://youtu.be/jL_1cuKRWNI
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара + Использование данных Трекинга в VR

Сообщение Alex2013 » 12.02.2021 19:59:52

Кто нибудь знает, почему координаты текстурированного прямоугольника не совпадают с координатами модели без текстуры ?
Я честно говоря в замешательстве... :roll: Возможно присутствуют отклонения +- размер модели и это было бы понятно, но сдвиг на почти на "десять размеров" непонятен в принципе тем более только по одной оси Z...

То есть в одном случае пишу glTranslatef(-2,1.5,-1); в другом glTranslatef(0.5,1.8,7.5); а модели оказываются на одном уровне по Оси Z (Сдвиг на 8.5 единиц ... Одна модель вообще плоский прямоугольник другая размером от 0.2 до максимум 3-х единцы ... Бред какой-то )
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: OpenGL и Стереопара + Использование данных Трекинга в VR

Сообщение Pavia » 12.02.2021 21:24:35

Код надо смотреть.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 22

Рейтинг@Mail.ru