C ++ обратный вектор движок TL - PullRequest
0 голосов
/ 19 января 2012

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

Ответы [ 2 ]

1 голос
/ 19 января 2012

Итак, вы говорите о векторе в математическом смысле, а не о контейнере.Давайте все же предположим, что вы реализовали это с std::vector<fieldT>, где, например, typedef double fieldT.Кажется, вы хотите, чтобы направление отражалось каким-то препятствием.Легко, когда «зеркало» лежит в направлении одного из ваших базовых векторов, тогда вам нужно только отрицать этот компонент - «зеркало» в плоскости xy (в 3D) будет делать

v[2] = -v[2];

т.е. переворачивать z -компоненту, в плоскости yz это будет

v[0] = -v[0];

Ситуация усложняется, если возникают отраженияв произвольном направлении.Одна из возможностей состоит в том, чтобы определить компонент скорости в направлении плоскости - это делается путем вычисления скалярного произведения между вектором скорости и вектором нормали плоскости - и затем вычитать дважды вектор нормали, взвешенный с этим фактором.

std::vector<fieldT> n   // normal vector of the plane
                  , v   // speed vector
                  ;

fieldT eta=0;
for (unsigned i=0; i<n.size(); ++i)     //scalar product between v and n
  eta += v[i]*n[i];
for (unsigned i=0; i<n.size(); ++i)     //substract twice the weighted normal vector
  v[i] -= 2*eta*n[i];

Более общим подходом было бы моделирование отражения с помощью матричного приложения: отражение по сути является применением ортогонального линейного отображения.

0 голосов
/ 20 января 2012

Вот код для расчета прогиба плоской и жесткой поверхности.

CurrentVelocity - скорость объекта, который будет отклоняться от поверхности. CollisionNormal - это вектор, представляющий нормаль поверхности, делающей отклонение. Код ниже возвращает новую скорость в предположении мгновенного отклонения.

Vector3 CalculateDeflection(const Vector3& CurrentVelocity, const Vector3& CollisionNormal)
{
    Vector3 newVelocity = (-2 * Vector3.Dot(CurrentVelocity, CollisionNormal) * CollisionNormal + CurrentVelocity);

    return newVelocity;
}

float Vector3::Dot(const Vector3& lhs, const Vector3& rhs)
{
    return ((lhs.X * rhs.X) + (lhs.Y * rhs.Y) + (lhs.Z * rhs.Z));
}
...