ฉันจะทำให้ภูมิประเทศแบนราบภายใต้วัตถุของเกมได้อย่างไร


10

ฉันมีสคริปต์ที่ทำให้วัตถุภูมิประเทศและวาดด้วยพื้นผิว แต่ฉันมีปัญหา เมื่อฉันพยายามวางวัตถุของเกม (เช่นวัตถุน้ำอย่างง่าย ๆ ที่เป็นเอกภาพ) ฉันใช้ Raycast เพื่อกำหนดความสูงที่ถูกต้องในการวางวัตถุของเกม

ฉันจะแบนราบเกี่ยวกับภูมิประเทศใต้วัตถุเกมอย่างไรเพื่อไม่ให้เข้าไปในภูมิประเทศหรือออกไปเที่ยวในอากาศในกรณีของเนินเขา


3
ค้นหาจุดยอดทั้งหมดที่สร้างสามเหลี่ยมภูมิประเทศภายใต้วัตถุเกม ทำให้พิกัด y ของจุดยอดเหล่านั้นเท่ากัน
MichaelHouse

คำตอบ:


6

ดังที่ฉันพูดในความคิดเห็นของฉันคุณจะต้องการค้นหาจุดยอดทั้งหมดที่ประกอบขึ้นเป็นรูปสามเหลี่ยมภายใต้วัตถุเกมของคุณและตั้งค่า y เป็นค่าเดียวกัน

ฉันจะขยายความคิดเห็นของฉันด้วยขั้นตอนที่ละเอียดยิ่งขึ้น ฉันไม่คุ้นเคยกับ Unity เกินไปดังนั้นฉันไม่รู้เครื่องมือที่ดีที่สุดที่จะใช้สำหรับงาน แต่ฉันเชื่อว่าฉันสามารถทำให้คุณเริ่มต้นเส้นทางที่ถูกต้องได้

กำลังดุร้ายวิธี:

  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 / … ) ดังนั้นจึงไม่มีคุณสมบัติ SharedMesh ที่คุณพยายามใช้ในขั้นตอนที่ 2 ฉันถือว่าฉันต้องการตรรกะบางอย่างเพื่อปรับเปลี่ยนแผนผังความสูงที่คุณสมบัติของ terrainData เก็บไว้
Rapida

คุณอาจตรวจสอบได้ที่นี่: forum.unity3d.com/threads/…และดูเหมือนว่าวัตถุภูมิประเทศมีตาข่ายปกติดังนั้นการปรับภาพที่สองอาจเป็นทางออกที่ดีที่สุดของคุณ
MichaelHouse

1

โดยทั่วไปแล้วมันต้องการให้พื้นดินใต้วัตถุนั้นราบเรียบและพื้นดินรอบ ๆ มันจะราบเรียบทันที

หากที่ดินทำขึ้นจากกริดและตัวอาคารอยู่ในแนวแกนนี่จะง่ายกว่ามาก

ในกรณีทั่วไปคุณแบ่งสามเหลี่ยมเป็นตึกที่อยู่และจากนั้นตั้งค่า y ของจุดยอดทั้งหมดบนสามเหลี่ยมที่อาคารตั้งอยู่บนyแล้วทำจุดกึ่งกลางการกระจัดสำหรับจุดยอดทั้งหมดในระยะทางที่กำหนด ไม่ได้อยู่ใต้อาคาร

ฉันใช้วิธีนี้เพื่อวางถนนเข้าสู่ภูมิประเทศ 3 มิติ

โดยทั่วไปคุณต้องการบังคับให้มีการแยกขั้นต่ำระหว่างอาคารต่าง ๆ เพื่อให้มีที่ดินเพียงพอที่จะทำให้ราบรื่น หรือคุณอาจเรียกใช้อัลกอริทึมแบบชั่วคราวก่อนการจัดวางและดูว่ามีขีดจำกัดความสูงเกินกว่าที่กำหนดหรือไม่ดังนั้นจึงต้องทำการตรวจสอบที่ซึ่งผู้ใช้สามารถวางสิ่งปลูกสร้างได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.