#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 }