Ошибка OpenGl. Вершина куба в неправильном месте во время выполнения?

Я создаю новую версию клона Minecraft. Для начала я хотел визуализировать куб и добавить определенную текстуру ко всем сторонам, чтобы начать. Я создал класс 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);
};

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

Вот видео с вращающимися кубиками с блоком Grass сверху и блоком грязи снизу.
Ссылка на сайт

0

Решение

Я собираюсь понюхать ответ здесь, так как не думаю, что в посте достаточно информации.

Массивы в этом коде используются так, как будто 0-й элемент не существует, а определения используемых массивов имеют дополнительный ноль спереди в качестве заполнения.

Однако некоторые массивы здесь не определены в коде и должны быть объявлены в другом месте, возможно, с размером. Я собираюсь догадаться, что этот размер не подходит для 1-индексированного массива.

то есть back_square а также front_square вероятно объявлено что-то вроде:

float back_square[4][3];

скорее, чем:

float back_square[5][4];

вот как они используются.

Результатом будет неопределенное поведение, которое в данном случае может быть перезаписью вершины, свернувшей один угол куба.

В любом случае, я настоятельно рекомендую не используя массивы таким образом, и привыкая к вещам, начинающимся с нуля.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]