Köşe normalleri aracılığıyla potun eksenini tek parça ile yeniden yapılandırma

Aug 16 2020

Tek bir parçasından bütün bir tencereyi yeniden inşa etmeyi planlıyorum.

Zaten bunu yapmanın bir yolunu düşündüm, ama bunu kodla nasıl gerçekleştireceğimi gerçekten bilmiyorum.

Teori: Her parçanın belirli bir eğimi vardır. Bu viraj iki parça bilgi içerir:

  • pot içindeki parçanın yönü
  • potun çapı. Düzenleme modunda köşe normallerini açtığınızda bunu kolayca görebilirsiniz. Teknik olarak çanak çömlek yapım sürecinden her saksının ortasında bir merkez ekseni vardır. Köşe normalleri bu ekseni keser, böylece köşe normallerini açarken ekseni net bir şekilde görebilirsiniz.

Problem: Bu ekseni komut dosyası aracılığıyla nasıl yeniden oluşturabilirim? matematiksel olarak tepe normallerinin ince bir silindirle kesişmesidir.

Birinci adım, köşe normallerini yalnızca belirli bir seçimden seçmek olacaktır, çünkü dışa dönük olana ihtiyacım yok ...

Test Parçası

Yanıtlar

2 batFINGER Aug 18 2020 at 01:49

Kavramın ispatı

Dışbükey gövdenin seçilen tek kenarındaki sonuç

Yoruma ek olarak, bunu kavramın kanıtlanmasına bir şekilde ekledik,

Fistly here, nesnenizi ve ağınızı diğerine kopyalayan, düzenleme moduna giren ve onu dışbükey bir gövdeye dönüştüren bir komut dosyasıdır.

Parçayı seçin ve çalıştırın

import bpy
bpy.ops.object.mode_set()
bpy.ops.object.duplicate(linked=False)
dupe = bpy.context.object
dupe.display_type = 'WIRE'
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.convex_hull()

bundan sonra, tüm geometri seçiliyken düzenleme modunda orijinal dışbükey teknenin yeni tel çerçevesi.

Bir sonraki komut dosyası gövdenin kenarlarından geçer, ağda orta noktasına en yakın noktayı bulur, bunları burada açıklandığı gibi kirişten bir daire oluşturmak için kullanır Matematiksel olarak doğru bir yay / dairesel segmenti nasıl oluşturabilirim?

Görselleştirmek için daire merkezine bir tepe ve iki birleşen kenar ekledik. Veriler yarıçap, merkez koordinat ve normal olarak kaydedileceği için (dönme ekseni iki kenar vektörünün normalleştirilmiş çapraz çarpımı)

Test komut dosyası, seçilen her kenar için tahmini daire "kamaları" oluşturur. Düzenleme modunda dışbükey gövde ağı ile çalıştırın, ilgili kenarlar seçildi.

Dışbükey gövdenin tüm kenarlarında sonuç

import bpy
import bmesh
from math import asin, degrees
context = bpy.context
scene = context.scene
ob = context.object
me = ob.data
bm = bmesh.from_edit_mesh(me)
shard = scene.objects.get("3D_Scherbe_Model_50K")
#edges = bm.edges[:]  # all edges 
edges = [e for e in bm.edges if e.select]
#edges = [e for e in bm.select_history if isinstance(e, bmesh.types.BMEdge)]  
for edge in edges:

    o = (edge.verts[1].co + edge.verts[0].co) / 2

    hit, loc, _, _ = shard.closest_point_on_mesh(o)

    if hit:
        h = (loc - o).length
        if h < 0.1:
            print("On surface")
            continue
        a = edge.calc_length() / 2
        r = (a * a + h * h) / (2 * h)
        if abs(a / r) > 1:
            # math domain error on arcsin
            print("N/A")
        else:
            angle = 2 * asin(a / r)    
            print(f"{r} {degrees(angle)}")
            vc = bm.verts.new(o + r * (o - loc).normalized())
            for v in edge.verts:
                bm.edges.new((v, vc))  
bmesh.update_edit_mesh(me)
me.update()

Notlar.

  • En yakın noktadan kenar merkezine bir daireyi tahmin etmek yerine, kenarda yürüyebilir ve çatırdamak için örnek noktalar yapabilir https://meshlogic.github.io/posts/jupyter/curve-fitting/fitting-a-circle-to-cluster-of-3d-points/ ve https://github.com/ndvanforeest/fit_ellipse @RobinBetts tarafından önerildiği gibi.

  • Benzer şekilde, üretilen daire tahminini gerçek ağ yüzeyine karşı test etmek için kullanabilir.

  • Ağ üzerindeki en yakın noktadan dönen normale bakın.

  • Seçimi daraltın, belirli bir aralıkta yarıçap veya kama açısını öneren geçmiş veriler var mı?

  • Her biri aynı yarıçapa ve açıya sahipse, mükemmel bir eşleşme olacaksa, ağ üzerindeki kenarın eşit uzunluktaki "alt çizgilerini" (ağ üzerindeki en yakın nokta) yansıtın. En iyi uyum için küçültün.

  • Sınırlayıcı kutu boyutlarına bakın. Bir kenar minimum bbox boyutunun bir kısmından daha kısaysa, muhtemelen majör pot ekseni değildir. Yüzdesini azaltmayı düşünün.

  • Bir şekilde kırık ağını temizlemeyi veya düzleştirmeyi azaltma.