शीर्ष मानदंडों के माध्यम से एक शार्क के साथ पॉट का पुनर्निर्माण अक्ष
I`m की योजना है कि इसके एक हिस्से से पूरे बर्तन का पुनर्निर्माण किया जाए।
मैंने पहले से ही इसे करने का एक तरीका सोचा है, लेकिन मैं वास्तव में यह नहीं जानता कि इसे कोड में कैसे बनाया जाए।
थ्योरी: हर शार्क का एक निश्चित झुकाव होता है। इस मोड़ में जानकारी के दो टुकड़े हैं:
- पॉट के भीतर शार्क का अभिविन्यास
- बर्तन का व्यास। जब आप संपादन मोड में शीर्ष मानदंड को चालू करते हैं तो आप इसे आसानी से देख सकते हैं। तकनीकी रूप से, मिट्टी के बर्तन बनाने की प्रक्रिया से, हर बर्तन के बीच में एक केंद्र अक्ष होता है। शीर्ष मानदंड इस अक्ष को पार करते हैं, इसलिए आप शीर्ष मानदंडों को चालू करते समय धुरी को स्पष्ट रूप से देख सकते हैं।
समस्या: मैं स्क्रिप्ट के माध्यम से उस अक्ष का पुनर्निर्माण कैसे करूं? गणितीय रूप से यह एक पतली सिलेंडर के साथ शीर्ष मानदंडों का प्रतिच्छेदन है।
चरण एक निश्चित चयन से केवल शीर्ष मानदंड का चयन करना होगा, क्योंकि मुझे बाहर की ओर सामना करने की आवश्यकता नहीं है ...
टेस्ट शार्ड
जवाब
अवधारणा का सबूत
टिप्पणी करने के लिए आगे, यह अवधारणा के सबूत के लिए किसी तरह जाने के रूप में जोड़ा गया है,
Fistly यहां एक स्क्रिप्ट है जो आपकी ऑब्जेक्ट और मेष को दूसरे में कॉपी करती है, संपादन मोड में जाती है और इसे उत्तल पतवार में बदल देती है।
शार्क का चयन करें और चलाएं
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()
जिसके बाद सभी ज्यामिति के साथ संपादित मोड में मूल के उत्तल पतवार के नए तार फ्रेम।
अगली स्क्रिप्ट पतवार के किनारों के माध्यम से जाती है, मेष पर निकटतम बिंदु को अपने मध्य बिंदु पर पाता है, इनका उपयोग कॉर्ड से एक सर्कल बनाने के लिए करता है जैसा कि यहां वर्णित है कि मैं गणितीय रूप से सही चाप / परिपत्र खंड कैसे बना सकता हूं?
कल्पना करने के लिए वृत्त केंद्र और दो जुड़ने वाले किनारों पर एक लंब जोड़ दिया है। जैसा कि डेटा त्रिज्या, केंद्र समन्वय और सामान्य (दो एज वैक्टर के सामान्यीकृत क्रॉस उत्पाद के रोटेशन की धुरी) के रूप में बचाएगा।
टेस्ट स्क्रिप्ट, प्रत्येक चयनित किनारे के लिए अनुमानित सर्कल "wedges" बनाता है। संपादित मोड में उत्तल पतवार जाल के साथ चलाएं, चयनित ब्याज के किनारों।
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()
टिप्पणियाँ।
निकटतम बिंदु से किनारे केंद्र तक एक चक्र की भविष्यवाणी करने के बजाय, किनारे पर चल सकता है और कुरकुरे में नमूना बिंदु बना सकता है https://meshlogic.github.io/posts/jupyter/curve-fitting/fitting-a-circle-to-cluster-of-3d-points/ तथा https://github.com/ndvanforeest/fit_ellipse जैसा कि @RobinBetts ने सुझाव दिया है।
इसी तरह वास्तविक सर्किल सतह के खिलाफ परीक्षण करने के लिए उत्पन्न चक्र अनुमान का उपयोग कर सकता है।
जाल पर निकटतम बिंदु से लौटे सामान्य को देखें।
चयन को कम करें, क्या कोई निश्चित सीमा के भीतर रेडी या वेज एंगल का सुझाव देने वाला ऐतिहासिक डेटा है।
प्रोजेक्ट (जाली पर निकटतम बिंदु) मेष पर किनारे की समान लंबाई "सबकोर्डर्स", यदि प्रत्येक में एक ही त्रिज्या है और कोण एक परिपूर्ण मैच होगा। सबसे अच्छा फिट के लिए कम से कम।
बाउंडिंग बॉक्स आयाम देखें। यदि कोई बढ़त न्यूनतम bbox आयाम के कुछ अंश से कम है, तो यह संभवतः प्रमुख पॉट अक्ष नहीं है। कुछ प्रतिशत शेविंग पर विचार करें।
किसी तरह शार्द जाल की सफाई या चौरसाई करना।