由一些角度的Perturb传染媒介

Myx*_*Myx 3 math geometry trigonometry vector

我在3D空间中有一个单位向量,其方向我希望在0到θ的范围内以某个角度扰动,向量的位置保持不变.我能做到这一点的方法是什么?

谢谢.

编辑:在考虑了我提出问题的方式后,似乎有点过于笼统.我将尝试使其更具体:假设矢量源自对象的表面(即球体,圆形,方框,线条,圆柱体,圆锥体).如果有不同的方法来为每个对象找到新的方向,那么为球体提供帮助就可以了.

编辑2:我打算在评论中输入这个,但它太多了.

所以我有orig_vector,我想在0和0之间的某个方向扰乱theta.的theta可以被认为是形成围绕我的向量的圆锥(具有theta为中心和锥体的一侧之间的角度),我希望以产生锥内的新载体.我可以在平面上生成一个与矢量相切的点,从而在点的方向上创建一个单位矢量,调用它rand_vector.此时,I orig_vector和t rand_vector是两个彼此垂直的单位矢量.

我生成我的第一个角,angle10和二皮之间,我旋转rand_vector周围orig_vectorangle1形成rand_vector2.我在线查找了一个资源,它说第二个角度angle2应该在0和sin(theta)(theta原始的"锥形"角度)之间.然后我围绕rand_vector2由和acos(angle2)之间的叉积定义的向量旋转.rand_vector2orig_vector

当我这样做时,我没有获得所需的结果.也就是说,当theta=0我仍然受到扰动的向量时,我希望得到orig_vector.如果有人能够解释角度的原因以及它们的原因,我将非常感激.

编辑3:这是最后的编辑,我保证=).所以我修复了我的错误,我上面描述的所有内容都有效(这是一个实现错误,而不是理论错误).但是,我关于角度的问题(即为什么是angle2 = sin(theta)*rand(),为什么是perturbed_vector = rand_vector2.Rotate(rand_vector2.Cross(orig_vector), acos(angle2)).非常感谢!

Boo*_*jum 8

这是我之前用于此类问题的算法.它在Ray Tracing News中有所描述.

1)使第三个向量垂直于另外两个构建正交基础:

cross_vector = unit( cross( orig_vector, rand_vector ) )
Run Code Online (Sandbox Code Playgroud)

2)在[0,1]中选择两个统一的随机数:

s = rand( 0, 1 )
r = rand( 0, 1 )
Run Code Online (Sandbox Code Playgroud)

3)设h是锥角的余弦:

h = cos( theta )
Run Code Online (Sandbox Code Playgroud)

4)修改球体上的均匀采样,以在+ Z周围的锥体中拾取随机向量:

phi = 2 * pi * s
z = h + ( 1 - h ) * r
sinT = sqrt( 1 - z * z )
x = cos( phi ) * sinT
y = sin( phi ) * sinT
Run Code Online (Sandbox Code Playgroud)

5)改变基础以围绕原始角度重新定向:

perturbed = rand_vector * x + cross_vector * y + orig_vector * z
Run Code Online (Sandbox Code Playgroud)