2016-09-09 4 views
0

У меня есть вектор нормализованного направления (от 3d позиции до светлого положения), и я хотел бы, чтобы этот вектор поворачивался под некоторым углом, поэтому я могу создать «конус».Конус от вектора направления

Id нравится моделировать трассировку конуса с использованием вектора направления в качестве центра конуса и создавать X количество образцов для создания большего количества лучей для образца.

То, что я хотел бы знать, в основном по математике за:

https://docs.unrealengine.com/latest/INT/BlueprintAPI/Math/Random/RandomUnitVectorinCone/index.html

который, кажется, делать именно то, что Im ищет.

ответ

1

1) Производите произвольный вектор P, перпендикулярный к вектору направления D. Вы можете выбрать компонент с максимальной величиной, обменять его с помощью компонента средней величины, нейтрализовать его и произвести минимальную составляющую нуля.

Например, если z- компонент является максимальным и у-компонент минимален, вы можете сделать такой P:

D = (dx, dy, dz) 
p = (-dz, 0, dx) 
P = Normalize(p) //unit vector 

2) Сделать вектор Q перпендикулярна как D и P через векторное произведение:

Q = D x P //unit vector 

3) Генерировать random point in the PQ plane disk

RMax = Tan(Phi) //where Phi is cone angle 

    Theta = Random(0..2*Pi) 

    r = RMax * Sqrt(Random(0..1)) 

    V = r * (P * Cos(Theta) + Q * Sin(Theta)) 

4) Нормализация вектор V

Обратите внимание, что распределение сферы на шаровом отрезке слегка неоднородно (оно равномерно на плоском диске). Существуют методы генерации uniform distribution on the sphere, но некоторые работы, необходимые для их применения к сегменту (моя первая попытка до внесения изменений была неправильной).

Edit: Модификация сделать распределение сферы неоднородный (не проверено) тщательно

RMax = Tan(Phi) //where Phi is cone angle 
Theta = Random(0..2*Pi) 
u = Random(Cos(Phi)..1) 
r = RMax * Sqrt(1 - u^2) 
V = r * (P * Cos(Theta) + Q * Sin(Theta)) 

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

  • Нет связанных вопросов^_^