Thread
-
所以让我们来看看Nurbs
-
好吧我们先看Nurbs的什么鬼
-
Utility Programs
Go check out the code repository.
Featured
Our Paintv0.2 LaGUI Blender Line Art laMDWiki User Manual And Log GPencil Font Plug-in Manual And LogEarlier works
Rastiq Small Car Simple Desk StopperStashed
Retopology with monte-carlo method Palette for MyPaint Pan-cloud-travel website ESP32 typewriter Hardware progress Line Art embree experiment (done) Blender Nurbs Keyable fully-automatic projectile launching effect tool , based on Blender. 尝试实现一个简单的实时大气光散射Concepts
The conceptual problem of parametric shape forming
-
2021/12
-
接下来检查Curve的实现
-
Blender目前的两个实现都不怎么样……GN那个不能表示分支和表面,仅能表示曲线,老的那个实现实在老火难得看。
目前计划写最少数据层,尽可能利用OpenCascade核已有的东西来做,因为它连选择都有了。
-
BRepBuilderAPI_MakeFace
可以用来构造曲面上打洞,环绕方向↗决定了洞的选择。 -
默认的曲线Nurbs表示为Curve→Nurb→bp,每一片为一个Nurb,bp为一串,有
pntsu, pntsv
记录行列长度。只能是整片不能中间岔,因此这样一来实现反而简多了,(如果需要做成新的物体类型,那么)把基本的选择、绘图和移动缩放旋转等弄好,理论上就可以做cascade接入了。默认的操作里面从线E到面的操作也不支持……
-
通过一些奇形怪状的转换可以读出Pole和Knot数量和列表了。接下来可以探索一些奇怪的结构以了解这些面是如何表示的,这样可以指导如何设计blender的曲面数据结构。参考:获得Knot↗。这里的Pole应该就是控制点。
-
hans后面说不要新加物体而是在现有的这个surf上面来做。由于cascade是超集,因此应该可以兼容,但是数据结构会差挺多,需要dna转移。
-
iges和step都可以读,也可以找到最终的几何类型。
现在要看详细的结构以及形状组合是如何标记的。
-
可以解析出来曲面的点了。由于形状组合很多,需要有多种表示,或者转换为一种(或者直接不要别的种类)。
if(new_shape.ShapeType()==6){ double first, last; if(BRep_Tool::Degenerated(TopoDS::Edge(new_shape))){ printf("degenerated "); }else{ Handle(Geom_Curve) my_curve = BRep_Tool::Curve(TopoDS::Edge(new_shape),first,last); printf("type is %s ", my_curve->DynamicType()->Name()); if(my_curve->IsKind(STANDARD_TYPE(Geom_BSplineCurve))){ Handle(Geom_BSplineCurve) spline = Handle(Geom_BSplineCurve)::DownCast(my_curve); printf("%d knots, %d poles", spline->NbKnots(),spline->NbPoles()); TColgp_Array1OfPnt poles = spline->Poles(); for(Standard_Integer i=poles.Lower(); i<=poles.Upper(); i++){ gp_Pnt p = poles(i); printf("\n"); for(int i=0;i<level;i++){ printf(" "); } printf("* %f, %f, %f", p.X(), p.Y(), p.Z()); } }else if(my_curve->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))){ Handle(Geom_TrimmedCurve) spline = Handle(Geom_TrimmedCurve)::DownCast(my_curve); Handle(Geom_Curve) basis = spline->BasisCurve(); printf("%f - %f", spline->FirstParameter(),spline->LastParameter()); } } }
-
试试将所有形状都转换成BSpline看下行不行,估计要在Blender里做多种表示的底层。
-
参考:OCCT的UV裁剪↗ 2↗ 3↗ OpenNurbs↗
-
Blender 的Curve和Nurbs的一个结构性的问题是曲面和曲线之间没有拓扑联系,也就是说曲线是曲线、曲面是曲面,改一个另外一个没有影响。应该需要将曲面实现为一个曲线的上层结构,这样一来,描述曲线封闭面方便,也适合描述多边缘组合而成的洞。(如果手工指定多个曲线,那么翘曲误差能容纳到多少?)
-
按照目前的理解,需要搞清楚读入的数据里面哪些是
pcurve
,哪些是一般curve
,因为剪切在cascade里面似乎也是最终pcurve
,投影剪切是通过ShapeConstruct_ProjectCurveOnSurface↗类提供的方法算出来的,至于稳不稳定先不管但是是可以算的。犀牛有剪切曲面边缘后自动调节控制柄到目标位置的功能,这个可能后面要研究下实现。
-
目前考虑增强曲面数据结构应该加上一类可结合曲线/轮廓,事实上可以直接用1×N的现有Nurbs片表示,其他的似乎都不用大动。由于Nurb始终是方形的而不能分叉,表示挤出和缝合则用一些隐蔽的手段。
打洞的UI尚不清楚。Blender内部可以用类似修改器等的非破坏方法,但是那些信息没有保留在iges/step文件里面,曲线在那时已经完全剪切完成。
-
-
接下来:
- 离散化后端改成cascade的。
- 做iges/step文件导入导出(暂时不含洞)。
- 同时搞下洞表示数据结构,应该也能做出来个可以用的。
-
要看不同类型边拼接拓扑的表示法,比如圆弧到nurbs边的桥接,因为似乎不能直接编辑圆弧边。
-
圆弧在某个阶段被转换为使用Nurbs表示。
问题:
- 是Cascade自身转换的还是实用工具转换的?
- 不同阶数的连到圆弧上的时候用了不同的段数,没有对齐。
- 不同阶数的互相连也没有对齐。
参数化数学表示应当是一致的,但是如果离散化没有做齐整则会带来其他几何问题,这给新nurbs的后台表示法设计带来了一些问题,尤其是不能比较理想地表示接缝。这时可能有必要用蒙特法来算规整的缝合边,但那头也有许多问题。
-
使用 BRepBuilderAPI_NurbsConvert↗ 可以将所有面都转换成Nurbs表示。
使用 Geom_BSplineSurface↗ 直接构建Nurbes曲面。
-
具体解释:真正对齐分片两侧等实际不可能。
目前的OpenCascade参数化底层不适合在Blender中实现任意Nurbs曲面拼接并保持严密拓扑的功能。一个很简单的证明:特定曲面右侧的其中一个分叉接回同一曲面左侧,由于由于Nurbs曲面只能是X×Y,不能在两侧包含不同数量控制点,因此在例如分叉并接回分支到另一端后,网格面事实上无法对齐,需要使用蒙特法。虽然可以插值并找到同样点,但是仍然会出现两侧细分程度不同的问题。
另一个问题是模型拓扑表示法。像上面提到的情况,现有的软件通过一种曲面融合(Blend surface)表示,有的时候是它们甚至是多边形的?那么它是怎么以Nurbs表示这些面的?
-
Moi无法为这个结构制作多边面,FreeCAD的包围曲面似乎也有问题。并不清楚是表示方式的局限还是什么,而显然如果我们要在Blender里面使用类似F的方式填充区域,这些区域必须是可以定义的。
这意味着某些缝合结构在没有附加信息的情况下不可行,因此需要重新考虑Nurbs的操作方式,包括缝合、挤出等。
FreeCAD无法为这种球上布尔轮廓边缘创建导角,而Moi可以。这种UV空间上非均匀的裁切的确比较难算(我还不是很清楚如何计算它)。
-
好吧Alias的也有问题23333……
-
考虑了参数化造型的概念性问题,这里的情况就比较明确了。大致来讲,我不会在Blender里实现一个比现有的CAD参数化工具更方便的建模交互,因为底层原理限制了整个流程。上层的设计可能需要等到蒙特法重布线实现后方能合理推进,因为目前来看只有这种方法比较适应多变的拓扑结构而始终保持结果的连续。
-
也能在Blender里编译和链接了,但是曲面生成会故障,不清楚具体的曲面表达哪里不对,找了个网上的手写例子又可以跑,再看了。
2021/11
-
devtalk 并没有什么反馈
-
找个时间把它合并到最新的主线看行不行
-
昨天Sebastian推荐了这个蒙特法↗,不直接与打洞相关,但是重拓扑可能比较有用,因为它在边界上稳定。
考虑目前曲线用Hans的最新改过的代码来增加,因为OpenCascade是C++的接口,因此对接起来应该容易。
-
Debian上的OpenCascade版本非常精简并且依赖配置地不是很正确。需要从头编译个。
通过
git clone https://git.dev.opencascade.org/repos/occt.git occt
可以得到git仓库而不是直接下载压缩包。
-
-
为什么没有几个合起来的头文件……整个include有8000多个文件怎么用……
-
OpenCascade STP→STL 的测试小程序可以正常工作。那么目前可以开始设计曲线建模交互。
BRepMesh_IncrementalMesh
有更多的参数可以调节,缝合的时候也有写可以控制的地方,具体看官方手册↗。几个lib在手册上找Toolkit名字(TK开头)加进去即可。
一些常见例子可以在网上找到:Hot Examples↗
-
接下来需要设计数据结构和交互原理,后者需要花一些时间,因为需要考虑如何操作打洞和切割,包括布尔如何在界面上操作,哪些东西可以或者需要做成修改器等等。
然而新版的OCCT把FreeCAD搞坏了。差评。
-
Hans 建议了可以直接从节点开始做,虽然手工建模必然是不可缺少的。
-
另外,需要静态编译
-
将
BUILD_LIBRARY_TYPE
设置为Static
可以编译为静态。档案↗接下来检查独立程序的链接配置。
-
修改了库列表和顺序↗(为什么?)并加入了pthread之后静态连接成功。
2021/10
-
在Devtalk↗上发了个贴看剩下的开发怎么看这个问题。
-
编译起了去年的2.8版soc-2014-nurbs。
- 法线算不对
- 一个洞的的确可以但是嵌套不行
- 打洞目前没得UI
- 转网格有问题应该是重新调过参数
- 封口位置面有时也不对
以及PHP非常迷惑的图像压缩……
2021/12/25 21:53:12