Не совсем в тему вопрос, но может тут найдутся знающие люди.
Вопрос касается векторной алгебры, в ней я увы полный нуб, правильно сформулировать для гугла тоже не получается.
Есть два
нормализованных вектора: Вектор направления (vForward) и Вектор нормали (vNormal -
перпендикулярен поверхности, из которой исходит, и отражает её наклон)
Мне необходимо
vForward преобразовать с помощью
vNormal так, чтобы он стал параллельным с
поверхностью. (проскользил вдоль неё)
Для этого я использую функцию slide:
Код
IC SelfRef slide(const Self& dir (vForward), const Self& norm (vNormal))
{
// non normalized
return mad(dir, norm, -dir.dotproduct(norm));
}
IC SelfRef mad(const Self& p, const Self& d, T m)
{
x = p.x + d.x*m;
y = p.y + d.y*m;
z = p.z + d.z*m;
return *this;
}
Всё в итоге работает замечательно, но - если
поверхность наклонена слишком сильно, и угол между ней и vForward
острый, то итоговый вектор инвертирует своё направление (скользит вниз). Есть ли способ модифицировать функцию так, чтобы итоговый вектор скользил преимущественно в ту сторону, в которую указывал vForward?
Кто не понял, о чём я говорю - представьте рикошет пули, только вместо отскока пуля скользит вдоль поверхности, об которую она ударилась.
(1) и (2) это то, как работает функция сейчас. (3) это то, чего я хочу добиться.