Rhino.python实时动态显示与鼠标捕捉 —像玩Processing一样玩Rhino.Python?

Rhino.Python平台是以静态建模为主的算法三维建模工具,很少有人会用它来作一些动态效果,因为在一般情况下使用Rhino.Python进行动态效果显示需要首先生成模型然后再删除之,这个过程会极大的影响速度,而且一般只能依靠写好的算法自动运行,与即时的鼠标或键盘事件互动也很困难。

不过还是有方法可循,虽然与Processing、cinder。openframwork等工具完全不可比拟。

最初从自带案例中的CustomGetPoint.py得到相关线索。Rhinocommon SDK可查询到Rhino.Display类下的DisplayPipeline类型可以在Rhino中进行比较简单的即时显示,虽说简单,就模型类型而言还是比较全面,点、线、面和基本曲面几何体都可不生成模型的情况下即时显示。Rhino本身的显示依靠OpenGL,因此速度尚可。缺陷便是这里面无法进行阴影、纹理着色和光源等高级显示效果。

clip_image001

DisplayPipeline类型可借助.net编程中的事件与委托(event,delegate)来调用DynamicDraw(动态显示)方法。DynamicDraw方法的第二个参数只能是Rhino.Input.Custom. GetPointDrawEventArgs。

在Rhinocommon SDK中可以查到Rhino.Input.Custom.GetPointDrawEventArgs类有Display方法,Rhino.Input.Custom.GetPointDrawEventArgs属于Rhino.Display.DisplayPipeline的成员。

clip_image002

因此就可以使用以下语法在Rhino视窗内进行即时显示:

point = Rhino.Input.Custom.GetPoint()

def func(sender,args):

  args.Display.DrawPoint(args.CurrentPoint,System.Drawing.Color.Blue)

point.DynamicDraw += func

point.Get()

以上point.DynamicDraw += func一句便是将gp.DynamicDraw方法与func函数进行事件委托,如果要取消委托可以用point.DynamicDraw -= func。

由于DynamicDraw方法只能向函数内传递一个参数,即GetPointDrawEventArgs,可以定义一个类来达到传递多个参数的方法,如以下例子

gp = Rhino.Input.Custom.GetPoint()

mypt = Rhino.Geometry.Point3d(1,2,3)

if( gp.Get() == Rhino.Input.GetResult.Point ):

  mypt = gp.Point()

  mypts = [mypt]

class MyGetPoint:

def __init__(self, pt, pts):

   self.point = pt

   self.points = pts

def DynDraw( self, sender, args ):

if( self.point!=None ):

for i in self.points:

         args.Display.DrawPoint(i,System.Drawing.Color.Blue)

myclass = MyGetPoint(mypt,mypts)

gp.DynamicDraw += myclass.DynDraw  

while( gp.Get() == Rhino.Input.GetResult.Point ):

   myclass.point = gp.Point()

   mypts.append(gp.Point())

   myclass.points = mypts

另外一个问题是取得鼠标事件,这个比较简单,其一本身GetPointDrawEventArgs就是一种鼠标事件,另外Rhino.Input.Custom.GetPointMouseEventArgs类型中有监听鼠标事件的方法,但是由于Rhino本身定义的鼠标右键为退出,因此只能采用左键和中键进行监听,至于键盘监听现在还没找到好办的方法,那些想在Rhino中玩游戏的最多只能用鼠标点点了。

以下为一个模拟点磁场线运动的例子,GIF显示卡大概是没有完全下载的原因,一共4000余根动态曲线,运行还是比较流畅,另外有两个研究过程中的例子和以上两个算法的完整代码。本研究仅是技术讨论范畴,并不代表建议用Rhino.Python来做Processcing的事情。使用这些代码请遵循非商业,署名,相同方式共享。

clip_image003

磁场线代码下载

其他代码下载

发表评论

电子邮件地址不会被公开。 必填项已用*标注