Revit中的视图坐标系

1.view和direction

屏幕右向为view.rightdirection其单位基矢量坐标表达为view.cropbox.transform.basisx

屏幕上向为view.updirection其单位基矢量坐标表达为view.cropbox.transform.basisy

屏幕指向"你"为view.viewdirection其单位基矢量坐标表达为view.cropbox.transform.basisZ

按照 right,up,view的右手系

观察者的眼睛位置的世界或者模型坐标为view.origin

2.view和transform

View.cropbox.transform.basis代表了这个view的视图坐标空间的三个正交单位基向量,而origin则对应其原点(0,0,0)

根据线性代数知识,

将这三个基向量按列放置组成变换方阵A,那么视图坐标空间里任意点p的坐标列向量左乘这个A再加上origin的世界坐标即可得到p的世界坐标表达

为了书写方便形式上,revit把transform改成了一个3x4的矩阵,前三列为三个基向量,第四列为origin的世界坐标,p点这一三维向量则添加一维"1"

于是我们可以从view.cropbox.transform.ofpoint(XYZ point)来返回视图坐标空间某点的世界坐标

问:如果我们要对view空间的物体进行ElementTransformUtil操作呢?

由于实际上是对location操作,而location是世界坐标的,所以要变回世界坐标,记view空间变换为A,我们要进行的变换为T

则view坐标的p经T变换后的view坐标为p'=A-1TAp

3.view和cropbox和outline

cropbox返回boundingboxXYZ

outline返回boundingboxUV

 

广大的世界坐标被cropbox裁剪,cropbox如何定义的呢?原来根据viewdirection的方向有前后两个与之正交的clipplane,而这两个裁剪面中间有一个投影面projectionplane,平行光线穿过前后两个clipplane形成的线路与其围成cropbox.cropbox投影到projectionplane上形成outline,这也正是isometric正交投影;如果不是平行光线而是从观测者(origin)眼睛出发,成pyramid状的perspective透视投影,则以前clipplane的前截面为基准,投影到后clipplane形成cropbox . 总之cropbox是一个平行六面体,outline为其在投影面上的投影.它们的max和min都是遵从视图坐标系,可以通过view.cropbox.transform转化到世界坐标系.值得注意的是转到outline时,有一个scale进行缩放,在自建视图比如view section时如果发现大小不符正是因为这一点.

 

顺带一提Identity指单位阵,api中经常可以看到Transform transform = Transform.Identity来初始化一个transform这其实可以类比string.Empty

4.创建viewSection类时对视图坐标系的理解

api创建viewSection类时都需要给一个boundingbox,我们为这个boundingbox添加tansform,依次赋予origin(世界坐标)和basis(i).我们根据添加的origin(世界坐标)basis决定的一个坐标空间来添加这个box.maxbox.min(注意origin在该空间是XYZ.Zero).

然后重点来了,ViewSection.CreateXXX()方法是如何使用boundingbox这个参数的呢?它将box的basisZ的反向inverse作为viewdirection,将box的basisY作为updirection,然后根据右手系定出rightdirection,将origin移动到boundingbox的lowerleftfront左下前点,所以你会发现建好后的viewsectioncropbox返回的boundingbox与你赋给它的boundingboxtransformorigin可能都不一样,不过他们的空间位置和大小却是一致的.

基于此,我们在考虑如何构建boundingbox的transform时,我们只需考虑viewdirection和updirection(一般为XYZ.basisZ),然后按照right up view的左手系定出rightdirection,然后把right和up赋给boundingbox的basisX和basisY,而basisZ由右手系得到.

如此我们一开始所考虑的viewdirection和updirection就是viewsection建好后的对应方向

你可能感兴趣的:(revit)