在追踪光线时,通常需要在半球内生成一个随机矢量,该矢量与原始矢量偏离某个给定角度。在互联网上,这个问题没有明确而详细的答案。虽然我数学不是很强,但我还是想了解一下是怎么回事,而不是随便拿一个现成的公式。
再次,简单介绍一下问题的本质:
有一些向量,有一些角度(通常在这种情况下它被称为立体角,但我可能是错的),你需要选择一些在这个角度内的随机向量。角度可以全部为180度,并覆盖整个半球。
我知道这项任务与世界一样古老,但是,我仍然希望有人能仔细研究一下愚蠢的人道主义者是如何正确完成这项任务的。而且,你可以从数学的角度给出最优化的例子,也可以从代码的角度给出最优化的例子。他们经常不同。谢谢你。
首先,我们生成一个垂直于给定的向量
A为此,我们找到最大和第二大的组件
A。让这个A.Y和A.Z。现在让我们创建一个向量
B = (0, A.Z, -A.Y)- 即 将最小分量设置为零,然后交换两个大分量并更改其中一个分量的符号。可以看出,标量积A.dot.B等于零,即 向量是垂直的。C = A x B现在让我们使用叉积创建另一个向量。它垂直于A和B。归一化
B和С(除以长度)fi在范围内选择一个随机角度0..2*Pi并创建一个向量结果是一个随机单位向量,它位于垂直于
A现在我们选择一个随机角度
theta(в пределах этого самого угла即最大Pi/2或小于)并制作所需的向量(是的,A归一化)