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)
})
}
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:
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:
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 apositionsNube.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ónj += 1
que le sigue.