es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Establecer la distancia mínima entre dos mallas en THREE.JS.

Tengo este código que genera algunas nubes en una posición, rotación y escala aleatorias. Dado que pueden generarse una al lado de la otra, o al lado de otra malla, pueden juntarse. Quiero establecer una distancia mínima, como si(la posición x y z de la nube es < 10 DE OTRA NUBE) entonces establecer distancia. ¿Cómo puedo hacerlo? Aquí está el código:

for(let i = 0; i < 10; i+= 1){

loader.load('/clouds/clouds2/scene.gltf', function (clouds2) {



 const cloud = clouds2.scene

 const child1 = cloud.children[0].children[0].children[0].children[2].children[0]
 const child2 = cloud.children[0].children[0].children[0].children[3].children[0]
 const child3 = cloud.children[0].children[0].children[0].children[4].children[0]

 child1.material = new THREE.MeshStandardMaterial({ emissive: 'white', emissiveIntensity: 0.3})
 child2.material = new THREE.MeshStandardMaterial({ emissive: 'white', emissiveIntensity: 0.3})
 child3.material = new THREE.MeshStandardMaterial({ emissive: 'white', emissiveIntensity: 0.3})

 cloud.scale.x = (Math.random() * (0.06 - 0.04 ) + 0.04)
 cloud.scale.y = (Math.random() * (0.06 - 0.04 ) + 0.04)
 cloud.scale.z = (Math.random() * (0.06 - 0.04 ) + 0.04)

 cloud.position.x = (Math.random() - 0.5) * 500
 cloud.position.y = (Math.random() + 80)
 cloud.position.z = (Math.random() - 1) * 500

 cloud.rotation.x = Math.random()
 cloud.rotation.y = Math.random() 
 cloud.rotation.z = Math.random() 

 scene.add(cloud)


})
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de implementar una distancia mínima entre nubes podría ser crear un arreglo para almacenar los datos de posición de cada nube a medida que se generan. Luego, para cada nueva nube generada, puedes recorrer el arreglo y calcular la distancia entre la nueva nube y cada nube existente utilizando la fórmula de distancia:

    distancia = Math.sqrt((x2 - x1)**2 + (z2 - z1)**2)
    

    Si la distancia calculada es menor que la distancia mínima que deseas establecer, entonces puedes ajustar la posición de la nueva nube antes de agregarla a la escena. Aquí tienes un ejemplo de implementación basado en el código proporcionado:

    const positionsNube = [];
    
    for (let i = 0; i < 10; i += 1) {
      ...
    
      // Almacena la posición de la nueva nube en el arreglo
      const posicionNube = {
        x: nube.position.x,
        z: nube.position.z
      };
      positionsNube.push(posicionNube);
    
      // Verifica la distancia a las nubes existentes y ajusta si es necesario
      for (let j = 0; j < positionsNube.length - 1; j += 1) {
        const dist = Math.sqrt((positionsNube[j].x - nube.position.x)**2 +
                               (positionsNube[j].z - nube.position.z)**2);
        if (dist < 10) {
          // Ajusta la posición desplazando en una dirección aleatoria
          const desplazamiento = {
            x: (Math.random() - 0.5) * 20,
            z: (Math.random() - 0.5) * 20
          };
          nube.position.x += desplazamiento.x;
          nube.position.z += desplazamiento.z;
          // Actualiza la posición en el arreglo
          posicionNube.x = nube.position.x;
          posicionNube.z = nube.position.z;
          positionsNube[positionsNube.length - 1] = posicionNube;
          // Reinicia el bucle interno para verificar con todas las nubes existentes nuevamente
          j = -1;
        }
      }
    
      ...
    }
    

    En este ejemplo, la distancia mínima se establece en 10 unidades, pero puedes ajustar este valor según sea necesario. El valor desplazamiento se utiliza para mover la nueva nube a una nueva posición si su posición original está demasiado cerca de otra nube, y se genera de forma aleatoria. Ten en cuenta que el bucle interno comienza en el índice 0 y llega a positionsNube.length - 2, ya que no es necesario verificar la nube recién agregada contra sí misma. El -1 en el reinicio del bucle interno se utiliza para tener en cuenta la instrucción j += 1 que le sigue.

Comments are closed.