【NXOpen C#】向量的简单用法

平面内坐标摆正的思路

说明:通过获得平面的法向量,以及对应平面内最长的直线,两两垂直向量叉乘后获得与之垂直的方向向量。

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;

        }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值