代码之家  ›  专栏  ›  技术社区  ›  Patrick

OpenGL+处理:基于方向的旋转和移动

  •  2
  • Patrick  · 技术社区  · 14 年前

    我试着旋转并移动一个三角形到一个特定的方向,基于三角形的指向。理论上,我计算方向的正弦和余弦(0-360度),然后把这些值加到x和y位置,对吧?只是不起作用。

    另外,三角形应该在开始时向上,而不是向下。

    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();
    }
    
    4 回复  |  直到 14 年前
        1
  •  5
  •   George Profenza    14 年前

    看起来需要从极坐标(使用角度和半径移动)转换为笛卡尔坐标(使用x和y移动)。

    公式看起来有点像这样:

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

    因此,正如@Lie Ryan提到的,你还需要与速度相乘(这是你在极坐标系中的半径)。

    或者用度数表示角度,但是用 弧度() 当使用cos时,sin与弧度一起工作,或者使用弧度,然后使用 度() 具有 格洛特夫 ,由你决定

    另外,您可能需要查看glPushMatrix()和glPopMatrix()。基本上,它们允许您嵌套转换。无论您对块执行什么转换,它们只会在本地影响该块。

    我的意思是,用w,a,s,d键:

    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();
    }
    

    对于push和pop矩阵调用,您实际上不需要{},我将它们添加为视觉帮助。此外,通过连接转换,您可以不使用push/pop来实现这一点,但是当您需要它们时,知道它们在那里很方便。当你想从三角形中射出一些glu线的时候,也许会派上用场…皮尤皮尤!

    高温高压

        2
  •  5
  •   Kos    14 年前

    你的单位搞砸了。 glRotatef 例外 三角函数 弧度 . 这是最明显的错误。


    也, speed 从未在你的代码片段中使用过。我想你用的每一帧都是这样的,但是在你粘贴的代码中有:

    xPos+=dirX

    基本上就是“给位置增加方向”-没什么意义,除非你想 “当 speedUp() 被称为 . 连续运动的通常方法是:

    // each frame:
    xPos += dirX * speed * deltaTime;
    yPos += dirY * speed * deltaTime;
    
        3
  •  3
  •   Lie Ryan Bryan    14 年前

    试试这个:

    dirX = speed * cos(direction);
    dirY = speed * sin(direction);
    
        4
  •  3
  •   iuiz    14 年前

    显然,你对OpenGl还不熟悉,所以我建议你,你应该研究四元数来进行漫游。关于这件事,这里有两篇相当不错的文章: Gamedev Nehe . 我建议您使用JMonkeyEngine中的四元数类。只需删除savable和其他一些接口,就可以轻松使用它们。它们位于: JMonkey Source

    我也使用JME数学课程来完成自己的项目。我已经删除了大部分依赖项,您可以从这里下载一些类: Volume Shadow . 但是四元数类丢失了,但是您需要Vector3f:D。