Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

201
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda