Atamai软件包学习之RenderPane坐标系变换(四)
RenderPane是一个3D显示的类, 它可以包含窗口部件(如按钮), 3D类型的指针形状,而且主要是用来关联与绘制ActorFactories的。
每个RenderPane和vtk的类vtkRender是1:1对应得关系。一个PaneFrame可以包含多个RenderPane,通常的用法师一个PaneFrame只包含一个RenderPane。
在了解RenderPane的坐标系变换之前,先了解下欧式几何和透视几何。在欧式空间里,两条共面的平行线无法相交的,然而在透视几何里,他们最终在地平线相交到了一起,也就是说它们在无限远处相交。这种现象就是透视。因此,数学家August Ferdinand Mobius(就是著名的莫比乌斯)发明了齐次坐标,从而在透视空间中计算图形和几何。齐次坐标是一种将N位坐标表示为N+1个数字的方式。

欧式空间中,两条平行线为
AX+BY+Cw = 0
AX+BY+Dw = 0
在欧式空间中,如果C≠D,这个方程组就是无解的,永远不会相交在远处的一点。如果C=D,这两条线就成了同一条。两个等式左右相减,可以得到我们要求(C-D)w=0,因此w=0. 所以,我们的解就是(x,y,0)。这两条线相交于(x,y,0),这时一个无穷远处的点。
在实际开发中,可以从RenderPane的 HandEvent方法中截获窗口事件,做自己的响应事件,例如获得鼠标移动的点,然后连成一条直线显示在窗口上。
一般HandEvent返回的Event包含event.pane及Display坐标系里面的值(以renderPane的左下角为0,0点),我们可能需要去转换成其它坐标系:
由此可以定义一个坐标系转换工具类CoordinateConvertUtility,专门做坐标系转换:
#定义齐次坐标系标量系数 CoordinateHomogeneousScalar = 1.0 ## @details 坐标系转换工具类 class CoordinateConvertUtility: # @details 转换显示坐标系到世界坐标系 @staticmethod def ConvertDisplayToWorld(displayPosition, renderPane): render = renderPane.GetRenderer() render.SetDisplayPoint(displayPosition[0], displayPosition[1], CoordinateHomogeneousScalar) render.DisplayToWorld() worldPosition = render.GetWorldPoint() worldPosition = [worldPosition[0]/worldPosition[3], worldPosition[1]/worldPosition[3], worldPosition[2]/worldPosition[3]] return worldPosition # @details 转换世界坐标系到显示坐标系 @staticmethod def ConvertWorldToDisplay(worldPosition, renderPane): render = renderPane.GetRenderer() render.SetWorldPoint(worldPosition[0]*CoordinateHomogeneousScalar, worldPosition[1]*CoordinateHomogeneousScalar, worldPosition[2]*CoordinateHomogeneousScalar, CoordinateHomogeneousScalar) render.WorldToDisplay() return render.GetDisplayPoint()
浙公网安备 33010602011771号