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


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

lz : (2 недель назад) Оно там просто всё вместе лежит.
Folgen : (2 недель назад) Даже сам Товарищ Майор не нашел бы.
Folgen : (2 недель назад) Ого, ребусы.
lz : (2 недель назад) Я там постоянно.
lz : (2 недель назад) Можно початиться в реалтайме в телеге - https://t.me/joincha...j5MKUrxakTyCPwQ
lz : (2 недель назад) Тулзы качаются программой bootstrap_tools из бутстраппера (как скачать - у меня в подписи). Если хочется самим собирать, отпишитесь ещё, я инструкции по сборке допишу.
PA3UJIb : (3 недель назад) по ходу это из LLVM
PA3UJIb : (3 недель назад) cmake скрипты недописаны. А заголовочники сначала подумал, что из boost, но и там такого не нашел
Folgen : (3 недель назад) У меня вообще фигня с СиМэйк. Я уж подумал ну его. А там хедеры нужны от Полигона4.
Folgen : (3 недель назад) Вот-вот!
PA3UJIb : (3 недель назад) Не знаю, я не смог его "tools" собрать - многих заголовочных нету и хз где их брать.
Гость : (3 недель назад) У кого-нибудь есть полный пак инструментария от 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) Помнится за пару недель от скуки сделал. Делал по вечерам.
smt005 : (13 Июнь 2018 - 23:13)

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

Векторы, векторы, векторы

вектор матрица vec3 угол поворота

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

#1 OFFLINE   PA3UJIb

PA3UJIb

    Серый

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

Отправлено 10 Декабрь 2014 - 15:24

У меня появилась замечательная проблемка :) и родилась она из игры с камерой.

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

В общем, необходимо определить угол поворота одного вектора в другой.

Есть, казалось бы замечательная функция

const float angle(const vec3 &from, const vec3 &to)
{
	float len = length(from)*length(to);

	// divide zero check
	if (len < 1e-6f)
		len = 1e-6f;

	float f = dot(from, to) / len;

	f = clamp(f, -1.0f, 1.0f);

	return acos(f);
}

Однако в том, что вектора перпендикулярны друг другу и состоит главная закавыка.

Допустим, нам надо повернуть вектор

vec3 v0(0.0f, 0.0f, -1.0f);

в вектор

vec3 v(1.0f, 0.0f, 0.0f);

Никаких проблем, запускаем их в функцию

float A = angle(v0, v);

Проверяем. Всё верно, A равно "ПИ" пополам.

А если второй вектор чуточку другой?

vec3 v(-1.0f, 0.0f, 0.0f);

Запускаем и его в функцию - вуаля, ответ A равно "ПИ" пополам.

Так это что же получается? Векторы разные, а чтобы совместить v0 с ними, его надо вращать на один и тот же угол?

Нет! Вращать надо хоть и на одинаковый по размеру угол, но по-разному. В первом случае мы вращаем по часовой стрелке, а в другом - против. То есть, соответственно, на 90 градусов и -90 градусов.

 

Так вот, вопрос состоит в том, как определить, когда это будет "плюс", а когда "минус"?


 


#2 OFFLINE   PA3UJIb

PA3UJIb

    Серый

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

Отправлено 10 Декабрь 2014 - 19:35

Кароч пока костыль.
	vec3 vy = vec3(v.x, 0.0f, v.z);
	float Ay = angle(v0, vy);
	float A = dot( cross(v0, vy), vec3_y);
	if ( A > 0.0f )
		Ay = -Ay;

 


#3 OFFLINE   Yandersen

Yandersen

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

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

Отправлено 10 Декабрь 2014 - 20:01

Блин, я тупанул. И ты, межпрочем, тоже! Всё верно у тебя одинаковый угол поворота выдавался (и да, правильнее считать всё же через косинус, как у тебя было изначально - тогда диапазон 0...180 будет). Дело в том, что угол поворота вектора характеризуется не только углом, но и осью вращения, которая во втором случае будет в обратную сторону вывернута, хотя значение угла при этом будет то же самое.

 

Предлагаю в качестве дополнительного аргумента добавить ещё один вектор - "ref":

