Загрузка obj файла на си и отображение
| |
afq | Дата: Суббота, 29 Октября 2016, 05:02 | Сообщение # 1 |
Разработчик
Сейчас нет на сайте
| Всем привет. Вот как у меня программа на си загружает данные из файла. Я правильно использую данные из строк f.
Считанные раннее по индексу, потом используются для вывода сразу в трёх координатах. Но там в строке написано
1//1 10//3 8//1 это значит что здесь три триугольника указаны? Экспорт из blender и triangle faces или грани.
Потом я пробую нарисовать.
Код glBegin(GL_TRIANGLES); цикл{ Vertex Normal } glEnd(); glFlush();
Но ничего не отображается. В настройках освещение, но там темнота. Стоит ли код выкладывать? И правильно ли я загрузил и отобразил?
|
|
| |
dalikivug | Дата: Суббота, 29 Октября 2016, 07:29 | Сообщение # 2 |
почетный гость
Сейчас нет на сайте
| "Стоит ли код выкладывать?" Да стоит, проблема может быть в чем угодно
В качестве парсера попробуй готовый взять, например Assimp
Сообщение отредактировал dalikivug - Суббота, 29 Октября 2016, 07:29 |
|
| |
afq | Дата: Понедельник, 31 Октября 2016, 03:21 | Сообщение # 3 |
Разработчик
Сейчас нет на сайте
| Код #include <GL/glut.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h>
void init(void) { GLfloat mat_specular[]={1.0,1.0,1.0,1.0}; GLfloat mat_shininess[]={50.0}; GLfloat light_position[]={1.0,1.0,1.0,0.0}; GLfloat white_light[]={1.0,1.0,1.0,1.0}; glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_SMOOTH); glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light); glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); } struct _vn{ float x[600]; float y[600]; float z[600]; }vn; struct _v{ float x[600]; float y[600]; float z[600]; }v; struct _t{ int vx[600]; int vy[600]; int vz[600]; int vnx[600]; int vny[600]; int vnz[600]; float v[600]; float vn[600]; }t; void reshape(int w, int h) { glViewport(0,0,(GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w<=h) glOrtho(-1.5,1.5,-0.5*(GLfloat)h/(GLfloat)w,0.5*(GLfloat)h/(GLfloat)w,- 10.0,10.0); else glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,- 10.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
struct f{ char a[10]; char b[10]; char c[10]; }; struct a{ int a; int b; int c; }; struct m{ int a; int b; int c; int d; int e; int f; }; int it = 1; int end; int show = 0;
void display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); if (show == 0){ int a = 0; struct m cc; struct f *c = calloc(sizeof(struct f),1); FILE *fd = fopen("untitled.obj","r"); char ff[10]; float x = 0; float y = 0; float z = 0; int ret = 1; int ivn = 1; int iv = 1; char line[180]; while(fgets(line,179,fd)!=NULL){
if (!strncmp(line,"vn",2)){ sscanf(line, "vn %s %s %s", c->a,c->b,c->c); vn.x[ivn]=atof(c->a); vn.y[ivn]=atof(c->b); vn.z[ivn]=atof(c->c); ivn++; continue; } if (!strncmp(line,"v",1)){ sscanf(line, "vn %s %s %s", c->a,c->b,c->c); v.x[iv]=atof(c->a); v.y[iv]=atof(c->b); v.z[iv]=atof(c->c); iv++; continue; } if (!strncmp(line,"f",1)){ sscanf(line,"f %d//%d %d//%d %d//%d",&cc.a,&cc.b,&cc.c,&cc.d,&cc.e,&cc.f); t.vx[it]=v.x[cc.a]; t.vy[it]=v.y[cc.a]; t.vz[it]=v.z[cc.a];
t.vnx[it]=vn.x[cc.b]; t.vny[it]=vn.y[cc.b]; t.vnz[it]=vn.z[cc.b]; it++;
t.vx[it]=v.x[cc.c]; t.vy[it]=v.y[cc.c]; t.vz[it]=v.z[cc.c];
t.vnx[it]=vn.x[cc.d]; t.vny[it]=vn.y[cc.d]; t.vnz[it]=vn.z[cc.d]; it++;
t.vx[it]=v.x[cc.e]; t.vy[it]=v.y[cc.e]; t.vz[it]=v.z[cc.e];
t.vnx[it]=vn.x[cc.f]; t.vny[it]=vn.y[cc.f]; t.vnz[it]=vn.z[cc.f]; it++; continue; } //memset(c,0,sizeof(struct f)); memset(line,0,180); } fclose(fd); free(c); end = it; } it = 1; show = 1; while(it <= end){ glBegin(GL_TRIANGLES); glVertex3f(t.vx[it],t.vy[it],t.vz[it]); glNormal3f(t.vnx[it],t.vny[it],t.vnz[it]); glEnd(); it++; } glFlush(); } int main(int argc, char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(500,500); glutInitWindowPosition(0,0); glutCreateWindow("Rendering "); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
Добавлено (31 октября 2016, 03:21) --------------------------------------------- Как закрыть тему?
|
|
| |
Saitei | Дата: Среда, 02 Ноября 2016, 02:13 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Цитата afq ( ) Как закрыть тему? Темы у нас закрывают только в крайних случаях. Пусть остаётся открытой :)
|
|
| |
falcoware | Дата: Среда, 02 Ноября 2016, 08:17 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| afq, хоть бы glColor поставил. Ты черным рисуешь по черному.
|
|
| |
afq | Дата: Воскресенье, 19 Февраля 2017, 16:52 | Сообщение # 6 |
Разработчик
Сейчас нет на сайте
| Вот у меня загружена модель из obj файла. Далее я с помощью SDL2 загружаю текстуру. У меня в загруженной структуре имеется значение, максимального числа треугольников. В цикле рисуются треугольники.
Код glEnable ( GL_TEXTURE_2D ); glBegin ( GL_TRIANGLES ); for ( int i = 0; i <= cube->total_triangles; i++ ){ glVertex3f ( cube->vertex_triangle[i].x.x, cube->vertex_triangle[i].x.y, cube->vertex_triangle[i].x.z ); glVertex3f ( cube->vertex_triangle[i].y.x, cube->vertex_triangle[i].y.y, cube->vertex_triangle[i].y.z ); glVertex3f ( cube->vertex_triangle[i].z.x, cube->vertex_triangle[i].z.y, cube->vertex_triangle[i].z.z ); glEnd ();
Но есть ещё нормали, надо ли их отображать, и в каком порядке, и как мне отобразить правильно текстуру, а то рисунок, по разному рисуется на кубе. Нужно хотябы чтобы на каждой стороне рисовался рисунок, или на одной.
|
|
| |
|