我有2 THREE.Vector3()
s。
我想在一个向量周围绘制circle
并使用第二个向量作为切线。
我有圆几何的半径,即矢量之间的距离。
如何旋转圆圈以触摸第二个矢量?
如何以弧度为单位获得圆的旋转(赤纬)?
我可以使用THREE框架功能还是需要使用数学方法?
(我希望它应该是3D框架的一些核心功能)。
答案 0 :(得分:0)
在3D矢量图形中,使用4x4 homogenous transform matrices
完成了一些技巧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
定义正交坐标系atan2
或acos(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
基础向量内,因此无需乘以它