?

Log in

No account? Create an account
14 июл, 2006 @ 12:10 Без названия
Музыка: Motorhead - city kids (alternate take)
Хмм...

Может, кто мне подскажет, что я делаю не так или как надо делать правильно.

Делаю смешивание нескольких анимаций - базовая и дополнительная.
Объект - две кости - А и Б.
А - _
Б - |
Выглядит так: |_

Базовая: объект движется вдоль оси Z.
Дополнительная: объект стоит на месте, кость Б вращается вокруг оси Z.

Если проигрывать анимации по отдельности - то все ок.

Начинаю смешивать - вылезает непонятный мне косяк:
в зависимости от коэффициента смешивания анимаций происходит скачок, например, когда поворот кости Б доходит до Pi происходит скачок в 2Pi, коэффициент смешивания при этом 0.5. При другом коэффициенте - скачок будет при другом угле поворота.

Вполне возможно, что-то я делаю не так или что-то не до конца понимаю.

Повороты делаю через кватернионы.
_zerg:
[User Picture Icon]
From:glebedev
Date:Июль, 14, 2006 07:40 (UTC)
(Ссылка)
а смешиваешь как?
(Ответить) (Ветвь дискуссии)
From:_zerg
Date:Июль, 14, 2006 07:44 (UTC)
(Ссылка)
VEC4 blend(VEC4 v4A, VEC4 v4B, FLOAT d)
{
	FLOAT norm;
	norm = v4A.x * v4B.x + v4A.y * v4B.y + v4A.z * v4B.z + v4A.w * v4B.w;

	BOOL bFlip;
	bFlip = false;

	if(norm < 0.0f)
	{
		norm = -norm;
		bFlip = true;
	}

	FLOAT inv_d;
	if(1.0f - norm < 0.000001f)
	{
		inv_d = 1.0f - d;
	}
	else
	{
		FLOAT theta;
		theta = (float) acos(norm);

		FLOAT s;
		s = (float) (1.0f / sin(theta));

		inv_d = (float) sin((1.0f - d) * theta) * s;
		d = (float) sin(d * theta) * s;
	}

	if(bFlip)
	{
		d = -d;
	}

	v4A.x = inv_d * v4A.x + d * v4B.x;
	v4A.y = inv_d * v4A.y + d * v4B.y;
	v4A.z = inv_d * v4A.z + d * v4B.z;
	v4A.w = inv_d * v4A.w + d * v4B.w;

	return v4A;
}
(Ответить) (Уровень выше) (Ветвь дискуссии)
From:peeplevarreh
Date:Июль, 14, 2006 13:11 (UTC)
(Ссылка)
SLERP у тебя, похоже, реализован вполне правильно.
При преобразовании кватерниона в матрицу и наоборот нигде не опечатался? По описанию проблемы - очень похоже.
(Ответить) (Уровень выше) (Ветвь дискуссии)
From:peeplevarreh
Date:Июль, 14, 2006 11:57 (UTC)
(Ссылка)
>когда поворот кости Б доходит до Pi происходит скачок в 2Pi

Не совсем понял. Угол изменяется на 2Pi радиан или угол должен быть Pi, а он почему-то 2Pi?
(Ответить) (Ветвь дискуссии)
From:_zerg
Date:Июль, 14, 2006 11:59 (UTC)
(Ссылка)
да, угол должен быть Pi, а он почему-то 2Pi.
(Ответить) (Уровень выше) (Ветвь дискуссии)