¿Cómo aplanar el terreno debajo de un objeto del juego?


10

Tengo un script que crea un objeto de terreno y lo pinta con texturas, pero tengo un problema. Cuando intento colocar objetos del juego (como el simple objeto de agua que proporciona la unidad), utilizo un Raycast para determinar la altura correcta para colocar el objeto del juego, pero eso solo garantiza que se coloque correctamente en ese punto en particular.

¿Cómo haría para aplanar el terreno debajo del objeto del juego para que no entre en el terreno o cuelgue en el aire en el caso de las colinas?


3
Encuentra todos los vértices que forman los triángulos del terreno debajo del objeto del juego. Haz que la coordenada y de todos esos vértices sea la misma.
MichaelHouse

Respuestas:


6

Como dije en mi comentario, querrás encontrar todos los vértices que componen los triángulos debajo de tu objeto de juego y establecer su valor y en el mismo valor.

Expandiré mi comentario con pasos más detallados. No estoy muy familiarizado con Unity, por lo que no conozco las mejores herramientas para usar en el trabajo, pero creo que puedo ayudarlo a comenzar por el camino correcto.

Método de fuerza bruta:

  1. Lanza una cuadrícula de rayos directamente desde tu objeto de juego. La cuadrícula debe ser lo suficientemente apretada para garantizar que no se pierda ningún triángulo en la superficie del terreno.
  2. Para cada rayo que golpea algo, puede obtener el triángulo en la malla del terreno con lo siguiente:

    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 y p2 son todas las posiciones de los tres vértices que forman el triángulo que ha sido golpeado. Desea ajustar cada una de esas posiciones de vértices para tener el mismo yvalor. Puedes recolectar todos los vértices, luego establecerlos a un yvalor promedio , o puedes usar el yvalor inicial que encontraste al colocar el objeto del juego.

Optimizaciones:

  • En lugar de simplemente lanzar una cuadrícula de rayos, puede barrer un colisionador hacia abajo desde el objeto del juego y recoger los puntos de contacto de las colisiones entre el colisionador de objetos del juego y la malla de colisión del terreno. Luego, para cada uno de esos puntos de contacto, realice los pasos anteriores para obtener los vértices que desea mover.

  • Cree su terreno de tal manera que cada vértice xy zvalores estén alineados con una cuadrícula, y solo varíe en su yvalor. Ahora puede obtener fácilmente los límites de su objeto de juego y cambiar todos los valores y de los vértices dentro de esos límites.

Esa última optimización es realmente un método alternativo que probablemente sería fácil de implementar y bastante efectivo.


Por lo que puedo decir, el objeto Terrain ( docs.unity3d.com/Documentation/ScriptReference/ Terra.html ) tiene un TerrainCollider ( docs.unity3d.com/Documentation/ScriptReference/… ) no un MeshCollider ( docs.unity3d.com/Documentation / ScriptReference / ... ), por lo que carece de una propiedad sharedMesh que intente usar en el paso 2. Supuse que necesitaría algún tipo de lógica para modificar el mapa de altura que almacena la propiedad del terrenoData.
Rapida

Puede consultar aquí: forum.unity3d.com/threads/… Además, parece que el objeto del terreno tiene una malla regular, por lo que la segunda optimización puede ser su mejor opción.
MichaelHouse

1

Por lo general, quiere que el suelo debajo del objeto sea plano y que se alise el suelo inmediatamente a su alrededor.

Si el terreno está hecho de una cuadrícula y el edificio está alineado con el eje, esto es mucho más fácil.

En el caso general, subdivide los triángulos en los que se asienta el edificio, y luego establece la y de todos los vértices de los triángulos en los que se asienta el edificio en la misma y , y luego realiza un desplazamiento de punto medio para todos los vértices dentro de una cierta distancia que son no ellos mismos debajo de un edificio.

He utilizado este enfoque para colocar carreteras en un terreno 3D.

Por lo general, desea imponer una separación mínima entre edificios para tener suficiente terreno para suavizar. O bien, puede ejecutar el algoritmo provisionalmente antes de la colocación y ver si se supera algún umbral de inclinación y, por lo tanto, controlar dónde el usuario puede colocar edificios.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.