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

2024-04-16

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

我知道如何找到每组点的中心(只需将它们平均在一起)并且我知道如何将它们匹配(甚至考虑到它们会环绕的事实),但我不知道如何找到从线到点的角度。

基本上我是说我想要将所有点投影到一个以穿过中心的线为中心并垂直于该线的平面上,并且我想要从该线到该平面上每个点的角度。

我希望我已经说清楚了......我在这方面没有接受过太多正式培训(有点让我想起几年前大学时的 Diff Eq),所以请询问我是否可能误用了一个术语并感到困惑你。

我想我可以翻译任何其他语言的解决方案来为我工作,因为我认为这主要只是与语言无关的数学,但我正在使用 Three.JS,所以如果你的解决方案在 javascript/with Three.JS 中工作(这是他们的)Vector3 类文档 https://threejs.org/docs/index.html#api/math/Vector3,这样您就知道它提供了哪些辅助函数)这将是最有帮助的。谢谢!


一般来说dot2 个向量的乘积等于cosine两个向量之间的角度乘以两个向量的大小(长度)。

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 

由此可见,dot2 个单位向量的乘积等于cosine两个向量之间的角度,因为单位向量的长度为 1。

uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )

In *three.js* all the calculations can be done by the operations of a [`THREE.Vector3`][2]:
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 );

As mentioned in the comment below, in *three.js* there is an operation **`.angleTo`**, which simplifies the things a lot:
var angle_in_radians = a.angleTo(b);

If you have 4 points `Pa`, `Pb`, `Pc`, `Pd`, which define 2 lines from `Pa` to `Pb` and form `Pc` to `Pd`, then the 2 vectors can be calculated as follows:
var Pa = new THREE.Vector3( ... );
var Pb = new THREE.Vector3( ... );
var Pc = new THREE.Vector3( ... );
var Pd = new THREE.Vector3( ... );

var a = new THREE.Vector3();
a.copy( Pb ).sub( Pa );

var b = new THREE.Vector3();
a.copy( Pd ).sub( Pc );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定 3D 空间中的一条线,如何找到从它到一点的角度? 的相关文章

随机推荐