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


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

Yakim (Watco... : (вчера) точно? :huh: а если найду? :lol:
lz : (вчера) да не, я не)
Yakim (Watco... : (2 дней назад) Егор, ты говоришь так. будто у тебя они есть, так вот, че по чем?))))
Гость : (2 дней назад) Вот бы сейчас, в 2018, читы на мехов гуглить...
lz : (3 дней назад) Ты просто без читов гоняешь.
Yandersen : (3 дней назад) Ниправда, этот сукасадист должен существовать, его не может не быть! Иначе на кого тяготы жизни сваливать?
Yakim (Watco... : (3 дней назад) Юморист от бога, которого нет)))
Гость : (3 дней назад) Бля, я думал это поиск
Гость : (3 дней назад) Читы
Yakim (Watco... : (неделю назад) Ну как-бы да, насколько я помню, Дуст и Сплайн основатели =) Кажется идея Дуста, реализация Сплайна.
lz : (неделю назад) Вон даже свалкер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 : (18 Апрель 2018 - 23:33) Вытаскивал из блока.
lz : (18 Апрель 2018 - 23:33) Блэт, мои серваки на амазоне под раздачу попали.
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) Какие проблемы?

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

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

вектор матрица 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 анонимных