Равномерное движение по сплайну Катмулл-Рома (комментарии)
Это сообщение сгенерировано автоматически.
Выложи класс vector2 пожалуйста
Написал сообщение в личку.
а можно реализацию для делфи, пожалуйста ;)
Движение не будет равномерным, так как уже в следующей точке кривая будет иметь совсем другую скорость изменения
По-моему m_vFactor не правильно рассчитывается.
Вот моя версия(протестировано - работает):
void CCatmullRom::SetPoints(XMFLOAT3 const &_v1, XMFLOAT3 const &_v2, XMFLOAT3 const &_v3, XMFLOAT3 const &_v4) { XMVECTOR m0 = XMLoadFloat3( &_v1); XMVECTOR p0 = XMLoadFloat3( &_v2); XMVECTOR p1 = XMLoadFloat3( &_v3); XMVECTOR m1 = XMLoadFloat3( &_v4); m_vFactor[0] = ( p0 - p1) * 1.5f + ( m1 - m0) * 0.5f; m_vFactor[1] = p1 * 2.0f - p0 * 2.5f - m1 * 0.5f + m0; m_vFactor[2] = ( p1 - m0) * 0.5f; m_vFactor[3] = p0; }
Void12
Спасибо, опечатка в классе, при вычислении m_vFactor[1]. Поправил.
Viktor2012
> Движение не будет равномерным, так как уже в следующей точке кривая будет иметь
> совсем другую скорость изменения
Движение будет сглажено с удовлетворительной точностью при небольшом шаге времени, что для игр вполне нормально (60 тиков в секунду), и относительно небольшой скорости движения. Подойдет вполне для движения персонажа.
Для более точного распределения по кривой можно применять другие методы. Здесь же приведен наименее затратный и понятный метод.
Большое спасибо за статью!
Но по-моему есть неточность - я так понимаю, что в крайних точках t=0 и t=1 должны получаться центральные точки сплайна. Сейчас это не так для t=1:
P(t) = ((at + b)t + c)t + d
P(1) = a + b + c + d
Однако просуммировав
a = 1.5(p0 - p1) + 0.5(m1 - m0);
b = -(2.5p0 + 2p1) - (0.5m1 + m0);
c= (p1 - m0)/2;
d= p0;
Получим P(1) = -2.5p1 -2m0.
Прделагаю такой вариант разложения:
a = 2(p0 - p1) m0 + m1;
b = -3(p0 - p1) - 2(m0 + 0.5m1);
c= m0;
d= p0;
Привет. Коллеги, итого правильное разложение:
Vector3 a = 2*(p0 - p1) + m0 + m1; Vector3 b = -3*(p0 - p1) - 2*(m0 + 0.5f*m1); Vector3 c = m0; Vector3 d = p0; Vector3 position = ((a*t + b)*t + c)*t + d; Vector3 velocity = 3*a*t2 + 2*b*t + c;
Уважаемый LZ верно подметил, но пропустил знак "+" в своем комментарии перед m0 для вычисления a. При использовании оригинальной записи автора, судя по всему, вы будете наблюдать обнуление скорости при прохождении через опорные точки кривой.
Надо будет обновить все вычисления. Что-то много неточностей нашлось.
Стало интересно, насколько движение будет отличаться от равномерного, и насколько лучше станет от формулы более высокого порядка.
Нафигачил такой вот тест:
http://ideone.com/OHOTWh
(результаты - в "Stepping test", т. к. "Length measurement test" всего лишь проверяет, что длина измеряется с достаточно приличной точностью).
Предварительные ответы:
1. На удивление хорошо совпадает.
2. На удивление слабо улучшается.
Зачем так напрягаться то ?)
Ставим vSync.
Имеется формула траектории движения.
Имеется координата предыдущей точки объекта и его скорость.
Время кадра в секундах = 1 / FPS монитора.
Вычисляем следующую точку относительно формулы.
Вся соль тут - использование vSync. Тогда действительно плаааааааавное )).
Но видимо тут про другое говорится )))).
Тема в архиве.