三个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 的圆形几何体
- 如您所见,不需要
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
个基向量内,所以不需要乘以它
我有 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 的圆形几何体
- 如您所见,不需要
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[] * cvector_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
个基向量内,所以不需要乘以它