从方向矢量锥

问题描述 投票:0回答:1

我有一个标准化的方向向量(从3d位置到光位置),我希望这个向量旋转一定角度,这样我就可以创建一个“锥形”。

我想通过使用方向矢量作为圆锥的中心来模拟圆锥跟踪,并创建X个样本以创建更多的光线来进行采样。

我想知道的基本上是背后的数学:

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

这似乎正是我正在寻找的东西。

math opengl glsl raycasting
1个回答
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))
© www.soinside.com 2019 - 2024. All rights reserved.