double angle(const vec3 &from, const vec3 &to, const vec3 &ref){
 double div = sqrt(dot(from,from)*dot(to,to));
 if(div < 1e-300)return 0.0;
 double cosAngle = dot(from, to) / div;
 cosAngle = clamp(cosAngle , -1.0f, 1.0f);
 return acos(cosAngle) * ((dot( cross(from,to), ref )<0.0)?(-1):1);
}

Тогда будет возвращать угол в диапазоне -180...+180.

Предположим, вектор from - направление взгляда, вектор ref - макушка. Тогда если вектор "to" смотрит налево, то угол будет 0...+180, а если направо - то угол 0...-180.

Вектор ref не должен лежать в плоскости from-to.

 

вопрос: а зачем ты const перед возвращаемым аргументом функции прописываешь?
Чтобы возвращаемое значение было константным?

Мне трудно представить, как применять понятие константы к вычисленному значению функции... М... А что эта приписка на практике даёт? Я в курсе, зачем const употреблять в случае аргументов-классов или аргументов-поинтеров, а также для функции члена класса, но вот чтоб так - не пойму зачем?



#4 OFFLINE   Yandersen

Yandersen

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

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

Отправлено 13 Январь 2015 - 22:36

Увлёкся матрицами поворота (3х3). Как известно, при многократном умножении этих матриц друг на друга со временем нарастает погрешность, из-за чего базисные векторочки уплывают от изначальной единичной длины и перестают быть взаимноперпендикулярными (чур кватернионы как решение проблемы не предлагать!). И вот ломаю тут я моск, как можно 3 вектора ортонормализовать таким образом, чтобы один и тот же результат получался вне зависимости от того, в каком порядке перечислены вектора. Ща поясню почему простой метод ортонормализации кривой.

Стандартный подход:

//vec3 i,j,k; //Three non-collinear vectors
vec3 Ox = normalize(i);
vec3 Oz = normalize( cross(i,j) );
vec3 Oy = cross(Oz,Ox);

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

 

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



#5 OFFLINE   Yandersen

Yandersen

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

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

Отправлено 16 Январь 2015 - 22:50

Йиха, придумал способ ортонормализации трёх векторов с сохранением среднего направления:

https://www.opengl.o...l=1#post1263786

Йа умный и очень горд собой. B)



#6 OFFLINE   PA3UJIb

PA3UJIb

    Серый

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

Отправлено 18 Январь 2015 - 07:20

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


 


#7 OFFLINE   Yandersen

Yandersen

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

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

Отправлено 18 Январь 2015 - 09:27

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

 

Ну вот представь, что камера организована просто как матрица 4х4 и все повороты камеры и сдвиги реализованы посредством тупо glRotate и glTranslate. Типа, мышей двинул на ху пикселов - и матрица модельновидовая умножилась на матрицу поворота. И так вот каждый фрейм. Пара минут и сцена начинает "косить". Что делать? А вот после каждых х поворотов камеры ортонормализовать её верхнюю левую 3х3 часть моей функциёвиной. Если стандартным методом пользоваться, то дёрганья будут сильнее заметны (если редко ортонормализацию проводить), т.к. одна ось так и останется на своём месте, а две другие изогнуться. А моим способом все три оси отгибаются на чуть-чуть, так что среднее направление остаётся тем же. Более корректный способ изобрёл я, вотЪ.  :)

З.Ы.: тока не ебите моск кватернионами - я до них не доучился в своё время (или прослушал).  :)



#8 OFFLINE   PA3UJIb

PA3UJIb

    Серый

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

Отправлено 18 Январь 2015 - 16:25


мышей двинул на ху пикселов - и матрица модельновидовая умножилась на матрицу поворота. И так вот каждый фрейм. Пара минут и сцена начинает "косить".

Ну да, в первых демках на "бескрайнюю" мапу у тебя так и было.


тока не ебите моск кватернионами

Да я как бы сам в них не копенгаген. Знаю только что это ось {x, y, z} и синус угла поворота вокруг этой оси {w}


 






Темы с аналогичным тегами вектор, матрица, vec3, угол поворота

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

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