Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 三个J获取球体和线段的切线/交点_Three.js_Geometry - Fatal编程技术网

Three.js 三个J获取球体和线段的切线/交点

Three.js 三个J获取球体和线段的切线/交点,three.js,geometry,Three.js,Geometry,我有向量3 A和向量3 B: 我需要知道球面和线段AB的向量C交点 得到这个向量的最佳方法是什么 我只需要一个向量,不管是精度还是范围 可以将点C表示为点a和点B的仿射组合,如下所示: C=1-tA+tB 然后,向量OC(其中O是球体的中心)的大小应为R球体的半径。从这里你可以得到一个t的二次方程,你可以很容易地解出t。请注意,通常应获得两个t值,因为由A和B定义的无限线将与球体相交两次。因此,您应该只取介于0和1之间的t值。在某些情况下,当AB线与球体相切时,实际上只有一个根与二次方程的重复根

我有向量3 A和向量3 B:

我需要知道球面和线段AB的向量C交点

得到这个向量的最佳方法是什么

我只需要一个向量,不管是精度还是范围


可以将点C表示为点a和点B的仿射组合,如下所示:

C=1-tA+tB

然后,向量OC(其中O是球体的中心)的大小应为R球体的半径。从这里你可以得到一个t的二次方程,你可以很容易地解出t。请注意,通常应获得两个t值,因为由A和B定义的无限线将与球体相交两次。因此,您应该只取介于0和1之间的t值。在某些情况下,当AB线与球体相切时,实际上只有一个根与二次方程的重复根,而当AB线与球体不相交时,则根本没有实根。

在伪代码中

dAB[1] = B[1] - A[1]
dAB[2] = B[2] - A[2]
dAB[3] = B[3] - A[3]

rdAB = 1.0/sqrt(dAB[1]^2+dAB[2]^2+dAB[3]^2)

C[1] = A[1] + R*dAB[1]*rdAB
C[2] = A[2] + R*dAB[2]*rdAB
C[3] = A[3] + R*dAB[3]*rdAB 
其中dAB是从a到B的向量,R是球体的半径,rdAB是向量dAB的反长度