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


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

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 : (3 недель назад) https://vk.com/away....0_23001&cc_key=
Redoctor : (3 недель назад) Тогда в телеграмме в поисковике набери Механоиды 3
Гость : (3 недель назад) Не открывается.
Redoctor : (3 недель назад) 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) Изображение

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

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

вектор матрица 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, угол поворота

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

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