это вопрос c++.
Я работаю над проектом OpenGL. написал простой загрузчик OBJ. У меня есть класс под названием Mesh. Получив указатель объекта под названием обезьяна
Mesh* monkey;
и вызывающая функция:
load_obj("Monkey.obj", monkey);
Я хочу прочитать из файла и поместить его в вершины обезьян. но при запуске это дает мне необработанное исключение: прочитайте нарушение, когда хотите отложить на вектор по адресу:
mesh->vertices.push_back(v);
Я тестировал локальный векторный манекен, но он успешно удалялся. Я не знаю, почему он не может нажать на вектор указателей объектов?
вот заголовок сетки
include[...]
using namespace std;
class Mesh {
private:
GLuint vbo_vertices, vbo_normals, ibo_elements;
public:
vector <glm::vec4> vertices;
vector <glm::vec3> normals;
vector <GLushort> elements;
glm::mat4 object2world;
Mesh() : vertices(1), normals(1), elements(3), object2world(glm::mat4(1)) {}
~Mesh(void){} ;
void Mesh::draw(void) ;
};
и это относительная часть obj-loader.cpp
void load_obj(const char* filename, Mesh* mesh) {
ifstream in(filename, ios::in);
if (!in) { cerr << "Cannot open " << filename << endl; exit(1); }
vector<int> nb_seen;
vector<glm::vec4> dummy;
string line;
while (getline(in, line)) {
if (line.substr(0,2) == "v ") {
istringstream s(line.substr(2));
glm::vec4 v; s >> v.x; s >> v.y; s >> v.z; v.w = 1.0;
dummy.push_back(v);
mesh->vertices.push_back(v);
}
любая помощь будет оценена! ваш смущенный друг!
Из фрагментов кода, которые вы опубликовали, кажется, что вы фактически не выделили объект mesh. Объявление указателя следующим образом:
Mesh* monkey;
не инициализирует указатель или не выделяет любую память, поэтому его значение не определено. Вот почему код загрузки сбой. Потому что указатель сетки недействителен и указывает на некоторую память мусора.
Это должно быть нечто большее:
Mesh* monkey = new Mesh();
Тогда, по крайней мере, у вас будет действительный указатель, который затем можно законно ссылаться на код загрузчика.
Вам необходимо будет выделить память для Mesh
перед вызовом
load_obj("Monkey.obj", monkey);
mesh
- неинициализированный указатель, на котором вы используете mesh->vertices
. На данный момент вы получили неопределенное поведение. Вероятно, вам нужна точка mesh
для объекта.