• DXF笔记:根据法向量,求出位置矩阵或坐标系


    前言

    任给一个法向量vNormal,以下代码就会给出一个唯一确定的坐标系。

    AcGeVector vNormal;
    AcGeMatrix3d mTmpMatrix;
    mTmpMatrix = mTmpMatrix.planeToWorld(vNormal);
    AcGePoint3d ptOriginTemp;
    AcGeVector3d xAxisTemp;
    AcGeVector3d yAxisTemp;
    AcGeVector3d zAxisTemp;
    mTmpMatrix.getCoordSystem(ptOriginTemp, xAxisTemp, yAxisTemp, zAxisTemp);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    探究

    数学上来说,一个法向量只能确定一个平面,那autocad是如何求出一个固定的坐标系的呢?应该是基于一个固定的规则或习惯求出,比如给一个法向量(0,0,1), 就可以得到俯视图的坐标系;给定一个法向量(0,-1,0),就可以得到前视图的坐标系等等。

    实现思路

    • 确定新坐标系X轴
      若传入的法向量vNormal与世界坐标系Zw(0,0,1)平行或几乎平行,直接用Yw(0,1,0)X vNormal即可求得新坐标系X轴;否则,就Zw(0,0,1)X vNormal求出新坐标系X轴。
    • 确定新坐标系Y轴
      vNormal X 新坐标系X轴即得

    实现代码

    static inline AcGeMatrix3d GetOCSMatrix(const AcGeVector3d& ocs)
    {
    	AcGeMatrix3d mRetMatrix;
    	static const double one_64th = 1.0 / 64.0;
    	if (ocs == AcGeVector3d(0, 0, 1))//不加这个,后续求出的也是一样的,此处仅仅是优化速度。
    	{
    		return mRetMatrix; 
    	}
    
    	AcGeVector3d ax(1, 0, 0), ay(0, 1, 0), az(0, 0, 1);
    	AcGeVector3d ocsaxis(ocs);
    	ocsaxis.normalize();
    	if (fabs(ocsaxis.x) < one_64th && fabs(ocsaxis.y) < one_64th) {
    		ax = ay.crossProduct( ocsaxis );//结合俯视图、仰视图理解
    	}
    	else {
    		ax = az.crossProduct( ocsaxis );//结合前后左右视图理解
    	}
    	ax.normalize();
    	ay = ocsaxis.crossProduct(ax);
    	ay.normalize();
    	mRetMatrix.entry[0][0] = ax.x;
    	mRetMatrix.entry[1][0] = ax.y;
    	mRetMatrix.entry[2][0] = ax.z;
    	mRetMatrix.entry[3][0] = 0;
    
    	mRetMatrix.entry[0][1] = ay.x;
    	mRetMatrix.entry[1][1] = ay.y;
    	mRetMatrix.entry[2][1] = ay.z;
    	mRetMatrix.entry[3][1] = 0;
    
    	mRetMatrix.entry[0][2] = ocsaxis.x;
    	mRetMatrix.entry[1][2] = ocsaxis.y;
    	mRetMatrix.entry[2][2] = ocsaxis.z;
    	mRetMatrix.entry[3][2] = 0;
    
    	mRetMatrix.entry[0][3] = 0;
    	mRetMatrix.entry[1][3] = 0;
    	mRetMatrix.entry[2][3] = 0;
    	mRetMatrix.entry[3][3] = 1;
    
    	return mRetMatrix;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    几个特殊的法向量

    vNormal = ( 0, 0, 1),俯视图坐标系x=(1,0,0), y=(0,1,0), z=(0,0,1)
    vNormal=(0, 0, -1),仰视图坐标系x=(-1,0,0), y=(0,1,0), z=(0,0,-1)
    vNormal=(1, 0, 0),右视图坐标系x=(0,1,0), y=(0,0,1), z=(1, 0, 0)
    vNormal=(-1,0,0),左视图坐标系x=(0,-1,0), y=(0,0,1), z=(-1, 0, 0)
    vNormal=(0,1,0),后视图坐标系x=(1,0,0), y=(0,0,1), z=(0,1,0)
    vNormal=(0,-1,0),前视图坐标系x=(-1,0,0), y=(0,0,1), z=(0,-1,0)

  • 相关阅读:
    实施主品牌进化战略(一):确立主品牌进化架构
    .net 7 上传文件踩坑
    如何挑选合适的文档外发加密系统,主要看这几点!
    QFramework引入Event
    我把问烂了的⭐MySQL⭐面试题总结了一下
    Android Stuido Gradle build编译报错原因排查
    QT简介、安装与运行
    设计模式学习心得 - 面向对象的设计思想
    YOLOv5代码解析(二)
    Vuex的搭建与使用
  • 原文地址:https://blog.csdn.net/s634772208/article/details/126648587