给定3D空间中的一条线,我如何找到从它到一个点的角度?

时间:2017-10-15 00:18:05

标签: javascript math 3d three.js geometry

我在3D空间中有两组点。我想绘制一条穿过两组点中心的线,然后找到从该线到每个点的角度。从那里开始,我会根据它们两个角度的接近程度来匹配两组中的点。

我知道如何找到每组点的中心(只是将它们全部放在一起),我知道如何匹配它们(甚至考虑到它们将要包裹的事实),但我不会&#39 ; t知道如何找到从直线到点的角度。

基本上我说我希望所有的点都投射到一个平面上,该平面居中并垂直于贯穿中心的直线,我希望从该直线到该平面上的每个点的角度。

我希望我已经清楚了......我没有接受过很多关于这种事情的正式训练(有点让我想起几年前大学的Diff Eq),所以请问我是否#&# 39;可能会误用一个术语并使你感到困惑。

我认为我可以翻译任何其他语言的解决方案为我工作,因为我认为这主要是语言无关的数学,但我正在使用Three.JS,所以如果你的解决方案在javascript / with Three中工作.JS(这里是他们的Vector3 class documentation,只是让你知道它提供的帮助功能),这是最有帮助的。谢谢!

1 个答案:

答案 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 )

dot A B


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个点PaPbPcPd,则定义从PaPb的2行并形成{{1 } Pc,然后可以按如下方式计算2个向量:

Pd