Переместить объект в направлении кривой Безье? - PullRequest
5 голосов
/ 16 января 2011

У меня есть объект, с помощью которого я хотел бы сделать так, чтобы он следовал кривой Безье, и сейчас я немного растерялся относительно того, как заставить его делать это на основе времени, а не точек, составляющих кривую.

. :: Текущая система ::.Каждый объект в моем графе сцены состоит из векторов положения, поворота и масштаба.Эти векторы используются для формирования соответствующих им матриц: масштабирования, поворота и перемещения.Которые затем умножаются в этом порядке, чтобы сформировать матрицу локального преобразования.Мировое преобразование (обычно единичная матрица) затем умножается на локальное матричное преобразование.

class CObject
{
public:
 // Local transform functions
 Matrix4f GetLocalTransform() const;
 void SetPosition(const Vector3f& pos);
 void SetRotation(const Vector3f& rot);
 void SetScale(const Vector3f& scale);

    // Local transform
    Matrix4f m_local; 
    Vector3f m_localPostion;
    Vector3f m_localRotation; // rotation in degrees (xrot, yrot, zrot)
    Vector3f m_localScale;
}

Matrix4f CObject::GetLocalTransform()
{
    Matrix4f out(Matrix4f::IDENTITY);

    Matrix4f scale(), rotation(), translation();

    scale.SetScale(m_localScale);
    rotation.SetRotationDegrees(m_localRotation);
    translation.SetTranslation(m_localTranslation);

    out = scale * rotation * translation;
}

Большой вопрос, который у меня есть,

1) Как мне ориентировать мой объект, чтобы онтангенс кривой Безье?

2) Как переместить этот объект вдоль кривой, не устанавливая положение объекта в положение точки в кювете Безье?

Вот обзор функциидо сих пор

void CNodeControllerPieceWise::AnimateNode(CObject* pSpatial, double deltaTime)
{
    // Get object latest pos.
    Vector3f posDelta = pSpatial->GetWorldTransform().GetTranslation();

    // Get postion on curve
    Vector3f pos = curve.GetPosition(m_t);

    // Get tangent of curve
    Vector3f tangent = curve.GetFirstDerivative(m_t);

}

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

Я хочу, чтобы объект был прикреплен к кривой и был направлен в направлении кривой.

Что касаетсядвижение, я хочу, чтобы объект следовал кривой в зависимости от времени, таким образом это создает плавное движение по всей кривой.

Ответы [ 4 ]

2 голосов
/ 16 января 2011

У вас должна быть кривая в параметрической форме и использовать производный вектор для оценки вращения вашего объекта (угол поворота = производный угол), как сказал @etarion.

Чтобы переместить объект по кривой с желаемымСкорость (я думаю, это то, что вы хотите). На каждом шаге симуляции вы должны оценить расстояние, которое точка должна пройти на этом шаге.

Самая простая оценка - dist = derivative.length()*TIMER_STEP.Когда вы знаете, что dist должен быть пройден на текущем шаге, а t0 - текущий параметр кривой, вы можете просто увеличить t0 на какое-то небольшое значение epsilon и проверить, что пройденное расстояние все еще меньше, чем предполагалось.Повторяйте это, пока пройденное расстояние (при увеличении t0) не будет> = оценочным.Это будет новый текущий параметр t0 для следующего шага

EDIT:

Сначала не заметил, что вы находитесь в 3d.В трехмерном пространстве вы не можете однозначно определить положение объекта на кривой, даже если вы знаете начальную позицию.Просто представьте, что ваша кривая - это линия - объект все еще может вращаться вокруг линии.Этот угол не определяется кривой.

Я бы сделал что-то вроде этого.Давайте свяжем вектор с объектом так, чтобы в начале движения (например, параметр кривой t = 0) направление вектора объекта совпадало с вектором производной.Тогда во время движения этот вектор все равно должен совпадать с производной в каждой точке кривой.Таким образом, вы будете знать этот объектный вектор и сможете настроить свой объект в соответствии с этим вектором.Но у вас все равно будет одна степень свободы.

Например, вы можете сказать, что объект не вращается вокруг этого вектора.

Зная вектор объекта и угол поворота вокруг него, вы можете восстановитьориентация объекта в трехмерном мире.

PS: такой вектор объекта и угол поворота вокруг него называется кватернионом - так что вы можете использовать математику кватерниона (просто скопируйте требуемую формулу) для вычисленияматрица вращения объекта!вот формулы http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm

2 голосов
/ 16 января 2011

Вам нужна параметрическая формулировка вашей кривой.

Большой вопрос, который у меня возникает,

1) Как мне ориентировать мой объект так, чтобы он касался касательной кривой Безье?

Если у вас есть кривая в параметрической форме, тангенциальное направление является производной от положения относительно. t .

2) Как переместить этот объект вдоль кривой, не устанавливая положение объектов в точке точки Безье?

Я не уверен, что получу ваш вопрос - вы увеличите t в вашей параметрической форме за небольшой шаг и обновите положение и направление.У вас все еще есть некоторая степень свободы, между прочим, направление «вверх» не определяется из кривой, поэтому вам также нужно позаботиться об этом.

0 голосов
/ 16 января 2011

Один из подходов - вычислить пирамиду из точек.Нижний слой - ваши преобразованные контрольные точки.Теперь для данного t и для каждой пары соседних точек создайте новую точку на этом отрезке, взвешенную по t.Этот новый набор точек образует следующий слой в пирамиде.Повторяйте, пока текущий слой не будет иметь только 1 точку.Этот момент - ваша позиция.Обратите внимание, что второй слой сверху имеет 2 точки и определяет касательную линию.

0 голосов
/ 16 января 2011

Я предполагаю, что у вас есть все точки, необходимые для определения кривой Безье. Затем вы можете вычислить каждую точку на этой кривой. Вычислите подходящую точку, учитывая скорость, с которой должен двигаться объект, и время кадра, и вы должны иметь постоянное движение.

Вектор, образованный точками из последнего и текущего кадра, может использоваться в качестве грубой оценки касательной в большинстве случаев; например когда кривая не изгибается слишком резко.

Edit: посмотрите также , как рассчитать длину кривой Безье . Вам нужно будет преобразовать это, чтобы вы могли рассчитать точку на кривой (или, точнее, t ) для заданной длины. Тогда просто двигайтесь равномерно по отношению ко времени, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...