我在3D空间中有两组点。我想绘制一条穿过两组点中心的线,然后找到从该线到每个点的角度。从那里开始,我会根据它们两个角度的接近程度来匹配两组中的点。
我知道如何找到每组点的中心(只是将它们全部放在一起),我知道如何匹配它们(甚至考虑到它们将要包裹的事实),但我不会&#39 ; t知道如何找到从直线到点的角度。
基本上我说我希望所有的点都投射到一个平面上,该平面居中并垂直于贯穿中心的直线,我希望从该直线到该平面上的每个点的角度。
我希望我已经清楚了......我没有接受过很多关于这种事情的正式训练(有点让我想起几年前大学的Diff Eq),所以请问我是否#&# 39;可能会误用一个术语并使你感到困惑。
我认为我可以翻译任何其他语言的解决方案为我工作,因为我认为这主要是语言无关的数学,但我正在使用Three.JS,所以如果你的解决方案在javascript / with Three中工作.JS(这里是他们的Vector3 class documentation,只是让你知道它提供的帮助功能),这是最有帮助的。谢谢!
答案 0 :(得分:3)
通常,2个向量的 dot 乘积等于2个向量之间角度的余弦乘以两个向量的幅度(长度)。
dot( A, B ) == | A | * | B | * cos( angle_A_B )
接下来,2个单位向量的 dot 乘积等于2个向量之间角度的余弦,因为单位向量的长度为1。
uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )
在 three.js 中,所有计算都可以通过THREE.Vector3
的操作完成:
var a = new THREE.Vector3( ..... );
var b = new THREE.Vector3( ..... );
a.normalize();
b.normalize();
var cosAB = a.dot( b );
var angle_in_radians = Math.acos( cosAB );
如下面的评论所述,在 three.js 中有一个操作 .angleTo
,这简化了很多事情:
var angle_in_radians = a.angleTo(b);
如果您有3个点Pa
,Pb
,Pc
,Pd
,则定义从Pa
到Pb
的2行并形成{{1 } Pc
,然后可以按如下方式计算2个向量:
Pd