Перемещение точки на сфере по сферическим координатам три js - PullRequest
1 голос
/ 18 марта 2019

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

Вот как выглядит код, который генерирует новую случайную сферическую координату в каждом кадре:

element.kralenSpherical.phi += Math.random() * 2 -1;
if(element.kralenSpherical.phi <= 0 ) element.kralenSpherical.phi = 0;
else if(element.kralenSpherical.phi >= 180 ) element.kralenSpherical.phi = 180;
element.kralenSpherical.theta += Math.random() * 2 -1;
if(element.kralenSpherical.theta >= 360 ) element.kralenSpherical.theta = 0;
else if(element.kralenSpherical.theta <= 0) element.kralenSpherical.theta = 360;

element.kraal.position.copy(element.BaseLocation.clone().add(sphericalVector.setFromSphericalCoords(element.kralenSpherical.radius, element.kralenSpherical.phi, element.kralenSpherical.theta)));

это вроде работает, но в настоящее время моя точка сферы на самом деле не движется по сфере, а прыгает на огромные расстояния.

Я думаю, это связано с тем, какие значения я предоставляю как phi и theta, но проблема в том, что я понятия не имею, каков диапазон значений phi и theta.

Если что-то не понятно, дайте мне знать, чтобы я мог уточнить!

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Это потому, что phi и theta в радианах , а не в градусах.

так что Math.random() * 2 -1 слишком велико для радиан.

и в соответствии с текущей реализацией , кажется, нет предела диапазона для этого параметра.

0 голосов
/ 19 марта 2019

Не Three.js, но это должно быть легко перевести. Как вы хорошо знаете, это обработка:



void setup() {
  size(300, 300, P3D);  
  frameRate(300);
  background(0);
}

void draw() {

  lights();
  translate(width/2, height/2);
  stroke(255,255,0);
  noFill();
  //sphere(75);

  PVector v = noise_spherical_point(frameCount * 0.009, 75);

  translate(v.x, v.y, v.z);
  fill(255,0,0);
  noStroke();
  sphere(1);

}


PVector noise_spherical_point(float t, float rad) {
  float x = noise(t) * 2 -1;
  float y = noise(0, t)  * 2 -1;
  float z = noise(0, 0, t) * 2 -1;
  PVector v = new PVector(x, y, z);
  v = v.normalize();
  v.mult(rad);
  return v;
}

enter image description here

...