Хобрук: Ваш путь к мастерству в программировании

Как я могу получить направление обзора из матрицы OpenGL ModelView?

Я пишу программу объемного рендеринга, которая постоянно корректирует геометрию некоторой плоскости, чтобы она всегда была обращена в камеру. Геометрия плоскости вращается всякий раз, когда камера поворачивается, чтобы выглядеть так, как будто она не движется - относительно всего остального в сцене. (Я использую направление обзора камеры как вектор нормали к этой геометрии плоскости.)

В настоящее время я вручную сохраняю пользовательский вектор вращения ('вращения') и применяю его эффекты следующим образом в функции рендеринга:

gl2.glRotated(rotations.y, 1.0, 0.0, 0.0);
gl2.glRotated(rotations.x, 0.0, 1.0, 0.0);

Позже я получаю направление взгляда, вращая начальное направление взгляда (0,0, -1) вокруг осей x и y со значениями вращения. Это делается следующим образом. Окончательное направление просмотра сохраняется в 'view':

     public Vec3f getViewingAngle(){
        //first rotate the viewing POINT
        //then find the vector from there to the center
        Vec3f view=new Vec3f(0,0,-1);
        float newZ=0;
        float ratio=(float) (Math.PI/180);
        float vA=(float) (-1f*rotations.y*(ratio));
        float hA=(float) (-1f*rotations.x)*ratio;

        //rotate about the x axis first
        float newY=(float) (view.y*Math.cos(vA)-view.z*Math.sin(vA));
        newZ=(float) (view.y*Math.sin(vA)+view.z*Math.cos(vA));
        view=new Vec3f(view.x,newY,newZ);

        //rotate about Y axis
        float newX=(float) (view.z*Math.sin(hA)+view.x*Math.cos(hA));
        newZ=(float) (view.z*Math.cos(hA)-view.x*Math.sin(hA));
        view=new Vec3f(newX,view.y,newZ);
        view=new Vec3f(view.x*-1f,view.y*-1f,view.z*-1f);

        //return the finalized normal viewing direction
        view=Vec3f.normalized(view);
        return view;
}

Теперь я перемещаю эту программу в более крупный проект, в котором вращение камеры обрабатывается сторонней графической библиотекой. У меня нет вектора вращения. Есть ли способ получить вектор направления взгляда из:

GLfloat matrix[16]; 
glGetFloatv (GL_MODELVIEW_MATRIX, matrix);

Я ищу это для справки http://3dengine.org/Modelview_matrix, но до сих пор не понимаю, как придумайте направление взгляда. Может кто-нибудь объяснить мне, возможно ли это и как это работает?


Ответы:


1

Вы захотите взглянуть на это изображение @ http://db-in.com/images/local_vectors.jpg http://db-in.com/images/local_vectors.jpg

Направление полета (DOF) - это 3-й ряд.

GLfloat matrix[16]; 
glGetFloatv( GL_MODELVIEW_MATRIX, matrix );

float DOF[3];
DOF[0] = matrix[  2 ]; // x
DOF[1] = matrix[  6 ]; // y
DOF[2] = matrix[ 10 ]; // z

Ссылка:

03.11.2014

2

Вместо того, чтобы пытаться следовать матрице просмотра модели, чтобы настроить самозванец фрагмента растеризатора объема, вы должны просто настроить матрицу просмотра модели в соответствии с вашими потребностями. OpenGL - это не граф сцены, это система рисования, и вы можете и должны изменять вещи так, как они вам подходят.

Конечно, если вы должны встроить растеризацию объема в большую сцену, может потребоваться извлечь определенную информацию из матрицы просмотра модели. Верхняя левая подматрица 3 × 3 содержит комбинированный поворот моделей и вида. Третий столбец содержит повернутый Z-вектор вида.

29.03.2013
  • Понятно. Я согласен с вами, что я должен просто контролировать матрицу вида модели. К сожалению, мне пришлось добавить объем к уже существующему графу сцены, который обрабатывает камеру. Я вижу, что верхний левый 3x3 - это матрица вращения. Я не понимаю, что вы имеете в виду под «повернутым вектором по оси Z», это то, что я ищу? 29.03.2013
  • .... Думаю, я бы просто повернул исходную ориентацию с помощью вращения, матрицы, но я не могу быть уверен, что это за исходная ориентация. Это как-то в матрице хранится? 29.03.2013
  • Что ж, OpenGL - это не граф сцены, поэтому матрица вида модели содержит всю цепочку преобразований. Попытка получить полезную информацию из OpenGL таким способом немного ненадежна. Однако, учитывая определенную матрицу просмотра модели, первые 3 столбца являются базовыми векторами системы координат модели в пространстве просмотра. Т.е. 1-й столбец - локальный X (справа), 2-й столбец - локальный Y (вверху), а 3-й столбец - локальный Z (в). 29.03.2013
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..