2015-07-22 95 views
0

我有2 THREE.Vector3() s。三個js圓偏角(旋轉點)

我想畫一個circle圍繞一個矢量,並使用第二個矢量作爲切線。

我有圓弧幾何的半徑是向量之間的距離。

我怎樣才能旋轉圈觸摸第二個向量?

我怎樣才能獲得弧度的圓(赤緯)旋轉?

我可以使用三種框架功能還是需要使用數學方法?

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

enter image description here

+0

什麼是你不知道的硬件計算角度或不知道的問題如何計算旋轉?你也使用變換矩陣還是自己變換座標?另請參閱[glCircle3D](http://stackoverflow.com/a/25182327/2521214)它可能會幫助 – Spektre

+0

我要求正確的方法。我可以在三角形上使用測角公式,但是我問三維是否可以通過某個函數來完成它,例如getAngle(a,b,c)等等...... 將pythagoras formules寫入js源代碼是無效的。 – Martin

回答

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,也沒有,POS於矩陣的適當字段
  • 並使用半徑爲1
  • 圓幾何
  • 你可以看到沒有atan2acos(dot(v1,v2))需要
  • 只是簡單的交叉產品就足夠了......
  • 礦使用礦載體文庫的代碼
  • 因此只需像
  • vector_ld(a,x,y,z)一個[] = {X,Y,Z}
  • vector_mul(a,b,c)編寫功能的[] = B [] XC []
  • vector_mul(a,b,c)一個[] = b [] * C
  • vector_add(a,b,c)一個[] = b [] + C []
  • vector_sub(a,b,c)一個[] = b [] - C []
  • vector_len(a,b,c) a [] = b [] * c/| b [] |
  • 圓座標很簡單:p=pos+x*cos(alpha)+y*sin(alpha);
  • 半徑r裏面已經x,y基向量所以沒有必要通過將其乘以