C++ обратный вектор движок TL
У меня были некоторые проблемы с обращением моих векторов в моей игре, когда происходит столкновение, и мне нужно переворачивать значение обратно на текущее значение каждый раз, когда мрамор попадает в объект. Векторы - это направления, которые мне нужно повернуть, чтобы придать реалистичный оттенок.
2 ответа
Так что вы говорите о векторе в математическом смысле, а не о контейнере. Давайте все же предположим, что вы реализовали это с 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];
Более общим подходом было бы моделирование отражения с помощью матричного приложения: отражение по существу является применением ортогонального линейного отображения.
Вот код для расчета прогиба от плоской и жесткой поверхности.
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));
}