Я пытаюсь закодировать 3D-модель, которую я читаю в вертах из .obj. Все это работало со стандартной моделью чайника, поэтому я решил создать космический корабль для фактического назначения. Затем я изменил его в файле чайника, а затем изменил массивы так, чтобы они были достаточно большими, чтобы верта, нормали вершин и т. Д. Соответствовали, прежде чем пытаться запустить программу, к которой я получил необработанную ошибку нарушения прав доступа. Ниже приведен весь код, который программа использует библиотеку перенасыщения, которую я должен использовать ..
Как примечание стороны, я пытаюсь сделать так, чтобы моя камера двигалась вокруг космического корабля как его источник.
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "glut.h"#include <istream>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>using namespace std;
struct point3D
{
float x;
float y;
float z;
};
struct camera
{
point3D pos;
point3D lookAt;
point3D up;
};
camera cam = {0, 0, 5, 0, 0, 0, 0, 1, 0};point3D v[162] = {};
point3D vn[74] = {};
point3D vt[150] = {};
point3D f[110][3] = {};
void init()
{
glClearColor(0.5, 0.7, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 500);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); // reset the matrix
gluLookAt(cam.pos.x, cam.pos.y, cam.pos.z,
cam.lookAt.x, cam.lookAt.y, cam.lookAt.z,
cam.up.x, cam.up.y, cam.up.z);
glColor3f(1.0, 0.0, 0.0);
glTranslatef(0.0f, 0.0f, -15.0f);for(int i = 0; i < 110; i++)
{
glBegin(GL_TRIANGLES);
int one = f[i][0].x;
int two = f[i][1].x;
int three = f[i][2].x;
glVertex3fv(&(v[one].x));
glVertex3fv(&(v[two].x));
glVertex3fv(&(v[three].x));
glEnd();
}glFlush();
}void specialKeyboard(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_RIGHT:
cam.pos.x+=0.2;
break;
case GLUT_KEY_LEFT:
cam.pos.x-=0.2;
break;
case GLUT_KEY_UP:
cam.pos.y+=0.2;
break;
case GLUT_KEY_DOWN:
cam.pos.y-=0.2;
break;
case GLUT_KEY_PAGE_UP:
cam.pos.z+=0.2;
break;
case GLUT_KEY_PAGE_DOWN:
cam.pos.z-=0.2;
break;
}
glutPostRedisplay();
}
void normalKeyboard(unsigned char key, int x, int y) {
switch (key)
{
case 'w' :
cam.lookAt.y+=0.5;
break;
case 'a' :
cam.lookAt.y-=0.5;
break;
case 's' :
cam.lookAt.x-=0.5;
break;
case 'd' :
cam.lookAt.x+=0.5;
break;
}
glutPostRedisplay();
}
int main(int argc, char* argv[])
{
int numVert = 0;
int numNormals= 0;
int numcoords = 0;
int numFaces = 0;
string test;
ifstream inputFile;
inputFile.open("spaceship.obj");
if (!inputFile.good())
cout << "Problem with Input File";
else
{
while(inputFile >> test) // FIXED
{
inputFile >> test; // SHOULD NOT BE HERE
if (test == "v")
{
inputFile >> v[numVert].x;
inputFile >> v[numVert].y;
inputFile >> v[numVert].z;
numVert++;
}
else if(test == "vn")
{
inputFile >> vn[numNormals].x;
inputFile >> vn[numNormals].y;
inputFile >> vn[numNormals].z;
numNormals++;
}
else if(test == "vt")
{
inputFile >> vt[numcoords].x;
inputFile >> vt[numcoords].y;
inputFile >> vt[numcoords].z;
numcoords++;
}
else if(test == "f")
{
string temp;
for(int count = 0; count < 3; count++)
{
inputFile >> temp;
stringstream stream(temp);
getline(stream, temp, '/');
f[numFaces][count].x = atof(temp.c_str());
getline(stream, temp, '/');
f[numFaces][count].y = atof(temp.c_str());
getline(stream, temp, '/');
f[numFaces][count].z = atof(temp.c_str());
}
numFaces++;
}
}
glutInit(&argc, argv);
glutCreateWindow("rendering a spaceship");
glutDisplayFunc(display);
glutSpecialFunc(specialKeyboard);
glutKeyboardFunc(normalKeyboard);
init();
glutMainLoop();
}
}
Точная ошибка выглядит следующим образом: «Необработанное исключение в 0x779815de в 3dsassignments.exe: 0xC0000005: расположение чтения нарушения доступа 0x40000010».
Самый простой способ отследить нарушения прав доступа в Visual Studio — позволить встроенной ловушке исключений их отладчика сломать вас. Вы можете в Debug / Exceptions / Win32 проверить «Access Violations», а затем просто запустить вашу программу. Обратите внимание, это НЕ будет анализировать ваш код. Это поймает исключение если это произойдет, нет, если это может бывает.
Что касается того, что на самом деле вызывая ваше исключение, я бы рискнул угадать логику для использования !inputFile.eof()
потому что ваше управление while-циклом не заканчивается, когда вы думаете, что оно должно (и, как примечание, это почти никогда не правильно использовать .eof()
как условие контроля цикла). Пытаться while(inputFile >> test)
и удалите inputFile >> test; в теле цикла. Это установит бит сбоя в потоке, когда вы достигнете EOF и попытаетесь прочитать за ним, что, по-видимому, является тем, что вы ищете.
РЕДАКТИРОВАТЬ После того, как ОП изменил исходный код, inputFile >> test;
читается дважды и, следовательно, пропускает начальное значение. Вторая добыча (та, что в цикле тело, не выражение условия цикла) необходимо удалить.
Других решений пока нет …