0

Minecraft の noob バージョンのクローンを作成しています。まず、立方体をレンダリングし、特定のテクスチャをすべての側面に追加したいと考えました。入力からの頂点を含む Block クラスを作成し、RenderBlock という名前の出力関数を持ち、テクスチャが添付された「ブロック」をレンダリングします。

これは、ブロックの 8 つの頂点の 8 つの座標を表す 8 つの配列を入力する関数です。

void Block::SetVertices(float UL[],float UR[],float ZR[],float ZL[],float UL2[],float           UR2[],float ZR2[],float ZL2[])
{
  Front_Square[1][1]=UL[1];
  Front_Square[1][2]=UL[2];
  Front_Square[1][3]=UL[3];
  std::cout << "Front Top Left Coordinates" << std::endl;    
  std::cout << Front_Square[1][1] << ","<<Front_Square[1][2] << "," << Front_Square[1][3] << std::endl;
  Front_Square[2][1]=UR[1];
  Front_Square[2][2]=UR[2];
  Front_Square[2][3]=UR[3];
  std::cout << "Front Top Right Coordinates" << std::endl;    
  std::cout << Front_Square[2][1] << ","<<Front_Square[2][2] << "," << Front_Square[2][3] << std::endl;
  Front_Square[3][1]=ZR[1];
  Front_Square[3][2]=ZR[2];
  Front_Square[3][3]=ZR[3];
  std::cout << "Front Bottom Right Coordinates" << std::endl;    
  std::cout << Front_Square[3][1] << ","<<Front_Square[3][2] << "," << Front_Square[3][3] << std::endl;
  Front_Square[4][1]=ZL[1];
  Front_Square[4][2]=ZL[2];
  Front_Square[4][3]=ZL[3];
  std::cout << "Front Bottom Left Coordinates" << std::endl;    
  std::cout << Front_Square[4][1] << ","<<Front_Square[4][2] << "," << Front_Square[4][3] << std::endl;
  //--------------BACK SQUARE------------------------------------------------------------------------------------------------------------------------//  
  Back_Square[1][1]=UL2[1];
  Back_Square[1][2]=UL2[2];
  Back_Square[1][3]=UL2[3];

  Back_Square[2][1]=UR2[1];
  Back_Square[2][2]=UR2[2];
  Back_Square[2][3]=UR2[3];

  Back_Square[3][1]=ZR2[1];
  Back_Square[3][2]=ZR2[2];
  Back_Square[3][3]=ZR2[3];

  Back_Square[4][1]=ZL2[1];
  Back_Square[4][2]=ZL2[2];
  Back_Square[4][3]=ZL2[3]; 
};

そして、これがブロックをレンダリングする関数です。

void Block::RenderBlock(const char*SideTexture)
{
 glEnable(GL_TEXTURE_2D);
 Tex[1]=loadTexture(SideTexture); 
 glBindTexture(GL_TEXTURE_2D, Tex[1]);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
 glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(Front_Square[1][1],Front_Square[1][2],Front_Square[1][3]);//FTL
glTexCoord2f(1.0f, 1.0f); glVertex3f(Front_Square[2][1],Front_Square[2][2],Front_Square[2][3]);//FTR
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[3][1],Front_Square[3][2],Front_Square[3][3]);//FBR
glTexCoord2f(0.0f, 0.0f); glVertex3f(Front_Square[4][1],Front_Square[4][2],Front_Square[4][3]);//FBL
     glEnd();

    glBindTexture(GL_TEXTURE_2D, Tex[1]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[1][1],Back_Square[1][2],Back_Square[1][3]);//BTL
glTexCoord2f(1.0f, 1.0f); glVertex3f(Back_Square[2][1],Back_Square[2][2],Back_Square[2][3]);//BTR
glTexCoord2f(1.0f, 0.0f); glVertex3f(Back_Square[3][1],Back_Square[3][2],Back_Square[3][3]);//BBR
glTexCoord2f(0.0f, 0.0f); glVertex3f(Back_Square[4][1],Back_Square[4][2],Back_Square[4][3]);//BBL
     glEnd();


    glBindTexture(GL_TEXTURE_2D, Tex[1]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[1][1],Back_Square[1][2],Back_Square[1][3]);//BTL
