Rekonstruktion der Topfachse mit einem Splitter über Scheitelpunktnormalen
Ich habe vor, einen ganzen Topf aus einer Scherbe davon zu rekonstruieren.
Ich habe bereits über eine Möglichkeit nachgedacht, aber ich weiß wirklich nicht, wie ich es in Code umsetzen soll.
Theorie: Jeder Splitter hat eine gewisse Biegung. Diese Kurve enthält zwei Informationen:
- die Ausrichtung der Scherbe innerhalb des Topfes
- der Durchmesser des Topfes. Sie können dies leicht erkennen, wenn Sie Scheitelpunktnormalen im Bearbeitungsmodus aktivieren. Technisch gesehen gibt es beim Herstellen von Keramik eine Mittelachse in der Mitte jedes Topfes. Die Scheitelpunktnormalen kreuzen diese Achse, sodass Sie die Achse beim Einschalten der Scheitelpunktnormalen deutlich sehen können.
Problem: Wie rekonstruiere ich diese Achse per Skript? mathematisch ist es der Schnittpunkt der Scheitelpunktnormalen mit einem dünnen Zylinder.
Schritt eins wäre, die Scheitelpunktnormalen nur aus einer bestimmten Auswahl auszuwählen, da ich die nach außen gerichtete nicht brauche ...

Shard testen
Antworten
Konzeptioneller Beweiß

Weiter zu kommentieren, haben dies als einen Weg zum Proof of Concept hinzugefügt,
Zunächst ist hier ein Skript, das Ihr Objekt kopiert und in ein anderes vernetzt, in den Bearbeitungsmodus wechselt und es in eine konvexe Hülle konvertiert.
Wählen Sie den Shard aus und führen Sie ihn aus
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()
Danach neuer Drahtrahmen der konvexen Hülle des Originals im Bearbeitungsmodus mit allen ausgewählten Geometrien.
Das nächste Skript geht durch die Ränder des Rumpfes, findet den Punkt auf dem Netz, der dem Mittelpunkt am nächsten liegt, und verwendet diesen, um einen Kreis aus dem Akkord zu erstellen, wie hier beschrieben. Wie kann ich einen mathematisch korrekten Bogen / Kreissegment erstellen?
Zur Visualisierung wurden ein Vert in der Kreismitte und die beiden Verbindungskanten hinzugefügt. Da Daten als Radius, Mittelkoordinate und Normal speichern würden (Rotationsachse das normalisierte Kreuzprodukt zweier Kantenvektoren)
Test-Skript, erstellt vorhergesagte Kreis- "Keile" für jede ausgewählte Kante. Laufen Sie mit konvexem Rumpfnetz im Bearbeitungsmodus, wobei die interessierenden Kanten ausgewählt sind.

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()
Anmerkungen.
Anstatt einen Kreis vom nächstgelegenen Punkt zur Kantenmitte vorherzusagen, könnte man über die Kante gehen und Stichprobenpunkte erstellen, in die man knirschen kann https://meshlogic.github.io/posts/jupyter/curve-fitting/fitting-a-circle-to-cluster-of-3d-points/ und https://github.com/ndvanforeest/fit_ellipse wie von @RobinBetts vorgeschlagen.
In ähnlicher Weise könnte die generierte Kreisschätzung zum Testen gegen die tatsächliche Maschenoberfläche verwendet werden.
Schauen Sie sich die Normalen an, die vom nächsten Punkt auf dem Netz zurückgegeben wurden.
Grenzen Sie die Auswahl ein, gibt es historische Daten, die Radien oder Keilwinkel innerhalb eines bestimmten Bereichs vorschlagen.
Projizieren Sie (nächstgelegener Punkt auf dem Netz) gleich lange "Unterakkorde" der Kante auf das Netz, wenn jeder den gleichen Radius und Winkel hat, wäre dies eine perfekte Übereinstimmung. Für beste Passform minimieren.
Schauen Sie sich die Abmessungen des Begrenzungsrahmens an. Wenn eine Kante kürzer als ein Bruchteil der minimalen bbox-Abmessung ist, handelt es sich wahrscheinlich nicht um eine Haupttopfachse. Erwägen Sie, einen bestimmten Prozentsatz zu rasieren.
Auf irgendeine Weise das Reinigen oder Glätten des Scherbenetzes dezimieren.