【版权声明】
| 作者:罗维祯 & iphone
| 本文的图片来源于网络
| 如需转载请联系大水牛平台
| 如果觉得文章不错,欢迎分享
内容概要
由于笔者本身并不是CS背景,在此先抱歉。以下很多内容,可能用的是一些笨方法,但也算是这段时间摸索出来的一些小结果,如果有错误,还希望各位大神能够指出。
由于罗大哥和笔者,主要在做城市计算方面的平台开发,刚开始基于grasshopper做了一些小型的demo。后来当计算的城市系统逐渐复杂的时候,开始发现它支撑不了,所以我们解决的方法是将平台移植到unity上,但是unity里的mesh面搭建可能会是一个比较繁琐的过程,远没有rhino来得方便和快捷,所以我们考虑的方法是将Rhino和unity打通。
以下文字,是我们如何打通rhino和unity的方式介绍:
1. 如何在外部IDE 里,调用rhino进行运算
1)通过AWS调用Rhino Compute Service
2)通过搭建本地服务器,来调用Rhino Compute Service
2. 如何在unity内部,调用rhino
1)unity环境搭建
1)代码思路
1. 外部IDE搭建方法
搭建逻辑+具体方式
想来应该事先声明下,以下部分,官网上有英文流程解释。笔者做的只是将他们转为中文,把自己在尝试过程中,遇到的坑和需要注意的事情,稍微提了一下。接下来,进入正题。
首先,在Rhino官网上,主要讲了如何使用Rhino. compute service, 目的是,允许利用云服务器,通过REST API访问Rhino的几何库,可在Web服务中嵌入Rhino高级几何计算。如何搭建这个环境,就成了最重要的第一步。在这里,我们主要用的库是,compute-rhino3d 和 rhino3dm。
在这篇小短文里,笔者是基于PyCharm来演示如何做从外部调用Rhino库。在这里,首先要解释的是,在这两个库里,Rhino3dm有大部分的几何生成,但主要的计算部分都是在compute_Rhino3dm里,我们用了两种数据处理方式来解决计算的问题。第一种,是将数据上传到云服务器,再返得回来。第二种,是在本地搭建一个服务器,直接在本地完成计算。
安装方式(需要基于3.7python):
相关链接:
Rhino Compute Service:
https://www.rhino3d.com/compute
compute-rhino3d 帮助手册:
https://compute-rhino3d.readthedocs.io/en/latest/
rhino3dm 帮助手册:
https://mcneel.github.io/rhino3dm/python/api/index.html
1.1 外部IDE搭建_方法一
前两步都较为常规,若熟悉Rhino_Python的,可以选择跳过。
第一步:
1. 较为常规,写下20个点,存进Rhino里,这时候,还不需要用到compute_rhino_3dm
@PyCharm界面1.0
@Rhino界面1.0
第二步:
1. 基于这些点,做圆,存入Rhino
@PyCharm界面2.0
@Rhino界面2.0
第三步:
接下来,要做bool运算,将重叠的圆进行BooleanUnion,在rhino3dm,没有关于boolean的函数,所以需要:
1. 引入compute_rhino3d,这时候要添加进authToken
2. 得出来的线,需要经过CommonObject.Decode一遍,才能转成rhino能读取的文件
@PyCharm界面3.0
@Rhino界面3.0
第四步:
1. 挤出线
@PyCharm界面4.0
@Rhino界面4.0
第五步:
1. 需要先将extrusion转化为brep
2. 利用compute_rhino3d.Mesh.CreateFromBrep,将mesh面转化过去
@PyCharm界面5.0
@Rhino界面5.0
结论:
1. 由于大部分web端或者unity,都只认mesh曲面,所以笔者需要尝试如果将nurbs转成mesh后,需要多长时间,是不是能符合需求。
2. 但是,用云服务器的方法,导致转成Mesh的时长约50s,这就意味着,如果要做实时的话,这个速度完全不能及时响应,需要另谋出路,这就引出了第二种方法,在本地建立一个服务器。
1.2 外部IDE搭建_方法二
第一步:
1. 一定要有RhinoWIP,然后按照图示,进入lastestbuild,并下载compute-247.zip
@Github_Mcneel
@Github_Mcneel_latest build
相关链接:
https://github.com/mcneel/compute.rhino3d#rhinocommonrest
https://ci.appveyor.com/project/mcneel/compute-rhino3d/branch/master/artifacts
第二步:
1. 可以尝试该路径,打开compute.fronted.exe,大概率不能运行,因为还没有指定端口
@文件夹地址+界面
第三步:
1. 以管理者权限打开PowerShell
2. 输入内容,github上是输入80端口,但是应该是8081,因为80端口已经有占用
@github上显示的输入内容
3. 如果尝试后,再打开compute.fronted.exe,没有报错,则已经连上。但如果报错,可以尝试去查看端口占用情况,将被占用的端口强制关闭。
4. 输入地址后,查看结果
1)输入127.0.0.1:8081/version
2)输入127.0.0.1:8081/sdk
@/../version显示结果
@/../sdk显示结果
5. 则证明,已经顺利搭建好本地服务器,这时候,在Pycharm里面加入访问地址,就可以快速进行运算,如下图5
@5 加入地址后,开始运算
结论:
1. 搭建好本地服务器之后,再使用compute_rhino3d,速度达到了0.5s以下,这样的速度,还算是能接受。可以用如下方式,将Rhino里的几何方法转移进其他平台。
2. unity和Rhino的对接方法
在这里,我们的目标平台是unity,所以还是以unity为例。所以,跟各位大神说说看,我们的搭建思路。
第一步:
需要为unity搭建好环境
1. 需要将unity的环境换成是.Net 4.x, Edit->Project Setting->Player-> Other Setting->configuration
@unity inspector界面
第二步:
开始加入各种插件
1. 在NuGet里面下载,Rhino包
@NuGet界面
2. 转成zip,拿出里面文件,librhino3dmio_native.dll,然后进入unity,勾选editor+standalone
@文件路径
@unity inspector界面
3. 拿出里面文件,Rhino3dmIO.dll,同样勾选editor+standalone
@3.1 按照文件路径,找到该文件
@ unity inspector界面
4. 进入unityasset store,导入json.net
@unity asset store界面
5. 进入rhinocompute service wip下的Compute for C# Getting Started Guide链接, 下载RhinoCompute.cs
@5 下载RhinoCompute.cs,导入unity
6. 目前unity界面
@6 unity文件视窗里的现有插件
相关链接:
https://www.nuget.org/
https://developer.rhino3d.com/guides/rhinocommon/compute/compute-net-getting-started/
第三步:
内容展示
1. 因为本文,不是个unity教程,所以在unity部分,简略地带过。如果有兴趣的话,可以进到如下的github链接去下载源码:
https://github.com/alphonse-lin/connect_with_rhino-unity
@unity运行界面
@unity 运行效果
第四步:
1. VS代码缩略图
@unity VS缩略图
2. 框架图
第五步:
1. 将authToken和材质都拿出来做为一个赋值位
@unity inspector 参数面板
2. 可在unity里面生成rhino文件,可以为之后的procedural modeling奠定基础,比如WCF(波函数坍缩算法)
@在unityVS里将rhino文件向外保存
3. 将该项目封装成桌面端,也一样可以进行计算和交互
@以exe的形式打开
3. 小结
1. 潜力
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依旧强大。
2. 结语
1)基于这次的小小探索中,很幸运地能解决我们最初的问题,Rhino和GH可能比较难成为一个面向大众的简易交互界面,转移到unity之后,情况有所好转。当然,如果是做一个小Demo,Rhino和GH是特别棒的平台。
2)由于我们本身技术和见解有限,以上的方式可能是我们能想到的,unity与rhino链接比较成功的一个方式,如果之后大神们有更好的链接方法,希望能有更多的交流。
3)特别感谢JunichiroHorikawa,如果没有他,就不会有这篇文章。有兴趣的人,可以去关注他的youtubechannel,相信会有所启发和帮助。
4)很抱歉,用小点的形式写完这篇小短文,对文章的枯燥乏味道个歉。再有,由于笔者本身的不专业性,在解释流程和专业术语的时候,可能会有一定的偏颇,在这里,再次抱歉,如果有错误,希望各位大神能指出。
相关链接:
JunichiroHorikawa大神个人网站:
https://jhorikawa.com/
裕翔大神个人网站:
http://zhangzhangzhang.space/
关于Procedural Modeling的Mesh建模教程:
https://www.youtube.com/playlist?list=PL6W3lurecOfzuN7HTHZmt0geJX95-PpE-
往期精彩文章回顾:
【Python】Gh如何选中Rhino中图层的物体
【Python】如何循环标注
【Processing教程6】----Minim的简单运用
【Processing 教程 5】 ----PeasyCam 和 gHowl
【Processing教程4】----library的简单运用
【Processing 教程3】--Arry和For Loop
【Processing 教程 2 】----- function
【Processing 教程1】--界面和参数介绍
【号外,号外】大家期待已久的Processing教程来啦
【Python】一键标注封闭多重直线
【Python】通过python删除指定名称的电池
【分分钟建模系列20】如何路径分组
【分分钟建模系列19】如何用RhinoPython实现“向日葵”开洞
【分分钟建模系列18】如何用Rhino做垂直格栅
【分分钟建模系列08】山寨一个教堂
【分分钟建模系列07】做个扭转建筑
【分分钟建模系列】SoftMove命令的简单应用
【分分钟建模系列】手把手教你做旋转楼梯
【分分钟建模系列】手把手教你做表皮
【分分钟建模系列05】手把手教你做编织
【分分钟建模系列06】手把手教你做个凳子
【分分钟建模系列09】如何用犀牛手工做灰阶度干扰
【分分钟建模10】MAD中国国家美术馆
【分分钟建模教程系列11】Big的W大楼
【分分钟建模教程系列12】如何做一个漂亮的楼梯
【分分钟建模教程系列13】如何做曲面干扰
【分分钟建模系列14】如何快速打断相交的曲线
【分分钟建模系列15】如何用Grasshopper建一座桥梁
【分分钟建模系列16】茶几建模
【分分钟建模系列17】BIG蛇形画廊的建模案例
【Bubalus_RH for Rhino6】选择“选中物体”所在的图层
【Grasshopper】Anemone插件的应用
大水牛参数化设计是一个传播分享建筑数字化设计与数字化建造资讯的平台
并且会不断连载原创或转载有价值的参数化软件教程
(Rhino、Grasshopper、Python、Revit、Processing等等)
是一个视野与技术并重的数字化传播平台
我们的目标是把这个平台创造成一个拥有良好氛围的学习平台
我们将带头冲锋;我们的立场非常坚定
我们的狂怒你驾驭不住;黎明就在眼前
欢迎你们加入我们的战队
记住我们不是一个人在战斗
点击关注微信公共号,获取更多精彩内容