glTexCoord2f(1.0f, 1.0f); glVertex3f(Front_Square[1][1],Front_Square[1][2],Front_Square[1][3]);//FTL
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[4][1],Front_Square[4][2],Front_Square[4][3]);//FBL
glTexCoord2f(0.0f, 0.0f); glVertex3f(Back_Square[4][1],Back_Square[4][2],Back_Square[4][3]);//BBL
     glEnd();

    glBindTexture(GL_TEXTURE_2D, Tex[1]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[2][1],Back_Square[2][2],Back_Square[2][3]);//BTR
glTexCoord2f(1.0f, 1.0f); glVertex3f(Front_Square[2][1],Front_Square[2][2],Front_Square[2][3]);//FTR
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[3][1],Front_Square[3][2],Front_Square[3][3]);//FBR
glTexCoord2f(0.0f, 0.0f); glVertex3f(Back_Square[3][1],Back_Square[3][2],Back_Square[3][3]);//BBR
     glEnd();

     glBindTexture(GL_TEXTURE_2D, Tex[1]);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[4][1],Back_Square[4][2],Back_Square[4][3]);//BBL
glTexCoord2f(1.0f, 1.0f); glVertex3f(Back_Square[3][1],Back_Square[3][2],Back_Square[3][3]);//BBR
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[3][1],Front_Square[3][2],Front_Square[3][3]);//FBR
glTexCoord2f(0.0f, 0.0f); glVertex3f(Front_Square[4][1],Front_Square[4][2],Front_Square[4][3]);//FBL
     glEnd();

    glBindTexture(GL_TEXTURE_2D, Tex[1]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(Back_Square[1][1],Back_Square[1][2],Back_Square[1][3]);//BTL
glTexCoord2f(1.0f, 1.0f); glVertex3f(Back_Square[2][1],Back_Square[2][2],Back_Square[2][3]);//BTR
glTexCoord2f(1.0f, 0.0f); glVertex3f(Front_Square[2][1],Front_Square[2][2],Front_Square[2][3]);//FTR
glTexCoord2f(0.0f, 0.0f); glVertex3f(Front_Square[1][1],Front_Square[1][2],Front_Square[1][3]);//FTL
     glEnd();
    glDisable(GL_TEXTURE_2D);
     };

Blocks Dirt と Grass Dirt 用の 2 つのアレイ

float TL[] = {0.0f,-1.0f,1.0f,0.0f};
float TR[] = {0.0f,1.0f,1.0f,0.0f};
float BR[] = {0.0f,1.0f,-1.0f,0.0f};
float BL[] = {0.0f,-1.0f,-1.0f,0.0f};
float TL2[] = {0.0f,-1.0f,1.0f,-2.0f};
float TR2[] = {0.0f,1.0f,1.0f,-2.0f};
float BR2[] = {0.0f,1.0f,-1.0f,-2.0f};
float BL2[] = {0.0f,-1.0f,-1.0f,-2.0f}

float DTL[] = {0.0f,-1.0f,1.0f+Grass_XChan,0.0f};
float DTR[] = {0.0f,1.0f,1.0f+Grass_XChan,0.0f};
float DBR[] = {0.0f,1.0f,-1.0f+Grass_XChan,0.0f};
float DBL[] = {0.0f,-1.0f,-1.0f+Grass_XChan,0.0f};
float DTL2[] = {0.0f,-1.0f,1.0f+Grass_XChan,-2.0f};
float DTR2[] = {0.0f,1.0f,1.0f+Grass_XChan,-2.0f};
float DBR2[] = {0.0f,1.0f,-1.0f+Grass_XChan,-2.0f};
float DBL2[] = {0.0f,-1.0f,-1.0f+Grass_XChan,-2.0f};

長いコードで申し訳ありません。Main.cpp をご覧になりたい場合は、こちらをご覧ください。

#include <GL/glut.h>
#include <iostream>
#include <assert.h>
#include <fstream>
#include "block.h"
using namespace std;
float positionX = 0.0f;
float positionY = 0.0f;
float positionZ = -4.0f;
float angle = 0.0f;
float RotX=0.01f;
float RotY=0.0f;
float RotZ=0.0f;
float Grass_XChan=2.0f;
float Grass_ZChan=-2.0f;
bool Render = true;
Block Dirt;
Block Grass;
float TL[] = {0.0f,-1.0f,1.0f,0.0f};
float TR[] = {0.0f,1.0f,1.0f,0.0f};
float BR[] = {0.0f,1.0f,-1.0f,0.0f};
float BL[] = {0.0f,-1.0f,-1.0f,0.0f};
float TL2[] = {0.0f,-1.0f,1.0f,-2.0f};
float TR2[] = {0.0f,1.0f,1.0f,-2.0f};
float BR2[] = {0.0f,1.0f,-1.0f,-2.0f};
float BL2[] = {0.0f,-1.0f,-1.0f,-2.0f};

float DTL[] = {0.0f,-1.0f,1.0f+Grass_XChan,0.0f};
float DTR[] = {0.0f,1.0f,1.0f+Grass_XChan,0.0f};
float DBR[] = {0.0f,1.0f,-1.0f+Grass_XChan,0.0f};
float DBL[] = {0.0f,-1.0f,-1.0f+Grass_XChan,0.0f};
float DTL2[] = {0.0f,-1.0f,1.0f+Grass_XChan,-2.0f};
float DTR2[] = {0.0f,1.0f,1.0f+Grass_XChan,-2.0f};
float DBR2[] = {0.0f,1.0f,-1.0f+Grass_XChan,-2.0f};
float DBL2[] = {0.0f,-1.0f,-1.0f+Grass_XChan,-2.0f};
void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(positionX, positionY, positionZ);
  glPushMatrix();
  glRotatef(angle,RotX,RotY,RotZ);
  Dirt.RenderBlock("C:/Users/Progr_Anim/Desktop/textures/DirtBottom.bmp");
  Grass.RenderBlock("C:/Users/Progr_Anim/Desktop/textures/GrassTop.bmp");

  glPopMatrix();
  glutSwapBuffers();
   }
  //-------------------------------------------------------------------------------------------------------------------------------------------
    void HandleResize(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float)w / (float)h, 1.0, 200.0);
   }
   void Camera(unsigned char key,int x,int y)
   {
   switch(key)
 {
  case 'w':
       positionZ += 0.08f;
       break;
  case 's':
       positionZ -= 0.08f;
       break;
  case 'a':
       positionX += 0.08f;
       break;
  case 'd':
       positionX -= 0.08f;
       break;
  case 'c':
       if(angle>=360.0f)
       {
       angle=0.0f;                
       }
       angle+=5.0f;
       break;
  case '1':
       angle = 0.0f;
       RotX=1.0f;
       RotY=0.0f;
       RotZ=0.0f;
       break;
  case '2':
       angle = 0.0f;
       RotX=0.0f;
       RotY=1.0f;
       RotZ=0.0f;
       break;
  case '3':
       angle = 0.0f;
       RotX=0.0f;
       RotY=0.0f;
       RotZ=1.0f;
       break;
  case 'q':
       exit(0);
       break;
     }     
  }
 int main(int argc, char** argv)
 {
   Dirt.SetVertices(TL,TR,BR,BL,TL2,TR2,BR2,BL2);
   Grass.SetVertices(DTL,DTR,DBR,DBL,DTL2,DTR2,DBR2,DBL2);
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
   //Create Window
   glutInitWindowSize(640,480);
   glutCreateWindow("Love");
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_COLOR_MATERIAL);
   glutDisplayFunc(display);
   glutReshapeFunc(HandleResize);
   glutKeyboardFunc(Camera);
   glutIdleFunc(display);
   glutMainLoop();
     return 0;
    }

これは、上に草ブロック、下に土ブロックがある回転立方体のビデオです。 リンク

4

1 に答える 1

1

投稿には十分な情報がないと思うので、ここで回答をパントします。

このコードの配列は、0 番目の要素が存在しないかのように使用されており、使用されている配列の定義には、パディングとして前に余分なゼロがあります。

ただし、一部の配列はここのコードでは定義されておらず、別の場所で宣言する必要があります。おそらくサイズが指定されています。このサイズは、1 インデックスの配列では間違っていると推測します。

つまりback_squarefront_squareおそらく次のように宣言されています。

float back_square[4][3];

それよりも:

float back_square[5][4];

それが彼らがどのように使用されているかです。

その結果、未定義の動作が発生します。この場合、頂点が上書きされ、立方体の 1 つのコーナーが崩壊する可能性があります。

いずれにせよ、このような方法で配列を使用するのではなく、ゼロから始めることに慣れることを強くお勧めします。

于 2013-01-02T09:43:26.370 に答える