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


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

smt005 : (неделю назад) Блиин, я думал что уже игра готова, а нет. Заглохло всё?
lz : (30 Сентябрь 2018 - 13:40) Оно там просто всё вместе лежит.
Folgen : (30 Сентябрь 2018 - 12:05) Даже сам Товарищ Майор не нашел бы.
Folgen : (30 Сентябрь 2018 - 12:04) Ого, ребусы.
lz : (30 Сентябрь 2018 - 11:53) Я там постоянно.
lz : (30 Сентябрь 2018 - 11:52) Можно початиться в реалтайме в телеге - https://t.me/joincha...j5MKUrxakTyCPwQ
lz : (30 Сентябрь 2018 - 11:46) Тулзы качаются программой bootstrap_tools из бутстраппера (как скачать - у меня в подписи). Если хочется самим собирать, отпишитесь ещё, я инструкции по сборке допишу.
PA3UJIb : (29 Сентябрь 2018 - 05:29) по ходу это из LLVM
PA3UJIb : (29 Сентябрь 2018 - 05:27) cmake скрипты недописаны. А заголовочники сначала подумал, что из boost, но и там такого не нашел
Folgen : (27 Сентябрь 2018 - 08:38) У меня вообще фигня с СиМэйк. Я уж подумал ну его. А там хедеры нужны от Полигона4.
Folgen : (27 Сентябрь 2018 - 08:37) Вот-вот!
PA3UJIb : (26 Сентябрь 2018 - 20:07) Не знаю, я не смог его "tools" собрать - многих заголовочных нету и хз где их брать.
Гость : (24 Сентябрь 2018 - 14:07) У кого-нибудь есть полный пак инструментария от lz?
Yakim (Watco... : (14 Июль 2018 - 00:06) :D
Yakim (Watco... : (14 Июль 2018 - 00:06) nope
Yandersen : (13 Июль 2018 - 22:07) Айаяй. Поди Якимко заспамил чат стикерами. :)
Yandersen : (13 Июль 2018 - 22:06) Да лан, тут каждый день кто-нить из админов заглядывает. Как пропустили?
Nextovoy : (13 Июль 2018 - 01:04) Я писал
Гость : (10 Июль 2018 - 22:42) Сорьки, что так у нас. Чего три года так и не попытался в чат писнуть? :)
Nextovoy : (06 Июль 2018 - 16:15) Спасибо
lz : (04 Июль 2018 - 19:44) Активировал.
Гость : (03 Июль 2018 - 16:30) Активируйте его.
Гость : (03 Июль 2018 - 16:30) Мой профиль - Nextovoy
Гость : (03 Июль 2018 - 16:25) Написать в чат. Профиль в ручную админы активируют.
Гость : (03 Июль 2018 - 15:47) Ох уж эта дурацкая привычка писать всё раздельно засоряя чат. Это всё классно, конечно, но ребята, одменестраторы, так называемые. Третий год пытаюсь зарегистрироваться (буквально, третий) на этом форуме, но ПИСЬМО С ПОДТВЕРЖДЕНИЕМ НА ПОЧТУ ТАК И НЕ ПРИХОДИТ. Что делать?
Гость : (03 Июль 2018 - 15:46) Перешёл я всё же по ссылке Redoctor'a...
Гость : (03 Июль 2018 - 15:41) Пора уже M4
Гость : (29 Июнь 2018 - 00:18) итак м3
lz : (28 Июнь 2018 - 16:01) Мы тебе и тут передадим.
Гость : (28 Июнь 2018 - 13:13) Зачем в телеграмме делать?!Я вот например не могу зайти,написать в чат,подписаться и не только у меня это.
Redoctor : (24 Июнь 2018 - 19:35) https://vk.com/away....0_23001&cc_key=
Redoctor : (24 Июнь 2018 - 19:34) Тогда в телеграмме в поисковике набери Механоиды 3
Гость : (24 Июнь 2018 - 19:05) Не открывается.
Redoctor : (24 Июнь 2018 - 18:00) 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) Помнится за пару недель от скуки сделал. Делал по вечерам.

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

[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

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

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