私は(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φ
}