गेम ऑब्जेक्ट के तहत मैं इलाके को कैसे समतल करूं?


10

मुझे एक स्क्रिप्ट मिली है, जो एक इलाके की वस्तु बनाती है और इसे बनावट के साथ पेंट करती है, लेकिन मुझे एक मुद्दा मिल रहा है। जब मैं गेम ऑब्जेक्ट्स (जैसे कि साधारण पानी ऑब्जेक्ट जो एकता प्रदान करता है) को रखने का प्रयास करता हूं, तो मैं गेम ऑब्जेक्ट को रखने के लिए सही ऊंचाई निर्धारित करने के लिए एक रेकास्ट का उपयोग करता हूं, लेकिन यह सुनिश्चित करता है कि यह उस विशेष बिंदु पर सही ढंग से रखा गया है।

मैं गेम ऑब्जेक्ट के तहत इलाके को समतल करने के बारे में कैसे जाऊंगा ताकि यह इलाके में न जाए या पहाड़ियों के मामले में पतली हवा में लटका रहे?


3
गेम ऑब्जेक्ट के तहत इलाके के त्रिकोण बनाने वाले सभी कोने खोजें। Y उन सभी को समान बनाते हैं।
MichaelHouse

जवाबों:


6

जैसा कि मैंने अपनी टिप्पणी में कहा था, आप अपने गेम ऑब्जेक्ट के तहत त्रिकोण बनाने वाले सभी छोरों को ढूंढना चाहेंगे और उनके y मान को उसी मूल्य पर सेट करेंगे।

मैं अधिक विस्तृत चरणों के साथ अपनी टिप्पणी का विस्तार करूंगा। मैं एकता से बहुत परिचित नहीं हूं, इसलिए मुझे नौकरी के लिए उपयोग करने के लिए सबसे अच्छे उपकरण नहीं पता हैं, लेकिन मेरा मानना ​​है कि मैं आपको सही रास्ते पर ले जा सकता हूं।

जानवर बल विधि:

  1. अपने गेम ऑब्जेक्ट से सीधे किरणों की एक ग्रिड कास्ट करें। ग्रिड को यह सुनिश्चित करने के लिए पर्याप्त तंग होना चाहिए कि यह इलाके की सतह पर किसी भी त्रिकोण को याद नहीं करेगा।
  2. प्रत्येक किरण जो किसी चीज़ से टकराती है, उसके लिए आप निम्न के साथ इलाके जाल में त्रिकोण प्राप्त कर सकते हैं:

    RaycastHit hit;
    if (!Physics.Raycast(camera.ScreenPointToRay(Input.mousePosition), out hit))
        return;
    
    MeshCollider meshCollider = hit.collider as MeshCollider;
    if (meshCollider == null || meshCollider.sharedMesh == null)
        return;
    
    Mesh mesh = meshCollider.sharedMesh;
    Vector3[] vertices = mesh.vertices;
    int[] triangles = mesh.triangles;
    Vector3 p0 = vertices[triangles[hit.triangleIndex * 3 + 0]];
    Vector3 p1 = vertices[triangles[hit.triangleIndex * 3 + 1]];
    Vector3 p2 = vertices[triangles[hit.triangleIndex * 3 + 2]];
    
  3. p0, p1 और P2 तीन शीर्षकों के सभी स्थान हैं जो हिट किए गए त्रिकोण को बनाते हैं। आप उन वर्टिकल पोजीशन में से प्रत्येक को समान yमान रखने के लिए समायोजित करना चाहते हैं । आप या तो सभी कोने एकत्र कर सकते हैं, फिर उन सभी को एक औसत yमूल्य पर सेट कर सकते हैं, या आप yअपने गेम ऑब्जेक्ट को रखते समय आपके द्वारा प्राप्त प्रारंभिक उठाया मूल्य का उपयोग कर सकते हैं ।

अनुकूलन:

  • सिर्फ किरणों का एक ग्रिड बनाने के बजाय, आप गेम ऑब्जेक्ट से एक कोलाइडर को स्वीप कर सकते हैं और गेम ऑब्जेक्ट कोलाइडर और इलाके टकराव जाल के बीच टकराव के संपर्क बिंदुओं को इकट्ठा कर सकते हैं। फिर उन संपर्क बिंदुओं में से प्रत्येक के लिए, उन चरणों को प्राप्त करने के लिए ऊपर कदम उठाएं जिन्हें आप स्थानांतरित करना चाहते हैं।

  • अपने इलाके को इस तरह से बनाएं कि प्रत्येक वर्टेक्स xऔर zमान एक ग्रिड से जुड़े हों, और केवल इसके yमूल्य में भिन्नता हो । अब आप आसानी से अपने गेम ऑब्जेक्ट की सीमा प्राप्त कर सकते हैं और उन सीमाओं के भीतर कोने के सभी y मूल्यों को बदल सकते हैं।

यह अंतिम अनुकूलन वास्तव में एक वैकल्पिक विधि है जिसे लागू करना आसान होगा और काफी प्रभावी होगा।


क्या मैं भू-भाग (बता सकते हैं docs.unity3d.com/Documentation/ScriptReference/Terrain.html ) वस्तु एक TerrainCollider (है docs.unity3d.com/Documentation/ScriptReference/... ) नहीं एक MeshCollider ( docs.unity3d.com/Documentation / ScriptReference /… ), इसलिए इसमें एक साझा की गई संपत्ति का अभाव है जिसे आप चरण 2 में उपयोग करने का प्रयास करते हैं। मैंने माना कि ऊंचाई वाले नक्शे को संशोधित करने के लिए मुझे किसी प्रकार के तर्क की आवश्यकता होगी जो कि टेरेनडैटा संपत्ति भंडार।
रैपिडा

आप यहां देख सकते हैं: forum.unity3d.com/threads/… इसके अलावा, ऐसा लगता है जैसे कि इलाके की वस्तु में एक नियमित जाल है, इसलिए दूसरा ऑप्टिमाइज़ेशन आपका सबसे अच्छा दांव हो सकता है।
MichaelHouse

1

यह आमतौर पर जमीन के नीचे की जमीन को समतल करना चाहता है और इसके चारों ओर की जमीन को सुचारू किया जाना चाहिए।

यदि भूमि ग्रिड से बनाई गई है और इमारत को अक्ष-संरेखित किया गया है, तो यह बहुत आसान है।

सामान्य स्थिति में, आप भवन को त्रिभुजों को उपविभाजित करते हैं और फिर त्रिकोण के सभी शीर्षों को y पर सेट करते हैं, जो भवन एक ही y पर बैठता है , और फिर एक निश्चित दूरी के भीतर सभी कोणों पर एक मध्य बिंदु विस्थापन चौरसाई करते हैं। एक इमारत के नीचे नहीं।

मैंने एक 3 डी इलाके पर सड़कें डालने के लिए इस दृष्टिकोण का उपयोग किया है।

आप आम तौर पर इमारतों के बीच एक न्यूनतम जुदाई लागू करना चाहते हैं ताकि चिकनी करने के लिए पर्याप्त भूमि हो। या आप प्लेसमेंट से पहले एल्गोरिथ्म को अनंतिम रूप से चला सकते हैं और देख सकते हैं कि क्या स्टीपनेस की कुछ सीमाएं पार हो गई हैं और इतनी पुलिसिंग जहां उपयोगकर्ता इमारतों को रख सकता है।

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