Pregunta

Estoy tratando de girar y mover un triángulo en una dirección determinada, en base a la dirección de puntería del triángulo. En teoría, puedo calcular el seno y el coseno de la dirección (0-360 grados) y añadir a estos valores a los ejes x e y posiciones, ¿verdad? Simplemente no funciona.

Además, el triángulo debe apuntar hacia arriba en un principio, no hacia abajo.

public void speedUp() {
  float dirX, dirY;
  speed *= acceleration;
  if(speed > 50) speed = 50;
  println("dir: " + direction + " x: " + cos(direction) + " y: " + sin(direction));
  dirX = cos(direction);
  dirY = sin(direction);
  xPos+=dirX;
  yPos+=dirY;
}

public void redraw() {
  GL gl = pgl.beginGL();  // always use the GL object returned by beginGL
  gl.glTranslatef(xPos, yPos, 0);
  gl.glRotatef(direction, 0, 0, 1000);

  gl.glBegin(GL.GL_TRIANGLES);
  gl.glColor4f(0.1, 0.9, 0.7, 0.8);
  gl.glVertex3f(-10, -10, 0);    // lower left vertex
  gl.glVertex3f( 10, -10, 0);    // lower right vertex
  gl.glVertex3f( 0,  15, 0);    // upper vertex
  gl.glEnd();
}
¿Fue útil?

Solución

Parece que necesita para convertir de coordenadas polares (que se mueven sobre el uso de un ángulo y un radio) a las coordenadas cartesianas (que se mueven sobre el uso de la X e Y).

La fórmula parece un poco a esto:

x = cos(angle) * radius;
y = sin(angle) * radius;

Por lo tanto, como se menciona @Lie Ryan, también hay que multiplicar la velocidad (que es su radio en coordenadas polares).

Ya sea que su ángulo en grados pero el uso radianes () cuando se utiliza cos, sin medida que trabajan con radianes, o radianes uso, y grados () con < strong> glRotatef , hasta que

Además, es posible que desee echar un vistazo a glPushMatrix () y glPopMatrix (). Bascially, que le permite a las transformaciones del nido. Cualquiera que sea transformaciones usted withing los bloques, que sólo afectan a ese bloque localmente.

Esto es lo que quiero decir, el uso w, a, s, d claves:

import processing.opengl.*;
import javax.media.opengl.*;

float direction = 0;//angle in degrees
float speed = 0;//radius
float xPos,yPos;

void setup() {
  size(600, 500, OPENGL);
}

void keyPressed(){
  if(key == 'w') speed += 1;
  if(key == 'a') direction -= 10;
  if(key == 'd') direction += 10;
  if(key == 's') speed -= 1;
  if(speed > 10) speed = 10;
  if(speed < 0) speed = 0;
  println("direction: " + direction + " speed: " + speed);
}

void draw() {
  //update
  xPos += cos(radians(direction)) * speed;
  yPos += sin(radians(direction)) * speed;
  //draw
  background(255);
  PGraphicsOpenGL pgl = (PGraphicsOpenGL) g; 
  GL gl = pgl.beginGL();
  gl.glTranslatef(width * .5,height * .5,0);//start from center, not top left

  gl.glPushMatrix();
  {//enter local/relative
    gl.glTranslatef(xPos,yPos,0);
    gl.glRotatef(direction-90,0,0,1);
    gl.glColor3f(.75, 0, 0);
    gl.glBegin(GL.GL_TRIANGLES);
    gl.glVertex2i(0, 10);
    gl.glVertex2i(-10, -10);
    gl.glVertex2i(10, -10);
    gl.glEnd();
  }//exit local, back to global/absolute coords
  gl.glPopMatrix();

  pgl.endGL();
}

Usted no necesita realmente el {} para la inserción y extracción de la matriz llamadas, les añadí como una ayuda visual. Además, se puede hacer esto sin push / pop, mediante la concatenación de sus transformaciones, pero es muy útil para saber los que están ahí para su cuando los necesite. Podría ser útil cuando se desea disparar algunos GL_LINES de ese triángulo ... banco del banco del banco!

HTH

Otros consejos

Usted tiene sus unidades en mal estado. exceptúa glRotatef grados y las funciones trigonométricas esperan radianes . Este es el error más evidente.


Además, speed nunca se usa en el fragmento. Supongo que cada cuadro que se está usando de alguna manera, pero en el código que ha pegado hay:

xPos+=dirX

¿Qué es, básicamente, "dirección añadir a la posición" - no tiene mucho sentido, a menos que desee "moverlo exactamente 1 unidad en la dirección dada instantenously en el momento en speedUp() se llama El. enfoque habitual para el movimiento continuo sería:

// each frame:
xPos += dirX * speed * deltaTime;
yPos += dirY * speed * deltaTime;

Prueba esto:

dirX = speed * cos(direction);
dirY = speed * sin(direction);

Es obvio que eres nuevo en OpenGL, por lo que te recomendaría, que se mira en cuaterniones para hacer sus roations. Aquí están dos muy bonito artículo sobre este asunto: GameDev y Nehe . Yo recomendaría que usted utilice la clase Quaternion del JMonkeyEngine. Basta con retirar la salvables y algunas otras interfaces y se les puede utilizar con facilidad. Aquí se encuentran: JMonkey fuente

También utilizar las clases de matemáticas JME para mis propios proyectos. Ya he rayado la mayor parte de las dependencias y se puede descargar algunas clases de aquí: instantáneas de volumen . Sin embargo la clase Quaternion no está presente, pero se necesita Vector3f:. D

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top