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))