2016-08-07 3 views
0

Я знаю, как проверить угол между raycas (Vector3.Angle (hit.normal, -transform.forward)), но моя проблема в том, что он всегда возвращает меньший угол (я знаю, что это математически правильно, это просто не то, что я хочу). Я использую его, чтобы определить, на какой стороне должен стоять мой автомобиль. Трудно объяснить, поэтому я буду использовать картинку: raycast Эти два raycasts оба будут возвращать одинаковый угол, и я хочу, чтобы один на 45 * и другой -45 *. На самом деле мне не нужно точное значение, 1 и -1 тоже хорошо (мне нужно знать только ту сторону, а не точный угол).Как проверить угол между raycast и поверхностью?

+0

это невероятно сложно. Я бы просто нашел другой способ. например, тривиально проверить, находится ли «левый» (или «запад» - или любой другой), что легко. – Fattie

+0

Можете ли вы объяснить это немного больше? Проблема в том, что эту стену можно вращать в любом направлении, поэтому я полагаю, что это не сработает. –

ответ

1

Я не совсем уверен, если это поможет вам с вашей проблемой, но, глядя на вашем примере это может работать для вас:

pic

Когда смотришь на модифицированном картину, я добавил вектор U и назвали красные векторы, где LR) и указатель со стены (точка попадания, обозначенная вертикальными линиями) к прямоугольнику. Вектор U - это вектор фиксированного направления, связанный с вашей стеной (поэтому он не изменяется во время выполнения).

Теперь с L и U (или R и U), вы можете определить, находится ли луч происхождения за или перед точки попадания, используя скалярное произведение.

В этом примере, что дает:
Vector3.Dot(L, U) < 0
Vector3.Dot(R, U) > 0

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

+0

Отличная идея, но я действительно не знаю, как связать какое-то векторное остроумие моих стен. Вы знаете, как это сделать или это просто математическое решение? –

+0

это может быть довольно легко, если вы выровняете свою модель стены с ее локальной осью взглядов, которая указывает справа (например). используя transform.right, тогда будет дана проекция мирового пространства локальной (в конечном счете повернутой) оси, указывающей вправо. используйте это как ваш вектор U – TheDjentleman

+0

Спасибо! Это решает мою проблему. Если кто-то захочет использовать это, вам придется использовать Vector3.Dot, а не Mathf.Dot. –

Смежные вопросы