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

Равномерное движение по сплайну Катмулл-Рома (комментарии)

#0
16:39, 17 авг. 2012

Равномерное движение по сплайну Катмулл-Рома (комментарии)

Это сообщение сгенерировано автоматически.

#1
16:39, 17 авг. 2012

Выложи класс vector2 пожалуйста

#2
17:13, 17 авг. 2012

Написал сообщение в личку.

#3
20:46, 28 авг. 2012

а можно реализацию для делфи, пожалуйста ;)

#4
11:19, 28 сен. 2012

Движение не будет равномерным, так как уже в следующей точке кривая будет иметь совсем другую скорость изменения

Прошло более 1 года
#5
21:29, 12 мая 2014

По-моему 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;
  }
#6
3:21, 13 мая 2014

Void12
Спасибо, опечатка в классе, при вычислении m_vFactor[1]. Поправил.

#7
3:41, 13 мая 2014

Viktor2012
> Движение не будет равномерным, так как уже в следующей точке кривая будет иметь
> совсем другую скорость изменения
Движение будет сглажено с удовлетворительной точностью при небольшом шаге времени, что для игр вполне нормально (60 тиков в секунду), и относительно небольшой скорости движения. Подойдет вполне для движения персонажа.
Для более точного распределения по кривой можно применять другие методы. Здесь же приведен наименее затратный и понятный метод.

Прошло более 10 месяцев
#8
6:24, 1 апр. 2015

Большое спасибо за статью!
Но по-моему есть неточность - я так понимаю, что в крайних точках 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;

#9
16:09, 10 июля 2015

Привет. Коллеги, итого правильное разложение:

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. При использовании оригинальной записи автора, судя по всему, вы будете наблюдать обнуление скорости при прохождении через опорные точки кривой.

#10
16:42, 10 июля 2015

Надо будет обновить все вычисления. Что-то много неточностей нашлось.

#11
21:09, 10 июля 2015

Стало интересно, насколько движение будет отличаться от равномерного, и насколько лучше станет от формулы более высокого порядка.
Нафигачил такой вот тест:
http://ideone.com/OHOTWh
(результаты - в "Stepping test", т. к. "Length measurement test" всего лишь проверяет, что длина измеряется с достаточно приличной точностью).
Предварительные ответы:
1. На удивление хорошо совпадает.
2. На удивление слабо улучшается.

#12
11:15, 12 июля 2015

Зачем так напрягаться то ?)
Ставим vSync.
Имеется формула траектории движения.
Имеется координата предыдущей точки объекта и его скорость.
Время кадра в секундах = 1 / FPS монитора.
Вычисляем следующую точку относительно формулы.

Вся соль тут - использование vSync. Тогда действительно плаааааааавное )).
Но видимо тут про другое говорится )))).

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

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