Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

206
Visualizações
¿Cómo haría para escribir un programa para girar en un punto alrededor de una esfera en función de un ángulo como si caminara a su alrededor?

Estoy trabajando en un proyecto en el que necesito (como punto 2d) caminar alrededor de una esfera 3d. Tengo problemas para descubrir cómo lograr esto sin distorsión polar. Básicamente, quiero mover hacia adelante, hacia atrás, hacia la izquierda y hacia la derecha, así como también girar a la izquierda y girar a la derecha. He estado tratando de hacer que esto funcione con coordenadas esféricas, pero mis funciones parecen ser incorrectas. ¿Qué puedo hacer para que esto funcione? (Estoy haciendo esto en JavaScript, usando la biblioteca p5.js)

Actualmente, estoy tratando de asignar una variable xey a phi y theta del espacio esférico respectivamente. Sin embargo, no parece estar funcionando, y no estoy seguro de si, implementado correctamente, el punto se movería en Grandes Círculos.

También estoy usando una variable de ángulo, para mover x e y por (cos(A), sin(A)), pero tampoco estoy seguro de si esto funciona.

Creo que lo que necesito hacer está relacionado con Great Circle Navigation, pero no entiendo las matemáticas detrás de esto.

Enlace a mi versión actual: https://editor.p5js.org/hpestock/sketches/FXtn82-0k

El código actual se parece a

 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φ }
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

No estoy seguro de las matemáticas para hacer esto en coordenadas polares, pero se puede hacer simplemente rastreando la posición y la orientación como un par de vectores cartesianos 3D y usando la fórmula de rotación de Rodrigues para avanzar (girando la posición) y girar ( girando el eje).

 // position vector let pos; // axis of rotation let axis; let scaler = 150; function setup() { createCanvas(400, 400, WEBGL); background(220); pos = createVector(1, 0, 0); axis = createVector(0, 1, 0); fill('red'); noStroke(); } function draw() { if (keyIsDown(87) || keyIsDown(UP_ARROW)) { // move "forward" rotateVector(pos, axis, PI / 64); } if (keyIsDown(LEFT_ARROW)) { // turn left rotateVector(axis, pos, -PI / 64); } if (keyIsDown(RIGHT_ARROW)) { // turn right rotateVector(axis, pos, PI / 64); } ambientLight(100); directionalLight(200, 200, 200, 1, 1, -1); push(); translate(pos.x * scaler, pos.y * scaler, pos.z * scaler); sphere(5); pop(); } function rotateVector(v, axis, angle) { // v * cos(θ) + (axis ✕ v) * sin + axis * (axis · v) * (1 - cos) return v.mult(cos(angle)) .add(axis.copy().cross(v).mult(sin(angle))) .add(axis.copy().mult(axis.dot(v) * (1 - cos(angle)))); }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>

about 4 years ago · Juan Pablo Isaza Relatório

0

No sé javascript, pero podría implementar las siguientes funciones (que implementé en python y espero que pueda leer de ellas la lógica matemática / geométrica detrás de ellas) que le permiten seleccionar una dirección de movimiento en la esfera, para mover a lo largo de un gran círculo a lo largo de un paso de ángulo dado ds, y para cambiar las direcciones de movimiento. Estoy asumiendo que el movimiento está en la esfera unitaria (de radio 1). De lo contrario, debe escalar el código al radio apropiado.

 import numpy as np import math def direct(r, a): ''' given position-vector r on the unit sphere and initial angle a, measured from the meridian, ie direction north being a = 0, the result is the unit vector t pointing in that direction ''' e_z = np.array([0,0,1]) u = np.cross(e_z, r) u = u / math.sqrt(u.dot(u)) v = np.cross(r, u) t = math.cos(a) * v + math.sin(a) * u return r, t def move(r, t, ds): ''' given unit position-vector r and unit direction vector t on the unit sphere, make a step of arclength ds radians from point r in the direction of t along the great circle that passes through r and tangent to t. The result is the new position r_ and the new direction vector t_ still tangent to the same great circle. ''' co = math.cos(ds) cs = math.sin(ds) r_ = co * r + si * t t_ = -si * r + cs * t return t_, t_ def redirect(r, t, da): ''' given unit position-vector r and unit direction vector t on the unit sphere, rotate the vector t at an angle da. The result is the new direction vector t_ when da > 0 redirect right when da < 0 redirect left ''' rot_axis = np.cross(r, t) t_ = math.cos(da) * t - math.sin(da) * rot_axis return r, t_
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda