आप प्रोग्रामेटिक रूप से एक क्षेत्र कैसे उत्पन्न करते हैं?


25

क्या कोई यह बता सकता है कि एक गोलाकार कोने, सूचकांक और बनावट के निर्देशांक बनाना कैसे संभव होगा? ऐसा करने के बारे में प्रलेखन की आश्चर्यजनक कमी है और यह कुछ ऐसा है जिसे मैं सीखने में दिलचस्पी रखता हूं।

मैंने स्पष्ट, googling, gamedev.net पर देखने की कोशिश की है, आदि। हालांकि, कुछ भी गोलाकार बिंदुओं की पीढ़ियों को शामिल नहीं करता है, उन्हें अनुक्रमित करता है, और बनावट करता है।


6
मैं इसे बंद करने के लिए नीचे जाने या वोट करने नहीं जा रहा हूं, लेकिन क्या आप वास्तव में मुझे बता रहे हैं कि google.com/search?q=how+to+generate+a+sphere+vertices से एक भी परिणाम उपयोगी नहीं था? यदि ऐसा है तो आपको यह बताना होगा कि आपकी समस्या क्या है।


आइकोस्फियर की खोज करें। गूंगा "ध्रुवीय क्षेत्र" की तुलना में बहुत अधिक चालाक जो बेकार चेहरे का उत्पादन करता है।
नोटबिन

3
वर्थ नोटिंग, कुछ सरल उद्देश्यों के लिए एक पूरी तरह से ठीक "गोले" है जो कैमरे के सामने एक परिपत्र बनावट के साथ एक ट्रैक्टर है।
आआआआआआआआआआ आआआआआआआआआआआआआआआआआआआस

यहाँ है कि मैंने इसे अपने खेल में स्काइडोम के लिए कैसे लागू किया
danijar

जवाबों:


36

दो सामान्य दृष्टिकोण हैं:

यहाँ छवि विवरण दर्ज करें

सबसे बाएं को uv-sphere और दाईं ओर एक icosphere कहा जाता है।

GLUT uv दृष्टिकोण का उपयोग करने के लिए जाता है: फ्रीग्लूट सोर्सकोडglutSolidSphere() में फ़ंक्शन को देखें

यहाँ एक आइकोस्फियर के उत्पादन पर एक उत्कृष्ट लेख दिया गया है: http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html

Uv- क्षेत्र एक ग्लोब की तरह दिखता है। कई उद्देश्यों के लिए यह पूरी तरह से ठीक है, लेकिन कुछ उपयोग के मामलों के लिए, उदाहरण के लिए, यदि आप गोले को विकृत करना चाहते हैं, तो यह नुकसानदेह है कि खंभे के चारों ओर कोने का घनत्व अधिक है। यहां आइसोस्फीयर बेहतर है, इसके कोने समान रूप से वितरित किए जाते हैं।

आपको यह दिलचस्प भी लग सकता है: http://kiwi.atmos.colostate.edu/BUGS/geodesic/text.html यह ज़ोन में चेहरे को व्यवस्थित करने के लिए एक दृष्टिकोण का वर्णन करता है।

http://vterrain.org/Textures/spherical.html एक उत्कृष्ट विवरण देता है कि आप उन्हें कैसे चुन सकते हैं।


2
जबकि सामान्य विचार अच्छा है, एक Schläfli {3,5} पॉलीटॉप को उप-विभाजित करना ऐसा करने का एकमात्र तरीका नहीं है। आम तौर पर, मैं यूवी-मैपिंग उद्देश्यों के लिए स्लैफली {4, *} परिवार ({4,3} एक क्षेत्र के मामले में) के साथ काम करना पसंद करता हूं।
मार्टिन सोज्का

पतले tessellated icosahedral क्षेत्र थोड़ा और अधिक महंगा होने के कारण उत्पन्न करने के लिए चेहरों को पुन: प्रस्तुत करने की आवश्यकता है।
bobobobo

9

इसे करने के 2 तरीके हैं:

  1. गोलाकार निर्देशांकों में थीटा और phi को चलाएं, चेहरे और ट्रिस उत्पन्न करें

  2. वांछित टेस्यूलेशन तक पहुंचने तक एक आइकोसैहेड्रॉन और पुनरावर्ती उपविभाजन चेहरे बनाएं।

गोलाकार निर्देशांक का उपयोग करते हुए क्षेत्र

पहले रास्ते के लिए, आप बस थीटा और फि को चलने के लिए एक डबल नेस्टेड का उपयोग करते हैं। जैसे ही आप थीटा और फि चलते हैं, आप अपने गोले को बनाने के लिए त्रिकोणों को घुमाते हैं।

यहाँ छवि विवरण दर्ज करें

ऐसा करने वाला कोड कुछ इस तरह दिखाई देगा:

for( int t = 0 ; t < stacks ; t++ ) // stacks are ELEVATION so they count theta
{
  real theta1 = ( (real)(t)/stacks )*PI ;
  real theta2 = ( (real)(t+1)/stacks )*PI ;

  for( int p = 0 ; p < slices ; p++ ) // slices are ORANGE SLICES so the count azimuth
  {
    real phi1 = ( (real)(p)/slices )*2*PI ; // azimuth goes around 0 .. 2*PI
    real phi2 = ( (real)(p+1)/slices )*2*PI ;

    //phi2   phi1
    // |      |
    // 2------1 -- theta1
    // |\ _   |
    // |    \ |
    // 3------4 -- theta2
    //

    //vertex1 = vertex on a sphere of radius r at spherical coords theta1, phi1
    //vertex2 = vertex on a sphere of radius r at spherical coords theta1, phi2
    //vertex3 = vertex on a sphere of radius r at spherical coords theta2, phi2
    //vertex4 = vertex on a sphere of radius r at spherical coords theta2, phi1

    // facing out
    if( t == 0 ) // top cap
      mesh->addTri( vertex1, vertex3, vertex4 ) ; //t1p1, t2p2, t2p1
    else if( t + 1 == stacks ) //end cap
      mesh->addTri( vertex3, vertex1, vertex2 ) ; //t2p2, t1p1, t1p2
    else
    {
      // body, facing OUT:
      mesh->addTri( vertex1, vertex2, vertex4 ) ;
      mesh->addTri( vertex2, vertex3, vertex4 ) ;
    }
  }
}

तो ऊपर ध्यान दें, केवल ट्रिस का उपयोग करके शीर्ष टोपी और नीचे की टोपी को हवा देना महत्वपूर्ण है, क्वाड्स नहीं।

इकोसाहेड्रल क्षेत्र

एक icosahedron का उपयोग करने के लिए, आप बस icosahedron के बिंदु उत्पन्न करते हैं और फिर उसमें से त्रिकोणों को हवा देते हैं। एक आईकोसह्ड्रोन के कोने मूल पर बैठे हैं:

(0, ±1, ±φ)
1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + 5) / 2 

फिर आपको बस उन वर्ट्स से एक आइकोसैहेड्रोन और विंड फेस के आरेख को देखना होगा। मेरे पास पहले से ही कोड है जो इसे यहां करता है


किसी भी विचार कैसे आधे शरीर को पाने के लिए, जैसे थीटा = पी / 4 से थीटा = 3pi * 4? इस छवि की तरह: i.stack.imgur.com/Jjx2c.jpg मैं इस पर दिन बिता रहा हूं इसे हल नहीं कर सकता।
टीना जे

3

यदि बिंदुओं को स्थानीय रूप से एक समान नहीं होना है, लेकिन विश्व स्तर पर एक समान होना चाहिए, और किसी भी सेट पैटर्न का पालन नहीं करना है, तो आप त्रिज्या r के साथ एक क्षेत्र पर n अंक वितरित करने के लिए डार्ट-थ्रोइंग एल्गोरिथ्म के एक संस्करण का उपयोग कर सकते हैं , औसत पर जिले के अलावा अंक। ये मूल्य तब मोटे तौर पर हैं:

  1. यदि आप एक विशिष्ट मात्रा में चक्कर लगाना चाहते हैं:
    • n = (कोने की वांछित राशि)
    • dist = 2 × r × √ ( π / n )
  2. यदि आप कोने के बीच एक विशिष्ट औसत दूरी रखना चाहते हैं:
    • n = 4 × π × ( आर / जिले ) 2
    • dist = (वांछित औसत दूरी)

सामान्य स्थिति में, आप तो समान रूप से यादृच्छिक पर अंक दो समान रूप से वितरित चर उठा द्वारा चुन सकते हैं यू और वी सूत्रों के अनुसार (0, 1) से और उनमें से ध्रुवीय निर्देशांक की गणना θ = 2 × π × यू और φ = चाप cos (2 × v - 1); फिर किसी भी बिंदु को खारिज करना जो पहले से चुने गए बिंदुओं के पास भी झूठ है। थोड़ा और अधिक जटिल और बेहतर प्रदर्शन करने वाले एल्गोरिथ्म के लिए, " सरफेस पर डार्ट थ्रोइंग देखें।" क्लाइन, जेसचके, व्हाइट, राजदान और वोंका द्वारा " ।

आपके द्वारा अपने पहले चार अंक लेने के बाद (उनमें से कोई भी तीन पतित नहीं हैं , यह है - वे एक ही महान चक्र पर झूठ नहीं बोलते हैं, लेकिन यह बहुत संभावना नहीं है), आप उनके बीच चार चेहरे बना सकते हैं, और हर बार जब आप एक जोड़ते हैं नया बिंदु, आप तीन उप-चेहरों के अनुसार संबंधित चेहरे को विभाजित कर सकते हैं।

तब बनावट के उद्देश्यों के लिए आप एक क्यूब मैप पर अंक मैप कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.