Генерация частиц для спиральной галактики в THREE.js

Простой и чистый способ печати 2D-массива.

System.out.println(Arrays.deepToString(array).replace("], ", "]\n").replace("[[", "[").replace("]]", "]"));
2
задан Michal 6 March 2019 в 17:44
поделиться

1 ответ

Похоже, вы уже проделали большую часть тяжелой работы с полярной системой координат. Имейте в виду, однако, что углы указаны в радианах, а не в градусах, поэтому вместо использования 360 следует использовать PI * 2. Теперь все, что вам нужно сделать, это одновременно увеличить distance и theta, чтобы создать спираль, а phi остается близким к 0, чтобы создать плоскость эклиптики галактики.

  • distance будет расти с 0 до galaxySize
  • theta будет расти с 0 до Math.PI (или PI * 2, если вы хотите более плотные спирали)
  • phi остается близким к 0
// Temp variables to assign new values inside loop
var norm, theta, phi, thetaVar, distance;

// Generate particles for spiral galaxy:
for (let i = 0; i < 1000; i++) {
    // Norm increments from 0 to 1
    norm = i / 1000;

    // Random variation to theta [-0.5, 0.5]
    thetaVar = THREE.Math.randFloatSpread(0.5);

    // Theta grows from 0 to Math.PI (+ random variation)
    theta = norm * Math.PI + thetaVar;

    // Phi stays close to 0 to create galaxy ecliptic plane
    phi = THREE.Math.randFloatSpread(0.1);

    // Distance grows from 0 to galaxySize
    distance = norm * galaxySize;

    // Here I need generate spiral arms instead of sphere.
    geometry.vertices.push(new THREE.Vector3(
        distance * Math.sin(theta) * Math.cos(phi),
        distance * Math.sin(theta) * Math.sin(phi),
        distance * Math.cos(theta)
    ));
}

Вы можете создать одну петлю для каждой руки. Обратите внимание, что вместо деления на 10 в конце, как вы делали в своем примере, я просто ограничил диапазон phi до [-0.1, 0.1]. Вы можете увидеть это в действии в этой скрипке

0
ответ дан Marquizzo 6 March 2019 в 17:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: