ПрограммированиеФорумОбщее

Скейл кватерниона по трём независимым осям

#0
22:07, 29 сен 2016

Подскажите, как это правильно делается, уже задолбался. Везде скейл представлен скаляром, а мне надо независимо по трём осям. Это вообще возможно с кватернионами?

#1
22:22, 29 сен 2016

g-cont
А скейл кватернионов это вообще как? Ненормированный используешь?

#2
22:26, 29 сен 2016

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

#3
22:42, 29 сен 2016

g-cont
Добавь вектор масштабирования?

#4
23:06, 29 сен 2016

-Eugene-
Тогда смысл в оптимизации? Корочи не получится скейл в кватернионы закодировать, я понял.

#5
23:14, 29 сен 2016

g-cont
Нууу, чудес не бывает. Девять степеней свободы меньше чем в девять параметров арифметически не закодируешь.

#6
5:42, 30 сен 2016

g-cont
Упакуй матрицы в текстуру и делай Vertex Texture Fetch, если на sm3.0 железе. На более новых картах есть константные буферы с неограниченным размером.

#7
11:17, 30 сен 2016

Wraith
так в том-то и дело, что железо старое, там нету даже UBO.

#8
11:28, 30 сен 2016

g-cont
Если следить за тем, чтобы w компонента кватерниона поворота была всегда положительна исходя из того (-xyz, w) соответствует (xyz, -w). То станет возможным в w компоненту закодить все твои скейлы жертвуя точностью (по аналогии с тем, как это делается при упаковке глубины в rgba текстуру)

const float T = 256.0;
vec4 bitSh = vec4(1.0/(T*T*T), 1.0/(T*T), 1.0/T, 1.0);
w = dot(scale / MAX_SCALE, bitSh);

В шейдере их декодировать

vec4 bitSh = vec4(T*T*T, T*T, T, 1.0);
vec4 bitMsk = vec4(0.0, 1.0/T, 1.0/T, 1.0/T);
vec4 res = fract(w * bitSh);
scale = (res - res.xxyz * bitMsk) * MAX_SCALE;

и восстанавливать оригинальный w = sqrt(1 - dot(xyz, xyz))

#9
17:24, 30 сен 2016

XProger
если бы речь шла только об упаковке данных - я бы не создал эту тему. Но мне надо умножить кватернионы на родительские с учётом скейла по трём осям. А это физически невозможно. Только на матрицах.
ЗЫ. а про фокус с упаковкой я давно знаю и активно его юзаю.

ПрограммированиеФорумОбщее

Тема в архиве.