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()

 

 

posted on 2012-11-02 20:06  |残阳|露  阅读(495)  评论(0)    收藏  举报

导航