我正在做一个项目,我需要(作为 2d 点)绕着 3d 球体走动。我无法弄清楚如何在没有极性失真的情况下实现这一目标。基本上我想要前进、后退、左转和右转,以及左转和右转。我一直在尝试使用球坐标进行此操作,但我的功能似乎不正确。我该怎么做才能让它工作?(我正在使用 p5.js 库在 JavaScript 中制作这个)
目前,我正在尝试将 x 和 y 变量分别映射到球形空间的 phi 和 theta。但是,它似乎不起作用,而且我不确定正确实施该点是否会在大圈中移动。
我还使用角度变量将 x 和 y 移动 (cos(A), sin(A)),但我不确定这是否也有效。
我认为我需要做的是与大圆导航有关,但我不了解它背后的数学。
链接到我当前的版本:https ://editor.p5js.org/hpestock/sketches/FXtn82-0k
当前代码看起来像
var X,Y,Z;
X=0;
Y=0;
Z=0;
var A=0;
var scaler = 100;
var MOVE_FORWARD = true;
var MOVE_BACKWARD= false;
var MOVE_LEFT = false;
var MOVE_RIGHT = false;
var TURN_LEFT = false;
var TURN_RIGHT = false;
//var i=0;
var x = 0;
var y = 0;
function setup() {
createCanvas(400, 400, WEBGL);
x= 0;
y= 0;
A= 0;
background(220);
}
function keyPressed(){
if(key == "w"){
MOVE_FORWARD = true;
}else if(key == "ArrowLeft"){
TURN_LEFT = true;
}else if(key == "ArrowRight"){
TURN_RIGHT = true;
}
}
function keyReleased(){
if(key == "w"){
MOVE_FORWARD = false;
}else if(key == "ArrowLeft"){
TURN_LEFT = false;
}else if(key == "ArrowRight"){
TURN_RIGHT = false;
}
}
function draw() {
if(MOVE_FORWARD){
x+=0.005*cos(A);
y+=0.005*sin(A);
}
if(TURN_LEFT){
A+=PI/64;
}
if(TURN_RIGHT){
A-=PI/64;
}
var xyz = Sph(1,y,x);
X=xyz[0];
Y=xyz[1];
Z=xyz[2];
background(220);
sphere(scaler);
push();
translate(X*scaler,Y*scaler,Z*scaler);
sphere(5);
pop();
/*i+=PI/32;
if(i>2*PI){
i=0;
}*/
}
function Move(a,d){
//
}
function Sph(p,t,h){
//p = radius
//t (theta) = 2d rotation
//h (phi) = 3d roation
return ([p*cos(h)*cos(t),p*cos(h)*sin(t),p*sin(h)]);
//x=ρsinφcosθ,y=ρsinφsinθ, and z=ρcosφ
}