由于笔者本身并不是CS背景,在此先抱歉。以下很多内容,可能会是用了一些较为笨的方法,但也算是这段时间摸索出来的一些小结果,如果有错误,还希望各位大神能够指出。由于罗大哥和笔者,主要在做城市计算方面的平台开发,刚开始基于grasshopper做了一些小型的demo。后来当计算的城市系统逐渐复杂的时候,开始发现它支撑不了,所以我们解决的方法是将平台移植到unity上,但是unity里的mesh面搭建可能会是一个比较繁琐的过程,远没有rhino来得方便和快捷,所以我们考虑的方法是将Rhino和unity打通。以下,就是我们如何打通rhino和unity的方式介绍。
首先,在Rhino官网上,主要讲了如何使用Rhino. compute service, 目的是,允许通过云(在这里,用的是AWS),通过REST API访问Rhino的几何库,可在Web服务中嵌入Rhino高级几何计算。那如何搭建这个环境,就成了最重要的第一步。在这里,我们主要用的库是,Rhino Compute.cs + Rhino3dmIO.desktop。
在这篇小短文里,我们基于Pycharm来演示如何做从外部调用Rhino库。在这里,首先要解释的是,在这两个库里,Rhino3dm有大部分的几何生成,但主要的计算部分都是在compute_Rhino3dm里,笔者用了两种数据处理方式来解决计算的问题。第一种,是将数据上传到云服务器,再返得回来。第二种,是在本地搭建一个服务器,直接在本地完成计算。
安装方式(需要基于3.7 python):

第一种(前三步都较为常规,可以跳过):
第一步,较为常规,写下20个点,存进Rhino里,这时候,还不需要用到compute_rhino_3dm


第二步,基于这些点,做圆,存入Rhino


第三步,接下来,要做bool运算,将重叠的圆进行BooleanUnion,在rhino3dm,没有关于boolean的函数,所以需要:
- 引入compute_rhino3d,这时候要添加进authToken
-
得出来的线,还需要经过rhino3dm.CommonObject.Decode一遍,才能转成rhino能读取的文件
image.png
image.png
第四步
-
挤出线
image.png
image.png
第五步
- 需要先将extrusion转化为brep
-
利用compute_rhino3d.Mesh.CreateFromBrep,将mesh面转化过去
image.png

结论:
- 由于大部分web端或者unity,都只认mesh曲面,所以需要尝试如果将nurbs转成mesh后,需要多长时间,是不是能符合需求。
- 但是,用云服务器的方法,导致转成Mesh的时长约50s,这就意味着,如果要做实时的话,这个速度完全不能及时响应,需要另谋出路,这就引出了第二种方法,在本地建立一个服务器。
第二种:
[https://github.com/mcneel/compute.rhino3d#rhinocommonrest]
第一步:
-
一定要有Rhino WIP, 然后按照图示,进入lastest build,并下载compute-247.zip
image.png
image.png
第二步:
-
可以尝试该路径,打开compute.fronted.exe,大概率不能运行,因为还没有指定端口
image.png
第三步:
- 以管理者权限打开PowerShell
- 输入,
For HTTP, netsh http add urlacl url="http://+:8081/" user="Everyone".
(github上写的是80,但不应该是80,端口80应该是用于其他服务)
For HTTPS, netsh http add urlacl url="https://+:443/" user="Everyone". - 如果尝试后,再打开compute.fronted.exe,并没有报错,则已经连上。但如果报错,可以尝试去查看端口占用情况,将被占用的端口强制关闭。
-
如果在web端,输入 127.0.0.1:8081/version,能显示如下
image.png
-
-
如果在web端,输入 127.0.0.1:8081/sdk,能显示如下
image.png
-
-
则证明,已经顺林搭建好本地服务器,这时候,在Pycharm里面加入访问地址,就可以快速进行运算
image.png
结论:
- 搭建好本地服务器之后,再使用compute_rhino3d,速度达到了1-2s,这样的速度,还算是能接受。可以用如下方式,将Rhino几何方法转移进其他平台。
在这里,我们的平台是unity,所以还是以unity有例。所以,跟各位大神说说看,我们的思路。
第一步,需要为unity搭建好环境
- 我们需要将unity的环境换成是.Net 4.x, Edit->Project Setting ->Player-> Other Setting->configuration
image.png
第二步. 开始加入各种插件
1)在NuGet里面下载,Rhino包: [https://www.nuget.org/]
image.png
2)转成zip,拿出里面文件,librhino3dmio_native.dll,然后进入unity,勾选editor+standalone
image.png
image.png
3)拿出里面文件,Rhino3dmIO.dll
image.png
image.png
-
进入unity asset store,导入json.net
image.png - 进入rhino compute service wip, 下载RhinoCompute.cs

现状:

第三步:开始写内容
1. 因为本文,不是个unity教程,所以在unity部分,简略地带过。如果有兴趣的话,可以进github里面去下载源码:https://github.com/alphonse-lin/connect_with_rhino-unity,缩略图如下:



- 逻辑图:
-
注意点:
1)将authToken和材质都拿出来做为一个赋值位
image.png
2)可在unity里面生成rhino文件,可以为之后的procedural modeling奠定基础,比如WCF(波函数坍缩算法)

-
封装成桌面端,也一样可以进行计算和交互
image.png
- 潜力
1)基于unity强大的跨平台能力,可以将rhino作为计算部分,其交互界面托管于web或android /iOS app,将受众范围扩大
2)同时,unity里面的粒子系统,可以用来做更多种系统的模拟。可以解决rhino里,风环境模拟的巨大卡顿情况,以及unity的强大交互系统。
3)unity与其他软件/包的兼容性,高过Rhino + Grasshopper,可以基于此去做更多开发
4)之前,我们尝试将Rhino里与MySQL做数据连接,可行,但是效率不是很高。转到unity后,其对数据库的兼容性和灵活性高于Rhino(可能因为我们不够了解Rhino和数据库,才会这么觉得,如果大神们有更好的方法,很希望能向你们多多请教)。
5)unity其实也可以和rhino进行实时交互,比如通过改变gh的参数,来改变输入unity的模型。在这个方面里,可以研究下裕翔大神的网站,通过UDP将unity和Rhino进行连接。
6)当然,这一切,都不是因为Rhino不强,只是因为针对的领域不一样,Rhino依旧强大。
结语:
1)基于这次的小小探索中,很幸运地能解决我们最初的问题,Rhino和GH可能比较难成为一个面向大众的简易交互界面,转移到unity之后,情况有所好转。当然,如果是做一个小Demo,Rhino和GH是特别棒的平台。
2)由于我们本身技术和见解有限,以上的方式可能是我们能想到的,unity与rhino链接比较成功的一个方式,如果之后大神们有更好的链接方法,希望能有更多的交流。
3)特别感谢Junichiro Horikawa,如果没有他,就不会有这篇文章。有兴趣的人,可以去关注他的youtube channel,可以学到特别多东西。
4)很抱歉,以各小点的形式写完这篇文章。再有,由于笔者本身的不专业性,在解释流程和专业术语的时候,可能会有一定的偏颇,在这里,再次抱歉,如果有错误,希望各位大神能指出。
相关链接:
https://www.youtube.com/playlist?list=PL6W3lurecOfzuN7HTHZmt0geJX95-PpE-



















