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


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

lz : (час назад) да не, я не)
Yakim (Watco... : (20 часов назад) Егор, ты говоришь так. будто у тебя они есть, так вот, че по чем?))))
Гость : (вчера) Вот бы сейчас, в 2018, читы на мехов гуглить...
lz : (вчера) Ты просто без читов гоняешь.
Yandersen : (вчера) Ниправда, этот сукасадист должен существовать, его не может не быть! Иначе на кого тяготы жизни сваливать?
Yakim (Watco... : (вчера) Юморист от бога, которого нет)))
Гость : (вчера) Бля, я думал это поиск
Гость : (вчера) Читы
Yakim (Watco... : (6 дней назад) Ну как-бы да, насколько я помню, Дуст и Сплайн основатели =) Кажется идея Дуста, реализация Сплайна.
lz : (6 дней назад) Вон даже свалкер2 будет, а ты говоришь. И P4 будет)
Yandersen : (неделю назад) ессниошибаюсь. Якимка, подтверди?..
Yandersen : (неделю назад) Егор, кто такой Дуст надо знать. Он папа Мехов, основатель Скаев, автор оригинальной идеи и главный разраб.
lz : (неделю назад) Всё будет.
lz : (неделю назад) Я его знать не знаю, и, поэтому, как-то безразлично.
Yandersen : (неделю назад) Не, ну остается ещё пол процента вероятности что старческий маразм, который, судя по всему, уже не за горами, толкнет дедулю на кикстартер и жалкую попытку возродить легенду, но если это и случится, это будет жалкий высер и позор, тут гарантированно.
Yandersen : (неделю назад) Ну так, антипример мотивационный. Тип для подверждения утверждения о последнем Джедае в твоем лице.
Yandersen : (неделю назад) Нам? Да незачем канеш. Прост он Батя Мехов, и после многолетней череды ежегодных грез о М3 такое вот отмачивает.
lz : (неделю назад) Он нам зачем?
lz : (неделю назад) Ни тепло ни холодно.
Yandersen : (неделю назад) Так как тебе новостя, что Дуст из Партизанов в Fearea перешел? От же мотает старика из говна в навоз...
Yandersen : (неделю назад) Еще бы. У меня во времена креативные если проект десяток хидеров включал, так я с наскока в лучшем случае все с нуля тупо переписывал, чем разбирался что там где как было. В худшем - тупо закрывал и забывал нах. Ты-то молодец.
lz : (неделю назад) Я бывает открываю, но с наскока не берётся так пока.
lz : (неделю назад) Так там 3 года назад ещё всё почти готово было. Прогресса особо больше и не было. АИ надо и всё считай.
Yandersen : (неделю назад) Егор, ну позязя, там же на вид не так много осталось? Будет играбельно хоть чутка - получится мотивационно, больше шансов что кто-нить из народа подключится.
lz : (неделю назад) Занят пока просто, терпение)
Гость : (неделю назад) Лол, нет)
Yandersen : (неделю назад) Ну, вялотекущие дела - это по моей части. Ты-то как креативность растерял, а Егорка? На тебя ж одна надежда осталась. Дуст вон в Fearea влился уже. Это ж все, мехам хана, а последний из Джедаев стал вялотекущими делами заниматься, вместо того чтоб мир разумных машин от забвения спасать. Ну Егооооор... :(
lz : (3 недель назад) По гитхабу можно посмотреть.
lz : (3 недель назад) Вялотекущий режим. Время от времени чего-то смотрю.
Yandersen : (3 недель назад) Егорушка, ну а как же ремастеред?.. :(
Yakim (Watco... : (4 недель назад) бугага
lz : (4 недель назад) Вытаскивал из блока.
lz : (4 недель назад) Блэт, мои серваки на амазоне под раздачу попали.
Yakim (Watco... : (05 Апрель 2018 - 20:54) :ph34r:
Гость : (22 Март 2018 - 09:37) Благодарю :) (предпочитаю постоянный стабильный заработок)
Yakim (Watco... : (21 Март 2018 - 19:56) пхахаха
lz : (21 Март 2018 - 16:46) Может быть, хочешь знать, как поднять бабла?
lz : (21 Март 2018 - 16:46) Кстати, а проблем с доступом к джойказино у тебя нет?
lz : (21 Март 2018 - 16:02) Активировал.
Гость : (21 Март 2018 - 15:32) Проблемы с активацией аккаунта на форуме... =)
Yakim (Watco... : (19 Март 2018 - 21:37) :ph34r:
Yakim (Watco... : (01 Февраль 2018 - 21:44) ?
Yandersen : (01 Февраль 2018 - 19:04) Проблемы?..
Yakim (Watco... : (31 Январь 2018 - 13:18) Какие проблемы?
lz : (30 Январь 2018 - 16:17) Какие проблемы? Проблемы с другими движками?

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

[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 анонимных