关于meshsplit / meshtrim问题


#1

@Kelvin

这个是mesh物体的问题,还是。。。?? 我之前在美论坛发过相关的问题,现在还没有解决。
请帮我看一下

文件:
https://drive.google.com/file/d/0B1t7NFb0vofNUmxJZnBLa2VUYTg/edit?usp=sharing

这是用了meshtrim后出现的结果。 Meshsplit也没有成功。


#2

Hi Kev,

這個船殼網格有太多亂七八遭的錯誤,MeshSplit 與 MeshTrim 當然也是有些問題,請跟著下面的步驟操作:

  1. 選取船殼,執行 ExtractNonManifoldMeshEdges 指令。
    把有 Non-manifold Edge 的面全部抽出來刪掉,Non-manifold Edges 的存在代表網格法線有問題,法線有問題的物件通常無法做布林運算,對 Trim 與 Split 或許不影響。

  2. 使用 UnifyMeshNormals 指令把船殼網格法線統一。

  3. 使用 SplitDisjointMesh 指令把未實際相接的網格分離。

  4. 使用 MeshPlane 建立一個 100 x 100 的網格平面代替原來的那個平面。

  5. 使用 MeshTrim 指令,用網格平面試著去修剪船頭和船尾,你會發現這個船殼的網格根本上就有很大的問題,不是拿來修正 MeshSplit/MeshTrim 的好例子。


#3

@Kelvin

太复杂了。 能不能解释一下ExtractNonManifoldMeshEdges命令? 这个命令我从来没有用过。

提到Unifymeshnormals,我想到能不能对Nurbs/ polysrf 开发类似的功能?
原因: 有些人喜欢用颜色表示模型的normal方向, 但是有些人不习惯于这种显示。也就是说,normal的方向很多时候是不是一致的。 这样出现的问题是,在渲染器加灯光的情况下,由于normal方向的问题,灯光会不会显示。

Q:切割mesh物体的时候,必须用meshplane还是可以用nubrs plane? 我之前两者都试过了,结果都是不能切割,所以我不能确认哪种方法是正确的。

Q: 像图片里的显示的那样,眼看这个船是切割的。 可以看出meshplane和船有相交线。但是为什么切割不成功?

Q: 请运行meshoutline…Rhino会挂掉。

请看这里文件:http://discourse.mcneel.com/t/can-anyone-help-me-with-this-file-included/4465
我之前也是遇到相同mesh切割的问题,不知道怎么去解决。 请帮忙。

-Kev


#4

這個要先了解什麼是 Non-Manifold Edge,Non-Manifold Edge 就是三個面共邊組合在一起的情形。曲面或網格都有可能有這種現像,Rhino 5 的 ShowEdges 指令可以找出 Non-Manifold Edge,3D 掃描得到的網格經常會有這種問題。

我不認為多重曲面中的面會常有法線方向不一致的問題,通常是物件有問題,或是有重複的面。遇到這樣的問題請用 ExtractBadSrf 抽出壞面來修復,或用 ShowEdges 找出 Non-Manifold Edge,把重複的面刪除。

Rhino 4 有 RemoveFlippednormals 指令可以處理法線不一致的多重曲面,效果不是很好。這個指令在 Rhino 5 取消了,其實它是變成隱藏的指令,要完整輸入指令名稱才能執行。

為什麼會取消,我想是因為多重曲面有法線方向不一致的情形應該被視為指令 Bug 修正,而不是使用這個指令強迫法線方向一致。通常法線方向不一致可能是多重曲面裡有重複的面,或是有壞面的情形,這些情形要針物件做修復。

基本上兩者都可以,只是我剛好發現用較密的網格平面比原來的那個平面做修剪的效果較好。

後來我找到原因了,是那個龍骨有問題,你只要把龍骨與那個平面交集的網格面刪掉,不用事先修復船殼網格,MeshTrim 與 MeshSplit 直接就可以做出來。

這個船殼網格就算把有問題的面都拿掉了,還是有很多自交的面,重疊的面,奇奇怪怪的面,面數又多,MeshOutline 指令讓 Rhino 掛掉也不意外。

這個我想你可以試試看 ExtractMeshFacesByDraftAngle 指令,把視圖正對一個洞,使用 Border Only 選項把洞的輪廓線抽出來,把抽出來的線的控制點打開,用 PlaneThroughPt 指令去建那個平面。

使用 Gumball 的 Align to Object 把建好的平面稍微放大,讓平面與網格有完整的交集,然後使用 MeshSplit 指令把平面分割建立網格。把得到的網格炸開、使用 SplitDisjointMesh 指令或直接刪除多於的頂點得到中間的"玻璃"。


#5

@Kelvin

受教了。 ExtractMeshFacesByDraftAngle 这个也是没有用过的指令。 太感谢你的帮助了,讲解非常清晰。

-Kev