设置box的min和max只是设置box的范围大小。其中min和max的xyz方向的大小实际指的基于剖面视图坐标系。Box的原点和min,max可以确定位置关系;box的原点决定创建的剖面视图的原点。剖面视图的原点在剖面线上的一端。
设置一个从左往右看的剖面视图:
默认数值的情况下,box的min和maxbox的中心点Orgion是(0,0,0),此时原点:
从左往右看,右下角是剖面视图原点。Orgion- RightDirection*100+ViewDirection*100-UpDirection*100也等于min- RightDirection*100变成(-100,100,-100);
再来设置一下box范围:box的RightDirection 长度为10,UpDirection方向为20,ViewDirection反方向为30.矩阵原点与min点重合,所以剖面原点=矩阵原点- RightDirection *Height变成(0,10,0);
同理,下面这个设置 剖面原点=矩阵原点- RightDirection *Height变成(1,11,1);
那么可以设置box的min的X值使原点变成剖面视图的原点:
设置的box的矩阵的Z轴是X轴,那就是从左往右看,对于剖面而言,视图方向ViewDirection就是
-X轴(-1,0,0),视图的UpDirection就是原来的Z轴(0,0,1),右方向RightDirection就是-Y轴。
剖面的宽度Width,由box的X轴距离决定;剖面能看到的深度Depth,由box的Z轴距离决定;高度Height,Y轴距离决定。
一般需求是有个点,需要放在剖面视图中间的,现在将原点(0,0,0)显示在剖面视图中间
所以,要将一个点orgion放在设置的剖面中间,那么设置box的框的大小和原点位置是
确定视图的原点和视图box的大小之后,最重要的一点是,确定视图的坐标系。是否可以根据具体的要求决定剖面视图的XYZ坐标系,就是视图的RightDirection,UpDirection,ViewDirection,这三个属性。
要确定一个坐标系的xyz轴,至少需要知道其中的两个,假设我们指定的情况是,知道一个面的法向量和需要剖面视图的方向,实际我们知道两个垂直的向量了,可以得到一个合乎规则的xyz,但实际仍然定不了一个想要的视图坐标系。举个例子:
这个面的法向量向左,视图方向想要的是另一个箭头方向。计算另一个坐标方向是向上的,这个坐标系对于视图是不成立的,所以生成之后,视图坐标系的视图方向会变成反方向。
所以简单指定向量,通过计算得到的向量,不一定能构成坐标系。
程序中设置的参数:
生成的视图属性如下:
程序中设置的x与z轴被取反。
设置的坐标系,特别是视图方向,实际是与坐标系的Y轴相反的,
假设这是一个视图坐标系,视图方向实际是-y;
所以需要二次计算。先分为两种情况,剖面视图方向平行于Z轴(0,0,1)
不平行:
通过视图方向ViewDirection和面的法向量,计算一个垂直向量Y,判断Y与-Y与z轴角度关系,取与z轴角度更小的为视图UpDirection,再通过UpDirection绕ViewDirection顺时针转90度,得到RightDirection。由此得到一个视图的坐标系。
平行:
向上则与X轴(1,0,0)比较,向下则与-X轴(-1,0,0)比较。
通过lookup查看视图的数据:
这就实现一个需求,将指定的点放在剖面视图的中心位置,指定了显示的范围大小。且明确了视图的坐标系。
下面两个是相反方向的模型线和对应生成的剖面视图。
整个过程最难理解的部分是,视图的坐标系与程序中设置的sectionBox的矩阵坐标系之间的关系。并不是一一对应的关系。sectionBox的z轴是视图方向的反方向。以此为依据,构件合乎规则xyz坐标系,才能使视图的坐标系变成需要的。
最后还有一点不理解的是,视图的Cropbox的min和max为什么程序设定的不一样?这个是有什么决定的?
查找api得知cropBox即裁剪框,框的X方向在屏幕上右侧;Y,向上;Z,朝向用户。这个是和视图方向一致的。
所以和设置的sectionBox不是同一个对象。设置的是z轴与裁剪框z轴相反,故设置的是0-30,裁剪框是-30-0;x,y轴是从视图原点开始计算的,所以是0-10,0-20;
在研究默认设置的剖面视图:
默认的数据,不设置sectionBox,那么就是单位矩阵,原点是000,长宽深度都是200.生成的视图,原点在100,-100,-100是一个从下往上看的视图,视图的UpDirection默认是y轴 RightDirection是-x轴。