首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >球面上的运动点用球面坐标三js

球面上的运动点用球面坐标三js
EN

Stack Overflow用户
提问于 2019-03-18 16:15:59
回答 2查看 1.4K关注 0票数 1

我现在正试图在球体表面上随机移动一个点。目前,我正试图通过生成随机的球面坐标,然后用函数.setFromSphericalCoords()将这些坐标转换成三维位置来实现这一点。

这是代码的样子,它生成一个新的随机球面坐标,每个帧:

代码语言:javascript
运行
复制
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)));

这是可行的,但目前我的球点并没有真正地在球体上移动,而是跳了很远的距离。

我认为这与我作为phitheta提供的值有关,但问题是我不知道phitheta的值范围是什么。

如果有什么不清楚,让我知道,这样我就可以澄清!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-18 22:44:13

不是three.js,但这应该很容易翻译。如你所知,这是在处理:

代码语言:javascript
运行
复制
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;
}

票数 1
EN

Stack Overflow用户

发布于 2019-03-18 16:31:55

这是因为phitheta使用的是弧度,而不是学位。

所以Math.random() * 2 -1对弧度来说太大了。

根据现行实施的说法,这些参数似乎没有范围限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55225708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档