Понедельник, 17 Июня 2019, 22:16

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Загрузка obj файла на си и отображение (Не отображает модель.)
Загрузка 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 ();

Но есть ещё нормали, надо ли их отображать, и в каком порядке, и как мне отобразить правильно текстуру, а то рисунок, по разному рисуется на кубе. Нужно хотябы чтобы на каждой стороне рисовался рисунок, или на одной.


Форум игроделов » Программирование » C/C++ » Загрузка obj файла на си и отображение (Не отображает модель.)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2019 Рейтинг