让一个生物面对它在opengl中移动的方向

时间:2014-11-05 03:10:53

标签: opengl glut jogl

下面是我的spider.java类(虽然现在蜘蛛只是一个球体和一根棍子)

import javax.media.opengl.*;

import com.jogamp.opengl.util.*;
import com.jogamp.opengl.util.gl2.GLUT;

import java.util.*;

public class Spider
{
  private int spider_object;
  private int texture;
  private float x, y, z; // position

  private float travel_speed;
  private float travel_dir_x;
  private float travel_dir_y;
  private float travel_dir_z;

  public Spider( float _x, float _y, float _z, 
          float _travel_speed)
  {
      x = _x;
      y = _y;
      z = _z;
      travel_speed = _travel_speed;


      travel_dir_x = 0.4f;
      travel_dir_y = 0.5f;
      travel_dir_z = 0.5f;
  }

  public void init( GL2 gl )
  {

    spider_object = gl.glGenLists(1);
    gl.glNewList( spider_object, GL2.GL_COMPILE );


    // create the spider
    GLUT glut = new GLUT();
    //glut.glutSolidSphere( 1, 10, 10 );
    glut.glutSolidCube(1);
    glut.glutSolidCylinder(0.2, 2, 10, 10);


    gl.glEndList();

  }



  public void update( GL2 gl )
  {
    translate();

  }

  public void translate()
  {
      x += travel_speed*travel_dir_x;
      y += travel_speed*travel_dir_y;
      z += travel_speed*travel_dir_z;

      if(x > 2 || x < -2)
          travel_dir_x = -travel_dir_x;
      if(y > 2 || y < -2)
          travel_dir_y = -travel_dir_y;
      if(z > 2 || z < -2)
          travel_dir_z = -travel_dir_z;

  }

  public void draw( GL2 gl )
  {
    gl.glPushMatrix();
    gl.glPushAttrib( GL2.GL_CURRENT_BIT );
    gl.glTranslatef(x, y, z);
    gl.glRotatef( -90, 0, 1, 0 );
    gl.glScalef(0.3f, 0.3f, 0.3f);


    if (travel_dir_x > 0)
        gl.glRotatef(-45, 0, 0, 0);    
    else
        gl.glRotatef(135, 0, 0, 0);

    if (travel_dir_y > 0)
        gl.glRotatef(-90, 0, 1, 0);    
    else
        gl.glRotatef(90, 0, 1, 0);

    gl.glColor3f( 0.85f, 0.55f, 0.20f); // Orange
    gl.glCallList( spider_object );
    gl.glPopAttrib();
    gl.glPopMatrix();
  }

}

我的目标是让这个生物转身并在它撞到墙壁时继续移动&#34;在一个4x4坦克。下面的代码片段显示,当您触及x,y或z墙的边缘时,该生物将反转其方向

      if(x > 2 || x < -2)
          travel_dir_x = -travel_dir_x;
      if(y > 2 || y < -2)
          travel_dir_y = -travel_dir_y;
      if(z > 2 || z < -2)
          travel_dir_z = -travel_dir_z;

到目前为止,我想我已经想出了如何让它在击中&#34;左边&#34;时左右移动。和&#34;对&#34;模拟首次开始时的墙。 (根据摄像机角度,可能不是左右)。

以下代码是我认为使生物反向并且在撞墙时继续向前移动的代码。以下代码取自 draw()函数

    if (travel_dir_x > 0)
        gl.glRotatef(-45, 0, 0, 0);    
    else
        gl.glRotatef(135, 0, 0, 0);

如果我搞砸了那些代码,我的生物就会消失。然而,我可以将x,y或z参数更改为1并使其以不同的角度移动。

我对上面代码的理解是否正确?我怎样才能使它在生物开始向三维方向移动时,它会看到x,y和z的特定组合,而不是只看到&#34;左&#34;看看&#34;对&#34; ??

0 个答案:

没有答案