установите минимальное расстояние от двух сеток в THREE.JS

#javascript #three.js #distance #offset #mesh

#язык JavaScript #three.js #расстояние #смещение #меш

Вопрос:

У меня есть этот код, который генерирует некоторые облака в случайном положении, вращении и случайном масштабе. Поскольку они могут быть сгенерированы рядом с другой или рядом с другой сеткой, они могут скрепляться вместе. Я хочу установить минимальное расстояние, например if(cloud position x and z is lt; 10 FROM ANOTHER CLOUD) then set distance , как я могу это сделать? Вот код:

 for(let i = 0; i lt; 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)   }) }  

Ответ №1:

Во-первых, нет ничего постыдного в том, чтобы размещать вещи статически, а затем использовать случайные значения для создания дисперсии. Например, рассмотрим набор из 4 облаков, расположенных по углам квадрата. Если затем вы измените их позиции с помощью случайных значений фиксированного диапазона, вы получите случайный эффект, сохраняя при этом разделение.

 const clouds = [...] // cloud meshes const maxChange = ... // the maximum amount of position change in one direction  const staticPositions = [  new THREE.Vector3(...),  new THREE.Vector3(...),  new THREE.Vector3(...),  new THREE.Vector3(...) ]  for(let i = 0; i lt; 4;   i){   let cloud = clouds[i]   cloud.position.copy(staticPositions[i])   // random variance  cloud.position.x  = (Math.random() * (maxChange * 2)) - maxChange  cloud.position.y  = (Math.random() * (maxChange * 2)) - maxChange  cloud.position.z  = (Math.random() * (maxChange * 2)) - maxChange  }  

Но если вы действительно хотите пойти на полную случайность, вам нужно будет проверить новое положение на всех других облаках, прежде чем совершать его.

 const clouds = [...] // cloud meshes const minDistanceSquared = ... // the minimum (squared) distance allowed between clouds  // checks if a cloud is far enough away from all other clouds function isFarEnoughAway(cloud){  let retVal = true   for(let i = 0, l = clouds.length; i lt; l amp;amp; retVal;   i){  if(cloud !== clouds[i] amp;amp; cloud.position.distanceToSquared(clouds[i].position) lt; minDistSquared){  retVal = false  }  }   return retVal }