来自方向向量的锥体
Cone from direction vector
我有一个归一化的方向向量(从 3d 位置到光线位置),我希望这个向量旋转某个角度,这样我就可以创建一个 "cone"。
我想通过使用方向向量作为圆锥体的中心来模拟圆锥体追踪,并创建 X 数量的样本以创建更多的光线来进行采样。
我想知道的基本上是背后的数学:
https://docs.unrealengine.com/latest/INT/BlueprintAPI/Math/Random/RandomUnitVectorinCone/index.html
这似乎正是我想要的。
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))
我有一个归一化的方向向量(从 3d 位置到光线位置),我希望这个向量旋转某个角度,这样我就可以创建一个 "cone"。
我想通过使用方向向量作为圆锥体的中心来模拟圆锥体追踪,并创建 X 数量的样本以创建更多的光线来进行采样。
我想知道的基本上是背后的数学:
https://docs.unrealengine.com/latest/INT/BlueprintAPI/Math/Random/RandomUnitVectorinCone/index.html
这似乎正是我想要的。
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))