math - 给定法线向量,在 3D 空间中的 2D 磁盘上生成随机点

标签 math random 3d geometry linear-algebra

是否有一种简单有效的方法可以在“悬挂”在 3 维空间中的磁盘上生成随机(均匀分布)点?磁盘由其法线定义。

理想情况下,我想避免旋转矩阵,因为我不完全理解它们,而且我知道它们有问题。

到目前为止,我已经尝试生成一个 3D 单位向量并将其投影到磁盘平面上,这确实确保了该点位于磁盘内,但并不能保证它是均匀分布的。 我还尝试根据生成的向量长度的某个函数来缩放生成的向量,但无论如何我都无法获得均匀分布。

我有一个想法,涉及创建两个彼此垂直且与法线垂直的向量,以定义局部坐标系。然后我可以像二维一样在单位圆盘上生成一个点,并将结果转换回全局坐标系。这看起来会非常有效,因为它涉及一些预计算(我完全可以接受)并且之后只进行简单的计算(这是针对光线追踪器的,所以它会发生很多)。问题是,我不知道如何可靠地计算局部坐标系的基向量,同时避免共线性等可能的问题。

非常感谢任何帮助。

最佳答案

计算法线 n = (a,b,c) 的平面的正交基向量 u, v 的一个简单方法是找到绝对值最小的分量,并使 u 与该分量正交;其余的几乎如下。例如,如果第一个分量是绝对值最小的分量,您可以选择这些基向量:

u = (0, -c, b)                //  n·u = -bc+cb = 0

v = (b²+c², -ab, -ac)         //  n·v = ab²+ac²-ab²-ac² = 0, u·v = abc-abc = 0

关于math - 给定法线向量,在 3D 空间中的 2D 磁盘上生成随机点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19337314/

相关文章:

javascript - 多种形状的 3D 网格

algorithm - n ≠ Θ(logn) 吗?

algorithm - 销售排名算法

JavaScript 指数

r - 从 n 组数字中生成 x 个随机数

java - 计算泊松分布随机变量之和的概率

matlab - 将 3D 数据点转换为 matlab 中的标准化(2D)图形点

math - 球算术与区间算术

廉价而令人愉快的 rand() 替代品

3d - GPU:将浮点顶点坐标转换为定点。如何?