三个js圆偏角(旋转到点)

three js circle declination (rotation to point)

我有 2 THREE.Vector3()s .

我想围绕一个向量画一个 circle 并使用第二个向量作为切线。

我有圆几何的半径,它是向量之间的距离。

如何旋转圆圈以接触第二个矢量?

如何获得以弧度为单位的圆的旋转(偏角)?

我可以使用三个框架函数还是需要使用数学方法?

(希望是3D框架的一些核心功能)

在 3D 矢量图中,

的技巧
  • 您创建矩阵并将其应用于整个几何体
  • 这通常在 gfx 硬件端完成
  • 在您的情况下,您甚至不需要计算角度,只需计算基向量

这是我的glCircle3D in C++/OpenGL

void glCircle3D(double *pos,double *nor,double r,bool _fill)
    {
    int i,n=36;
    double a,da=divide(pi2,n),p[3],dp[3],x[3],y[3];
    // set x to something not parallel to normal vector
         if (fabs(nor[0]-nor[1])>1e-6) vector_ld(x,nor[1],nor[0],nor[2]);
    else if (fabs(nor[0]-nor[2])>1e-6) vector_ld(x,nor[2],nor[1],nor[0]);
    else if (fabs(nor[1]-nor[2])>1e-6) vector_ld(x,nor[0],nor[2],nor[1]);
    else                       vector_ld(x,1.0,0.0,0.0);
    vector_mul(x,x,nor); // x=cross(x,nor)
    vector_mul(y,x,nor); // y=cross(x,nor)
    vector_len(x,x,r);   // x=r*x/|x| ... r is scalar
    vector_len(y,y,r);   // y=r*y/|y| ... r is scalar
    if (_fill)
        {
        glBegin(GL_TRIANGLE_FAN);
        glVertex3dv(pos);
        }
    else glBegin(GL_LINE_STRIP);
    for (a=0.0,i=0;i<=n;i++,a+=da)
        {
        vector_mul(dp,x,cos(a)); vector_add(p,pos,dp);
        vector_mul(dp,y,sin(a)); vector_add(p,p  ,dp);
        glVertex3dv(p);
        }
    glEnd();
    }
  • nor 是圆法线(在你的例子中是第二个向量)
  • pos 是圆心位置(在你的例子中是 0,0,0)
  • r 是半径(在你的情况下你的第一个向量的大小)
  • x,y 向量是具有 nor 定义正交坐标系的基向量
  • 如果你想构造变换矩阵,那么只需将 x、y、nor、pos 复制到矩阵的适当字段
  • 并使用半径为 1 的圆形几何体
  • 如您所见,不需要 atan2acos(dot(v1,v2))
  • 只需简单的叉积就足够了...
  • 我的代码使用我的向量库
  • 所以你只需要编写像
  • 这样的函数
  • vector_ld(a,x,y,z) a[]={ x,y,z }
  • vector_mul(a,b,c) a[]=b[] x c[]
  • vector_mul(a,b,c) a[]=b[] * c
  • vector_add(a,b,c) a[]=b[] + c[]
  • vector_sub(a,b,c) a[]=b[] - c[]
  • vector_len(a,b,c) a[]=b[]* c / |b[]|
  • 圆坐标很简单:p=pos+x*cos(alpha)+y*sin(alpha);
  • 半径 r 已经在 x,y 个基向量内,所以不需要乘以它