使用球坐标三个js在球体上移动点
Moving point on sphere using spherical coordinates three js
我正在尝试在球体表面随机移动一个点。目前我正在尝试通过生成随机球坐标然后使用函数 .setFromSphericalCoords()
将它们转换为 3d 位置来做到这一点
这是每帧生成一个新的随机球坐标的代码:
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
和 phi
的值范围是什么theta
是。
如果有什么不清楚的地方,请告诉我,我会澄清的!
因为phi
和theta
是弧度,而不是度数。
所以 Math.random() * 2 -1
对于弧度来说太大了。
并且根据current implementaion,这些参数似乎没有范围限制。
不是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;
}
我正在尝试在球体表面随机移动一个点。目前我正在尝试通过生成随机球坐标然后使用函数 .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
和 phi
的值范围是什么theta
是。
如果有什么不清楚的地方,请告诉我,我会澄清的!
因为phi
和theta
是弧度,而不是度数。
所以 Math.random() * 2 -1
对于弧度来说太大了。
并且根据current implementaion,这些参数似乎没有范围限制。
不是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;
}