关于曲面的有效性问题

测试2.3dm (91.1 KB)
第一个曲面是圆用fin命令,经过不等距偏移得到的,第二个曲面是第一个曲面延伸后被平面split,然后缩回控制点得到的。用what命令查看发现,第一个曲面是有效曲面,第二个是无效曲面。我的问题是两个曲面基本上一致,为什么split后就变成了无效曲面。我找到了一个问题切入口,直接移除复节点,第二个曲面也会变成有效曲面。我不清楚原因,不知道是不是软件判定问题。[img]http://[/img

你的问题归纳为你这种做面的方式为什么分割后的结果为无效曲面,前面你描述的Fin之类的过程其实不重要,和你最终的结果无效没关系。

这种做面的接缝是“假的”,从曲面结构上来说还是开放边,单看造型是没啥问题的,但是这种曲面在后续处理时会存在隐患。

我画了个常规的圆柱面,然后重建(重建只是为了调整边缘形状),按照你的描述还原了你说的这个问题,并且在 Rhino 和 GH 中分别做了测试,下图是 GH 中的计算结果:

1.用投影线去分割曲面。

2.用一张平面去分割曲面。

我觉得计算的结果并不是软件的bug,你可以认为是软件判定的问题。


建议用常规的方法去做这个造型,画一个有真正闭合线的圆柱面,然后用线去分割曲面即可,不用纠结。

3 个赞

楼主如果对这个“无效”希望深究一下的话
我也趁此机会做了一些研究。以下是从 完全搞不清状况 到 大概能搞清状况 的全过程:
过程用的各类方式方法,楼主如果希望也做类似的研究,可以参考一下。

题外话:楼主可能是其他软件的建模习惯,让你认为Rhino的摄像机旋转是反的。
因此你的摄像机是180反转的。但是在这个情况下你的世界坐标的Z轴是对着下面的。
也就是说,按照常理2m比1m高,但是在你这模型里,1m比2m高。


另一个问题就是你的摄像机旋转值不等于0的情况下,旋转值将永远是一个不固定的数字,因为你的旋转不会自动锁定绕Z轴。将旋转值设定为0后,旋转值会固定为0,永远绕Z轴旋转。

除了what命令之外,其他查阅物体信息的命令还有list和check
依次运行后,list将不会显示更多关于无效的信息,但check能够显示出来。
先把如下信息记录下来

【以下部分可以酌情跳过】

当你需要在GH内批量检测这类信息时,由于没有运算器,需要使用C#和Rhinocommon
尝试了x为Surface类型后,输入英文句号,在后面的信息中寻找Valid相关的函数
image

除了发现isValid外,发现了一个叫做isValidWithLog的神奇函数,查阅官方资料
找到里面的用法。写出代码
image

发现并未输出invalid的log信息
image

增加B输出端显示isValid的信息时,发现这两个物体作为曲面都是Valid
image

回顾一下check命令的结果
image
发现他用的描述是brep,于是修改代码的输入端类型为brep (brep也有isValidWithLog)


【跳过部分结束,回到正文】

分析这段错误代码

brep.m_E[2] edge is not valid.
	edge.m_vi[]=(2,3) but edge.IsClosed() is true
ON_Brep.m_E[2] is invalid.

其中提到了brep的m_E属性,而且是个数组,这个表述并不在Rhinocommon中,推测是属于C++内核的,所以这类信息多半是为了开发者调试用,而不是面对普通用户。
推测是边缘列表内的第二条出现了问题。而边缘是可以使用GH电池或者Rhinocommon提取的

第二句话里面edge.m_vi[]=(2,3) 其中v应该说的是顶点Vertex,i说的可能是index也就是序号
这句话表述的意思是这条边缘的顶点序号是数组[2,3]
顶点序号类似于网格的顶点-面的facelist,意思就是这条边涉及到的顶点,是这个brep的顶点列表内的第几个,这里是第二个和第三个。

尝试使用Rhinocommon获取这个m_vi[]发现并没有,最接近的只有edge.startVertex和edge.endVertex.
也就是说Rhinocommon无法提取这个点的具体编号,只能给出点的位置
这里为了方便调试,将edge序号给了一个滑动条

回到上一个错误信息,表述的意思是,这条边是一个封闭曲线“ edge.IsClosed() is true”
但是他的顶点有两个,而不是一个(封闭曲线应该头尾都是一个点)
我们看到刚才代码提取出来的2号和3号点,虽然他们的坐标一模一样
但是由于他们的index是2和3,是两个数字,因此犀牛认为这条封闭曲线有2个端点,而不是一个
所以他认为第二条边缘自己是存在自相矛盾的,边缘无效,进而曲面无效。


如果你检查两个物体的顶点情况,会发现无效的曲面,在红框处会有两个点,而有效的只有一个
无效曲面的红框处的顶点是2个分离的点,只不过几何位置刚好重合
有效曲面在这里只有一个点,他们有相同的index/编号/索引。符合这条边缘是封闭曲线的定义。因此没有内在的矛盾

至于形成这个情况的进一步原因
暂时还没有找到

针对封闭曲线进行不等距的fin命令并不是什么常规操作
我也不确定你是从哪个教程内看来的做法。建议放弃那个教程。

1 个赞

补充:

当你拉开其中一个接缝的控制点时
曲面就成了有效了,因为这条边缘不再是封闭曲线,他和“这条曲线有两个顶点” 并不矛盾

非常感谢,我明白了。

:+1:你说的很硬核,可能我需要好几天时间,查阅其他资料,来慢慢消化你说的内容。

假设你真的感兴趣的话,是可以看看研究一下的。

Fin+封闭曲线+不等距fin
这三个结合在一起才会出现这个问题
不管是谁教会你的,这个方法还是忘记比较好。

用版主提供给你的正规方法做吧:
image

好,我看了好几遍你的答案,反复琢磨,感到收获很多,原来还可以这样分析问题。你这种深入原理的精神,非常佩服,非常感谢。

我再重复你教我的方法后,发现一个问题。具体情况如下,这个面是一个标准的圆柱进行了重建 然后在接缝附近进行了结构线分割 再将接缝的控制点拖动成下图

然后画一直线进行切割

最后再将接缝处的控制点全部移开


曲面仍然无效,真搞不懂了。

最终模型是
测试5.3dm (183.3 KB)


其实我还是不太明白,这到底是在做什么步骤

我觉得要不这个话题就结束了吧
用常规建模的思路去做模型
不要去用千奇百怪又毫无道理的方法来挑战软件。
意义不大

好,不深究了。:pray:

:exclamation: 请注意 ,你使用的是一组盗版许可证 :skull_and_crossbones: ,如果你是从我们的授权经销商购买,烦请与经销商联系且索回你应有的正版许可证,我们会提供相关协助。如果你是从其他渠道获得,请卸载之,然后你可以至下面的网站联系你附近的经销商洽谈购买 :point_down:

:point_right: http://rhino3d.com/sales :point_left:

:pushpin: 我们在中国大陆地区也提供淘宝在线销售业务,浏览详情 :point_down:

:point_right: http://taobao.rhino3d.asia :point_left:

:loudspeaker: 提醒与呼吁 :尊重知识产权请从拒绝盗版软件开始,不要等到自己的设计与其他智力劳动成果被剽窃、盗取、盗用或抄袭的时候才想到要维护知识产权,维持良好的知识产权环境需要你的参与 :pray:

1 个赞

你只是换了种方法做了个结构矛盾的曲面而已,和你之前的结果并没有两样,有什么意义呢?

问题的核心是这种结构的曲面本身就对后续的操作带来隐患,和你处理的过程没什么关系,我前面截图已经复现了这个问题,只是你没仔细看或者没理解。

画一条多span的nurbs曲线,然后移除一个节点,这条曲线会发生改变。假如往这条曲线里插入一个尖锐点,然后在通过RemovemultiKnot的方式,移除尖锐点,这时候曲线不会改变。那么问题来了,外网官方论坛的开发者说‘"kinks’ occur where there is a ‘fully multiple’ knot’也就是说尖锐点实质上是完全复节点,也是属于节点,为什么移除它,曲线就不改变了呢?还有就是为什么有的完全复节点处表现的像kink能炸开,有些完全复节点处却又不能炸开呢?能不能从原理上解答一下,我琢磨好几天了,想不通。