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

如何获取构成墙的每个立方体的坐标

  •  2
  • CZProgrammer2  · 技术社区  · 7 年前

    我正在编码的3D房间中实现碰撞。我有一个迷宫类,在该类中,我在列表中将房间的边界设置为true,以保存有关多维数据集将在何处绘制的信息:

    public class Labyrinth {
    
    private boolean [][] wall = new boolean[21][21];
    private boolean [][] ground = new boolean[21][21];
    
    public Labyrinth() {
        super(); 
        this.initializeMap();
    
    }   
    
    
    private void initializeMap() {
    
        // inicializace zdí okolo celého bludiště
        for(int x = 0; x < 21; x=x+2) {
            wall[x][0] = true;
            wall[x][20] = true;
        }
    
        for(int y = 0; y < 21; y=y+2) {
            wall[0][y] = true;
            wall[20][y] = true;
        }
    

    在渲染类中,我在墙设置为true的任何位置绘制立方体。看起来是这样的:

    / render labyrintu
        for(int i=0; i<21; i++) {
            for(int j=0; j<21; j++) {
                if(labyrinth.getWall()[i][j]) {                   
                      gl.glTranslatef((float)i, 0f, (float)j);
                      wallTexture.enable(gl);
                      wallTexture.bind(gl);
                      gl.glBegin(GL2.GL_QUADS);
    
                    // Front Face
                      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);
                      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f);
                      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f);
                      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f);
    
                      // Back Face
                      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f);
                      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f);
                      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f);
                      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f);
    
                      // Top Face
                      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f);
                      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f);
                      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f);
                      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f);
    
                      // Bottom Face
                      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f);
                      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f);
                      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f);
                      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);
    
                      // Right face
                      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f);
                      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f);
                      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f);
                      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f);
    
                      // Left Face
                      gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f);
                      gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f);
                      gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f);
                      gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f);
                      gl.glEnd();
                      gl.glTranslatef((float)-i, 0f, (float)-j);
    
                }                 
            }
        }
    

    我现在想做的是使用AABB算法实现碰撞。为此,我需要知道我画的每个立方体的x,y,z坐标。然后我可以简单地将它们与摄像机的坐标进行比较。我想这样做:

        public static boolean checkCollision(ObjectBox a, ObjectBox b){
    {
       //check the X axis
       if(Math.abs(a.getX() - b.getX()) < a.getSizeX() + b.getSizeX())
       {
          //check the Y axis
          if(Math.abs(a.getY() - b.getY()) < a.getSizeY() + b.getSizeY())
          {
              //check the Z axis
              if(Math.abs(a.getZ() - b.getZ()) < a.getSizeZ() + b.getSizeZ())
              {
                 return true;
              }
          }
       }
    
       return false;
    } 
    

    我怎样才能得到每个立方体的坐标呢?

    1 回复  |  直到 7 年前
        1
  •  0
  •   meowgoesthedog    7 年前

    从渲染代码来看,AABB是边长为2的立方体,以 (i, 0, j) 哪里 i, j 是整数。因此,对于索引为 i、 j :

    • getX() 应返回 i ;Y和Z的情况类似
    • getSizeX() 应返回1(边长的一半); 相同的 对于Y和Z