melvy
Тогда след вопрос.Почему модель рукожопо рендерит?
#include <iostream> #include <sstream> #include <fstream> #include <vector> #include <map> #include <glew.h> #include <GL/glut.h> #include <regex> using namespace std; struct Vertex { GLfloat x, y, z; }; struct Face { GLuint vertid1, vertid2, vertid3; }; struct Model { vector<Vertex> vertices; vector<Face> faces; }; vector<string> split(string s, string delimiter) { size_t pos_start = 0, pos_end, delim_len = delimiter.length(); string token; vector<string> res; while ((pos_end = s.find(delimiter, pos_start)) != string::npos) { token = s.substr(pos_start, pos_end - pos_start); pos_start = pos_end + delim_len; res.push_back(token); } res.push_back(s.substr(pos_start)); return res; } Model parseOBJ(string fn) { ifstream in(fn); string str; vector<string> vec,vec1; Model model; Vertex vertex; Face face; while (getline(in, str)) { vec = split(str, " "); if (vec[0] == "v") { vertex.x = stof(vec[1].c_str()); vertex.y = stof(vec[2].c_str()); vertex.z = stof(vec[3].c_str()); model.vertices.push_back(vertex); } else if (str[0] == 'f') { vec1 = split(vec[1], "/"); face.vertid1 = atoi(vec1[0].c_str()); vec1 = split(vec[2], "/"); face.vertid2 = atoi(vec1[0].c_str()); vec1 = split(vec[3], "/"); face.vertid3 = atoi(vec1[0].c_str()); model.faces.push_back(face); // vec1 = split(vec[4], "/"); // model.indices.push_back(atoi(vec1[0].c_str())); // model.normals_indices.push_back(atoi(vec1[2].c_str())); } } in.close(); return model; } GLfloat* vertexs; GLuint* indices; GLfloat* normals; GLfloat* texcoords; GLfloat* all_normals; GLfloat* all_vertexs; Model model; void init() { static int i = 0; if (i == 0) model = parseOBJ("block.obj"); i++; glClearColor(0.0, 0.0, 0.0, 1.0); //фоновый цвет glShadeModel(GL_SMOOTH); //плавная модель заливки GLfloat pos[] = {10.0,1.0,10.0 }; GLfloat ambientMaterial[] = { 0.85,0.43,0.57 }; GLfloat ambientLigt[] = { 1.0,0.0,0.0 }; // GLfloat shininess[] = { 80.0 }; GLfloat diffuseMaterial[] = { 1.0,0.0,1.0 }; GLfloat diffuseLight[] = { 1.0,0.0,1.0 }; glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMaterial); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLigt); glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT0, GL_POSITION, pos); // glLightfv(GL_LIGHT0, GL_SHININESS, shininess); glEnable(GL_LIGHTING); //активация освещения glEnable(GL_NORMALIZE); glEnable(GL_DEPTH_TEST); //активация теста нулбины glEnable(GL_LIGHT0); //активация источника света } GLfloat camPos[] = { 0.0,0.0,0.0 }; GLfloat lookAt[] = { 0.0,0.0,0.0 }; GLfloat up[] = { 0.0,1.0,0.0 }; GLfloat angle = 0.0; void draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // glRotatef(60.0, 1.0, 0.0, 0.0); gluLookAt(0.0,0.0,0.0,0.0,0.0,-1.0, up[0], up[1], up[2]); glColor3f(500.0, 500.0, 500.0); //glScalef(1000.0,1000.0,10000.0); //glTranslatef(1.0, 1.0, 3.0); // glEnableClientState(GL_NORMAL_ARRAY); // glNormalPointer(GL_FLOAT, 0, all_normals); // glDrawElements(GL_TRIANGLES, model.indices.size(), GL_UNSIGNED_INT, indices); //glDisableClientState(GL_TEXTURE_COORD_ARRAY); // glRotatef(angle, 1.0, 0.0, 0.0); //поворот по оси x glBegin(GL_TRIANGLES); for (int i = 0; i < model.faces.size(); ++i) { auto v1 = model.vertices[model.faces[i].vertid1]; auto v2 = model.vertices[model.faces[i].vertid2]; auto v3 = model.vertices[model.faces[i].vertid3]; glVertex3f(v1.x,v1.y,v1.z); glVertex3f(v2.x, v2.y, v2.z); glVertex3f(v3.x, v3.y, v3.z); } glEnd(); // glDrawArrays(GL_TRIANGLES, 0, 36); glFlush(); } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-100.0, 100.0, -100.0, 100.0, -10.0, 10.0); } void keyboard(uint8_t k, int x, int y) { if (k == '1') angle += 10.0; if (angle >= 360.0) angle = 0.0; glutPostRedisplay(); } int main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(1024, 768); glutInitWindowPosition(0, 0); glutCreateWindow("Демо-сцена на OpenGL"); init(); glutDisplayFunc(draw); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); }
EnderGames
почему ты мне пишешь я без понятия
(если думаешь что типо "тестишь меня" то нет мне плевать на тебя и твой код, у меня свои рабочие рендеры где все работает, и тоько потому что "я типо разбираюсь" я не буду твой код читать и искать подводные камни которые ты типо спрятал чтоб потестить меня (типо ты такой умный ага чел), и если ты не можешь нагуглить веб сайт https://learnopengl.com/ то это твои проблемы)
melvy
Потому что не нужно отвечать на сообщения и общаться с совсем зелеными. Демка с пбр кубом и камерой-аркболом это 1к строк кода в 1 файле. И никакого блокера тут нет. Если автор не может - пусть идёт учит кормера, еберли или ленгейла. Или демки с гитхаба качает.
lookid
да он на троля похож, типо "я такой умный а нука посмотрю какие вы тут тупые"
и начал с ГЛУТа когда ему уже четвертую страницу, не только я, говорят что этим никто не пользуется
с десяток разных вариантов назвали - и webgl и готовые движки... чел продолжает "тролить"...
(другие его посты не лучше и отвечаются первыми ссылками из гугла... не смешно и тригерит)
EnderGames
> Почему модель рукожопо рендерит?
потому что у тебя совсем нет понимания что и для чего ты это делаешь...
читай книжки или статьи, и начинай писать код уже осознанно...
А твой код, приведённый выше, не должен работать в принципе.
EnderGames
> glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
> glOrtho(-100.0, 100.0, -100.0, 100.0, -10.0, 10.0);
Ты пытаешься вывести 3D модель, почему проекция ортогональная? Должна быть перспективная.
EnderGames
> glColor3f(500.0, 500.0, 500.0);
цвет выводится в диапазоне [0, 1]
> Model parseOBJ(string fn)
Участок кода parserOBJ - даже разбираться не хочу, там вообще белиберда.
Хочешь свой велосипед написать, ОК - вперёд!
Но для формата .obj уже есть хорошо написанные парсеры, например:
https://github.com/tinyobjloader/tinyobjloader
смотри, изучай примеры
std::variant
есть.Насчёт цвета,то я случайно пихнул туда,хотел поместить 500.0,500.0,500.0 в glScalef.И цвета находятся ещё в диапазоне от 0 до 255,если это glColor3i.Примеры я видел,тоже не очень работают.Я и перспективную проекцию использовал,и всё равно эффекта никакого.И проблему я нашел уже - порядок вершин,хотя может здесь я и ошибаюсь тоже.
std::variant
Проблему решил.Так же решил по идеи проблему с камерой,что у меня была.