Вектор масштаба вдоль плоскости

Я пытаюсь применить трение к 3D-столкновению. Информация, которой я располагаю:

  • Скорость столкновения
  • Нормаль поверхности коллайдера
  • Произвольный коэффициент трения (0 - 1 включительно)

введите здесь описание изображения

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

Как я могу выполнить эту операцию?

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


person Vesuvian    schedule 02.11.2014    source источник


Ответы (2)


Я смог решить проблему, выполнив следующие действия:

  1. Получить касательный вектор для нормали
  2. Используйте нормаль и касательный вектор, чтобы получить матрицу вращения для поверхности
  3. Используйте обратную матрицу вращения, чтобы преобразовать вектор скорости
  4. Масштабируйте компоненты x и z преобразованного вектора с помощью коэффициента трения
  5. Используйте матрицу вращения, чтобы снова преобразовать скорость

Я сомневаюсь, что это самый эффективный способ сделать это, но, похоже, он сработал.

person Vesuvian    schedule 02.11.2014
comment
Да, вы преобразовали 3D-задачу в 2D-выровненную задачу. Кстати, вы также имеете дело с разными коэффициентами восстановления, или ваши столкновения только упругие? - person John Alexiou; 03.11.2014
comment
Я пишу моделирование частиц. Частицы не имеют массы, поэтому столкновения упругие (я думаю!). - person Vesuvian; 03.11.2014

Если вы можете выполнять сложение векторов, скалярное умножение (т.е. умножение вектора на число) и скалярное произведение, то это все, что вам нужно:

Vin = (V•Vнормально)Vнормально< /сильный>

Vpar = V - Vin

Vpar = kVpar (где k — коэффициент, а "=" означает присвоение)

Vв = -Vв

V = Vin + Vpar

person Beta    schedule 02.11.2014
comment
Спасибо за ваш вклад Бета. Моя математическая запись не очень хороша, что делает =›? Также похоже, что Vpar не используется при расчете Vin, или есть два выхода? - person Vesuvian; 03.11.2014
comment
@Vesuvian: Извините, я забыл последний шаг. Я отредактирую. - person Beta; 03.11.2014
comment
Спасибо за обновление @Beta, но я все еще немного запутался. Означает ли первая строка скалярное произведение скорости и нормали, умноженное на нормаль? Извиняюсь за рукопожатие. - person Vesuvian; 03.11.2014
comment
@Vesuvian: Не нужно извиняться, векторная алгебра поначалу сбивает с толку, и да, это именно то, что она означает. Скалярный продукт двух векторов — это число; (V•Vn) — число. Сколько раз вектор является вектором; (V•Vn) Vn — вектор. - person Beta; 03.11.2014
comment
Хорошо, у меня есть реализация, но она, похоже, переворачивает одну из осей. Скорость (0,0, -9,1, -4,9), нормальная (0,0, 1,0, 0,0), трение 1,0 дает мне результат (0,0, 9,2, -4,8). Я полагаю, что величина правильная (просто округление на выходе), но вы можете видеть, что скорость отражается по оси Y. - person Vesuvian; 03.11.2014
comment
@Vesuvian: Разве это не то, чего ты хочешь, когда отскакиваешь от стены? - person Beta; 03.11.2014
comment
На самом деле я обрабатываю отскок скорости отдельно, но если я делаю и то, и другое одновременно, мне нужно будет учитывать коэффициент отскока. - person Vesuvian; 03.11.2014
comment
Давайте продолжим обсуждение в чате. - person Beta; 03.11.2014