У меня есть единичный вектор в трехмерном пространстве, направление которого я хочу возмущать на некоторый угол в диапазоне от 0 до тета, при этом положение вектора остается неизменным. Как я могу это сделать?
Спасибо.
РЕДАКТИРОВАТЬ: После размышления о том, как я поставил вопрос, он кажется слишком общим. Я попытаюсь сделать это более конкретным: предположим, что вектор происходит от поверхности объекта (то есть сферы, круга, прямоугольника, линии, цилиндра, конуса). Если существуют разные методы для определения нового направления для каждого из этих объектов, тогда предоставление помощи для сферы - это нормально.
РЕДАКТИРОВАТЬ 2: Я собирался напечатать это в комментарии, но это было слишком много.
Итак, у меня есть orig_vector
, который я хочу возмущать в некотором направлении от 0 до theta
. theta
можно представить как формирующий конус вокруг моего вектора (с theta
, являющимся углом между центром и одной стороной конуса), и я хочу создать новый вектор внутри этого конуса. Я могу создать точку, лежащую на плоскости, касательной к моему вектору, и, таким образом, создать единичный вектор в направлении точки, назовем ее rand_vector
. В это время I orig_vector
и t rand_vector
представляют собой два единичных вектора, перпендикулярных друг другу.
Я генерирую свой первый угол, angle1
между 0 и 2pi, и поворачиваю rand_vector
вокруг orig_vector
на angle1
, образуя rand_vector2
. Я посмотрел ресурс онлайн, и он сказал, что второй угол, angle2
должен быть между 0 и sin(theta)
(где theta
- исходный угол "конуса"). Затем я поворачиваю rand_vector2
на acos(angle2)
вокруг вектора, заданного перекрестным произведением между rand_vector2
и orig_vector
.
Когда я делаю это, я не получаю желаемых результатов. То есть, когда theta=0
, я все еще получаю возмущенные векторы, и я ожидаю получить orig_vector
. Если кто-то может объяснить причину углов и почему они такие, как я, я был бы очень признателен.
РЕДАКТИРОВАТЬ 3: Это окончательное редактирование, я обещаю =). Поэтому я исправил свою ошибку, и все, что я описал выше, работает (это была ошибка реализации, а не ошибка теории). Тем не менее, мой вопрос об углах (то есть почему angle2 = sin(theta)*rand()
и почему perturbed_vector = rand_vector2.Rotate(rand_vector2.Cross(orig_vector), acos(angle2))
. Большое спасибо!