Перейти к содержимому


Свернуть чат Чат Открыть чат во всплывающем окне

Yakim (Watco... : (неделю назад) :D
Yakim (Watco... : (неделю назад) nope
Yandersen : (неделю назад) Айаяй. Поди Якимко заспамил чат стикерами. :)
Yandersen : (неделю назад) Да лан, тут каждый день кто-нить из админов заглядывает. Как пропустили?
Nextovoy : (неделю назад) Я писал
Гость : (неделю назад) Сорьки, что так у нас. Чего три года так и не попытался в чат писнуть? :)
Nextovoy : (2 недель назад) Спасибо
lz : (2 недель назад) Активировал.
Гость : (2 недель назад) Активируйте его.
Гость : (2 недель назад) Мой профиль - Nextovoy
Гость : (2 недель назад) Написать в чат. Профиль в ручную админы активируют.
Гость : (2 недель назад) Ох уж эта дурацкая привычка писать всё раздельно засоряя чат. Это всё классно, конечно, но ребята, одменестраторы, так называемые. Третий год пытаюсь зарегистрироваться (буквально, третий) на этом форуме, но ПИСЬМО С ПОДТВЕРЖДЕНИЕМ НА ПОЧТУ ТАК И НЕ ПРИХОДИТ. Что делать?
Гость : (2 недель назад) Перешёл я всё же по ссылке Redoctor'a...
Гость : (2 недель назад) Пора уже M4
Гость : (3 недель назад) итак м3
lz : (3 недель назад) Мы тебе и тут передадим.
Гость : (3 недель назад) Зачем в телеграмме делать?!Я вот например не могу зайти,написать в чат,подписаться и не только у меня это.
Redoctor : (4 недель назад) https://vk.com/away....0_23001&cc_key=
Redoctor : (4 недель назад) Тогда в телеграмме в поисковике набери Механоиды 3
Гость : (4 недель назад) Не открывается.
Redoctor : (4 недель назад) https://t.me/mechanoids3 Для тех кто в танке.
Yakim (Watco... : (15 Июнь 2018 - 01:33) КРУЗИИИС!!!11

Изображение
lz : (15 Июнь 2018 - 00:09) КРУЗИС!
lz : (15 Июнь 2018 - 00:09) ЗИС
lz : (15 Июнь 2018 - 00:09) КРУ
Yakim (Watco... : (14 Июнь 2018 - 14:50) Крузис и Королева тоже не в моем вкусе, а проигрывать нечего =D
lz : (14 Июнь 2018 - 13:55) Конечно, полюбить - так королеву, проиграть - так миллион, сделать - так крузис.
smt005 : (14 Июнь 2018 - 00:22) И от третьего лица тоже можно сделать простенькую игру. Простая игра это лучше чем ничего.
smt005 : (14 Июнь 2018 - 00:21) А, ты хочеш что-бы хит был, с "Crysis" графоном и контентом на 100500 часов игры?
Yakim (Watco... : (14 Июнь 2018 - 00:18) Ни топдовншутеры, ни стратежки)
Yakim (Watco... : (14 Июнь 2018 - 00:15) Не, спасибо, не в моем вкусе=)
smt005 : (13 Июнь 2018 - 23:13) Помнится за пару недель от скуки сделал. Делал по вечерам.
smt005 : (13 Июнь 2018 - 23:13)
smt005 : (13 Июнь 2018 - 23:11) Или например такое, только с моделями из игры -> https://youtu.be/RFDdN5dcX8s
smt005 : (13 Июнь 2018 - 23:07) Yakim, да сами себя пните... :) Сделайте что-то, хотя бы уровня "Scrolling TopDown Shooter".
Yakim (Watco... : (12 Июнь 2018 - 22:17) так что, думаю завтра с утреца стартану марафон)
Yakim (Watco... : (12 Июнь 2018 - 22:15) хе-хе, не сомневайся, я в чате по уе уже поинтересовался, сказали обалденный сериал)))
Yandersen : (12 Июнь 2018 - 20:56) Оооооо, поди ща залипнет на пару дней, стопудофф. :)
Yakim (Watco... : (12 Июнь 2018 - 18:28) Окей гляну)
Yandersen : (12 Июнь 2018 - 16:23) Сериал Пространство посмотри. Не по части Мехов, просто шикарен, авось ману доставит.
Yakim (Watco... : (11 Июнь 2018 - 18:50) Дуст и ты уже закаленные и пустые, надож где-то ману доставать)))
Yakim (Watco... : (11 Июнь 2018 - 18:49) Думаю, кого быть пнуть, что-бы тот пнул в ответ да по сильнее.
Yakim (Watco... : (11 Июнь 2018 - 18:48) Давненько и не маленько хе-хе, делать нечего, прокрастинирую =)
Yandersen : (11 Июнь 2018 - 17:46) Якимка, ты там шо, упоролсо маленько? Чиво картинами опспамилсо?
Yakim (Watco... : (09 Июнь 2018 - 22:27) Изображение

Фотография
- - - - -

[Origin.hpp] - система координат для 3D-объектов

OpenGL coordinate system matrix transformation GLSL

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 18 Апрель 2015 - 08:51

Своя система координат есть у каждого 3D объекта - она определяет ориентацию и положение объекта в мировой системе координат. Класс Origin* (Originf или Origind, в зависимости от желаемого уровня точности) позволяет вращать, перемещать, ориентировать объект и конструировать матрицу трансформации (как прямую, так и обратную).

 

Origin.hpp

 

:!: Требует GLSL.hpp, т.к. содержит много векторной математики.

 

Кидаем в папку проекта файл Origin.hpp, подключаем:

#include "Origin.hpp"

Разница между классами Originf и Origind в формате хранимых данных: Originf использует float, Origind - double (для фанатов высокой точности).

Инициализировать систему координат можно разными способами. Дефолтный конструктор создаёт систему отсчёта с центром в точке {0,0,0} и координатными осями:

Ox = {1,0,0};

Oy = {0,1,0};

Oz = {0,0,1};

Originf CoordinateSystem;
Origind CoordinateSystem_With_Very_High_Data_Precision;

Можно также при инициализации указать центр:

vec3 Point(1,2,3);
Originf CoordinateSystem_With_Center_At(Point);

Или все три координатные оси и центр:

vec3 i(...),j(...),k(...); //Non-collinear vectors
vec3 Center(...);          //Coordinates of the center
Originf System(i,j,k, Center);

Вектора будут автоматически нормализованы и отперпендикулярены таким образом, что среднее направление всех трёх векторов не изменится (справедливвая ортонормализация трёх векторов, моё ноу-хау).

 

Также можно инициализировать координатные оси на основе матрицы 3х3 (в таком случае столбцы матрицы будут считаться координатными осями, а центр будет в {0,0,0}, если не указан):

mat3 NormalMatrix;
Originf System_ijk(NormalMatrix);
vec3 Center(1,2,3);
Originf System(NormalMatrix,Center);

Можно "скопировать" модельновидовую матрицу, или её обрезку (4 столбца, 3 строки):

mat4 ModelViewMatrix;
mat4x3 ShortenedMatrix(ModelViewMatrix); //4th row {0,0,0,1} trimmed out
Originf System1(ModelViewMatrix);
Originf System2(ShortenedMatrix);   //System2 will be equal to System1

Узнать направления координатных осей и центра можно так:

Originf MySystem(...);
vec3 i = MySystem.GetOx();
vec3 j = MySystem.GetOy();
vec3 k = MySystem.GetOz();
vec3 Center = MySystem.Center; //Accessible for direct read and write

Если есть некоторая точка, координаты которой известны в данной системе координат, и нужно узнать её координаты в мировой системе координат (трансформация из объектной в мировую), то пишем так:

vec3 ObjectPoint(...); //Coordinates of a point in MySystem coordinate system
vec3 PointInWorld = MySystem.ObjectToWorld(ObjectPoint);

Если наоборот, есть точка с мировыми координатами, и нужно узнать её координаты в данной системе координат, то так:

vec3 PointInWorld(...); //Coordinates of a point in the global coordinate system
vec3 LocationOnObject = MySystem.WorldToObject(PointInWorld);

Получить матрицу, соответствующую данной системе координат и производящую трансформацию точки из данной системы координат в мировую можно так:

vec4 ObjectPoint(x,y,z,1); //Coordinates of a point in MySystem coordinate system
mat4 M = MySystem.ObjectToWorldMatrix4x4();
vec4 PointInWorld = M * ObjectPoint;

Или так:

vec4 ObjectPoint(x,y,z,1); //Coordinates of a point in MySystem coordinate system
mat4x3 M = MySystem.ObjectToWorldMatrix4x3();
vec3 PointInWorld = M * ObjectPoint;

В обратную сторону:

vec4 WorldPoint(x,y,z,1); //Coordinates of a point in external coordinate system
mat4 M = MySystem.WorldToObjectMatrix4x4();
vec4 LocationOnObject = M * WorldPoint;

Или так:

vec4 WorldPoint(x,y,z,1); //Coordinates of a point in external coordinate system
mat4x3 M = MySystem.WorldToObjectMatrix4x3();
vec3 LocationOnObject = M * WorldPoint;

Особенностью Origin* является то, что координатные оси всегда взаимоперпендикулярны и единичной длины. Это свойство незначительно нарушается в результате поворотов системы координат из-за погрешности вычислений. Поэтому после некоторого количества поворотов производится автоматическая ортонормализация координатных осей (определено константой MATRIX_ROTATION_COUNTER_LIMIT). Для поворота системы координат нужно указать ось вращения (трёхмерный вектор, координаты которого указаны в мировой системе координат) и угол поворота в градусах (альтернативно, синус и косинус угла):

vec3 RotationAxis(x,y,z);
float Angle = 45;
MySystem.Rotate(RotationAxis, Angle);
float sinAngle = sin(radians(Angle)),
      cosAngle = cos(radians(Angle));
MySystem.Rotate(RotationAxis, sinAngle, cosAngle);

Центр системы координат остаётся на прежнем месте.

А можно повернуть систему координат так, чтобы требуемая ось направилась в указанную точку. Как в случае камер OpenGL, для которых ось (-Oz) соответствует направлению взгляда:

vec3 EyePosition(...);
vec3 PointToLookAt(...);
MySystem.Center = EyePosition; //Set camera's location
MySystem.TargetAxisToPoint(-MySystem.GetOz(), PointToLookAt); //Aim the -Oz axis to the point

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



#2 OFFLINE   PA3UJIb

PA3UJIb

    Серый

  • Создатель
  • 171 сообщений

Отправлено 18 Апрель 2015 - 11:34

Не проще ли 0.3333333333 заменить на 1/3 ?

А что за центроид такой? Что означает умножение "среднего" вектора тройки на число 0.57735026918962576450914878050196 ?

А функцию TargetAxisToPoint проверял ? Как она ведет себя с камерой ? Как камера поворачивается, если её координаты {1.0; 1.0; 1.0} ? А как, если {-1.0; -1.0; -1.0} ?


 


#3 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 18 Апрель 2015 - 18:48

Не проще ли 0.3333333333 заменить на 1/3 ?

Лишняя операция деления - зачем, если можно константу вбить?

А что за центроид такой? Что означает умножение "среднего" вектора тройки на число 0.57735026918962576450914878050196 ?

Сначала три вектора приводятся к единичной длине, затем суммируются - получается вектор "среднего направления". Идея в том, что после того, как вектора ортонормализуются, этот вектор останется прежним. Этот вектор также совпадёт с высотой треугольной пирамиды, образованной тройкой ортонормализованных векторов. Длина этой высоты - 0.57735026918962576450914878050196, оттуда это число и взялось. Отскалировав среднее направление к этой длине мы находим точку, через которую проходит плоскость основания пирамиды. Затем мы проецируем исходные вектора на эту плоскость, проекции уравниваем в длине и растопыриваем на 120 градусов. Получаем искомые вектора.

А функцию TargetAxisToPoint проверял ? Как она ведет себя с камерой ? Как камера поворачивается, если её координаты {1.0; 1.0; 1.0} ? А как, если {-1.0; -1.0; -1.0} ?

Хороший вопрос, кстати. Пока что обнаружил, что если попробовать развернуть ось ровно на 180 градусов, шляпа получается - координатная тройка меняется с правосторонней на левосторонюю (или наоборот). Но это логично - при повороте на 180 градусов неопределённой получается ось поворота - нулевой вектор же.

Если тебя интересует, как эмулировать вариант gluLookAt, то либо приравнивай к конструктору с заданием всех трёх координатных осей, либо разворачивай сперва ось Оу, как вектор up, затем направляй -Oz на указанную точку.

 

С камерами, кстать, легко путнуться. Если для объектов трансформация обычно проходит из объектной системы координат в мировую, то для камер - из мировой системы в систему координат наблюдателя, т.е. в обратную сторону. Если напрямую сложить матрицу трансформации из осей системы координат и центра (где оси - столбцы), то такая матрица будет производить трансформацию из объектной системы координат в мировую. Используя Originf для камер мы считаем камеру объектом сцены. Направление взгляда камеры - это ось -Oz, направление направо - ось Ox, направление вверх (вектор up) - это ось Оу. Разница лишь в том, какую функцию мы используем для извлечения модельновидовой матрицы - в случае камер это будет .WorldToObjectMatrix4x4(), а в случае объектов - .ObjectToWorldMatrix4x4(). Чтобы отрендерить объект, нужно произвести трансформацию сначала из объектной системы координат в мировую, а затем из мировой в систему координат наблюдателя:

Originf Model(...);
Originf Viewer(...);

mat4 ModelWorldMatrix = Model.ObjectToWorldMatrix4x4;
mat4 WorldViewMatrix = Viewer.WorldToObjectMatrix4x4;

vec4 ModelPoint(x,y,z,1);

vec4 ViewPoint = WorldViewMatrix * (ModelWorldMatrix * ModelPoint);

Получается, чтоб найти модельновидовую матрицу, производящую трансформацию сразу из системы координат модели в систему координат наблюдателя, нам нужно перемножить ModelWorldMatrix и WorldViewMatrix:

mat4 ModelViewMatrix = WorldViewMatrix * ModelWorldMatrix;
vec4 ViewPoint = ModelViewMatrix * ModelPoint;






Темы с аналогичным тегами OpenGL, coordinate system, matrix, transformation, GLSL

Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных