三个js圆赤纬(旋转到点)

时间:2015-07-22 08:06:40

标签: javascript math 3d three.js

我有2 THREE.Vector3() s。

我想在一个向量周围绘制circle并使用第二个向量作为切线。

我有圆几何的半径,即矢量之间的距离。

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

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

我可以使用THREE框架功能还是需要使用数学方法?

(我希望它应该是3D框架的一些核心功能)。

enter image description here

1 个答案:

答案 0 :(得分:0)

在3D矢量图形中,使用4x4 homogenous transform matrices

完成了一些技巧
  • 您可以创建矩阵并将其应用于整个几何体
  • 通常在gfx HW侧完成
  • 在你的情况下,你甚至不需要计算角度只计算基础向量

这是我的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);
  • radius r已在x,y基础向量内,因此无需乘以它