平面内坐标摆正的思路
说明:通过获得平面的法向量,以及对应平面内最长的直线,两两垂直向量叉乘后获得与之垂直的方向向量。
1、已知两个垂直向量z\x,获得y的方向向量
a*b = (aybz - azby, azbx - axbz, axby - aybx)
Vector3d fzVec = AskFaceVector3d(faceTag, point3d);
fxVec = new Vector3d(points1[0] - points2[0], points1[1] - points2[1],
points1[2] - points2[2]); //最长直线的向量
fyVec = new Vector3d(
(fzVec.Y * fxVec.Z) - (fzVec.Z * fxVec.Y),
(fzVec.Z * fxVec.X) - (fzVec.X * fxVec.Z),
(fzVec.X * fxVec.Y) - (fzVec.Y * fxVec.X)); //求垂直于两个垂直向量的向量
2、已知面的法向量,通过初始化方式获得x、y方向的方向向量
这种情况主要针对平面上不包含直线的场景,这时只能依赖平面的法向量获取x,y的方向向量,Uf函数 Mtx3.InitializeZ 可以在此场景使用
int type, subtype;
theUfSession.Obj.AskTypeAndSubtype(faceTag, out type, out subtype);
if (type == 70 && subtype == 2) //如果面是平面
{
//初始化矩阵
double[] xAxis = { 0, 0, 0 };
double[] yAxis = { 0, 0, 0 };
double[] zAxis = { fzVec.X, fzVec.Y, fzVec.Z };
double[] mtx = new double[9];
theUfSession.Mtx3.InitializeZ(zAxis, mtx);
theUfSession.Mtx3.XVec(mtx, xAxis);
theUfSession.Mtx3.YVec(mtx, yAxis);
fxVec = new Vector3d(xAxis[0], xAxis[1], xAxis[2]);
fyVec = new Vector3d(yAxis[0], yAxis[1], yAxis[2]);
}
3、对坐标系进行绕轴的旋转方法
这里通过 SpecifyOrientation 控件获得当前的点与向量,然后旋转该坐标系,因为此控件没封装Z的向量,所以需要初始化的方式获得z方向的向量,然后通过Mtx3.RotateAboutAxis 函数获得旋转矩阵,将坐标矩阵与旋转矩阵相乘后,得到旋转后坐标的矩阵,在使用方法获得其轴的方向向量。
1、对于坐标原点没有变化的旋转,使用MXT3内的旋转函数即可实现功能
2、对于旋转时改变了坐标点位置的,以及变化比例的,就需要使用MTX4内的方法
/// <summary>
/// 坐标轴旋转90°
/// </summary>
/// <param name="manip"></param>
public static void RotateCoordinateZAxis(SpecifyOrientation manip)
{
UFSession theUfSession = UFSession.GetUFSession();
//初始坐标化矩阵
double[] xAxis = { manip.XAxis.X, manip.XAxis.Y, manip.XAxis.Z };
double[] yAxis = { manip.YAxis.X, manip.YAxis.Y, manip.YAxis.Z };
double[] zAxis = {0.0, 0.0, 0.0};
double[] mtx = new double[9];//坐标的矩阵
theUfSession.Mtx3.Initialize(xAxis, yAxis, mtx);
theUfSession.Mtx3.ZVec(mtx,zAxis);
double rotate = Math.PI/2;
double[] rMtx3 = new double[9];//旋转矩阵
theUfSession.Mtx3.RotateAboutAxis(zAxis, rotate, rMtx3);
double[] resultMtx3 = new double[9];
theUfSession.Mtx3.Multiply(rMtx3, mtx, resultMtx3);//矩阵相乘
double[] fxVec = { 0.0, 0.0, 0.0 };
double[] fyVec = { 0.0, 0.0, 0.0 };
theUfSession.Mtx3.XVec(resultMtx3, fxVec);
theUfSession.Mtx3.YVec(resultMtx3, fyVec);
Vector3d fxVec3d = new Vector3d(fxVec[0], fxVec[1], fxVec[2]);
Vector3d fyVec3d = new Vector3d(fyVec[0], fyVec[1], fyVec[2]);
manip.XAxis = fxVec3d;
manip.YAxis = fyVec3d;
}