我有一个标准化的方向向量(从3d位置到光位置),我希望这个向量旋转一定角度,这样我就可以创建一个“锥形”。
我喜欢使用方向矢量作为圆锥的中心来模拟圆锥跟踪,并创建X个样本以创建更多光线来进行采样。
我想知道的基本上是背后的数学:
https://docs.unrealengine.com/latest/INT/BlueprintAPI/Math/Random/RandomUnitVectorinCone/index.html
这似乎正是我正在寻找的。 p>
答案 0 :(得分:1)
1)制作任意向量P,垂直于方向向量D. 您可以选择具有最大幅度的组件,将其与中等大小组件交换,取消它,并使最小幅度组件为零。
例如,如果z-分量是最大的并且y分量是最小的,那么你可以做出这样的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,但需要将一些工作应用到段(我在编辑之前的第一次尝试是错误的)。
编辑:进行球体均匀分布的修改(未经过彻底检查)
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))