lib3ds + Tao openGL не отображается модель

Всем привет, в общем проблема ясна из названия темы, в SimpleOpenGlControl не отображается модель.
Считывание 3д модели происходит библиотекой 3dslib
Вот код, может кто-то поймёт в чем дело [spoiler]
/*http://esate.ru, revaldo666*/


Lib3dsFile^ model;
       Lib3dsFile ^ tmpmodel;
       List<Lib3dsMesh^> mesh;
       Lib3dsCamera^ camera;
       List<Lib3dsFace^> face;
       Lib3dsLight^ light;
       Lib3dsMaterial^ material;
static float rotat=0;
//GLuint vertexVBO,normalVBO,textureVBO;
unsigned long total_face;
private: void lightup()
{
   Gl::glShadeModel(Gl::GL_SMOOTH);
   Gl::glEnable(Gl::GL_DEPTH_TEST);
   Gl::glEnable(Gl::GL_CULL_FACE);
   Gl::glFrontFace(Gl::GL_CCW);
   float gambient[]={0.2,0.2,0.2,1.0};
   float lightpos[]={1.0,1.0,1.0,0.0};
   float lambient[]={1.0,1.0,1.0,1.0};
   float ldiffuse[]={1.0,1.0,1.0,1.0};
   float lspecular[]={0.3,0.3,0.3,1.0};
  Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_DIFFUSE,*ldiffuse);
   Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_AMBIENT,*lambient);
   Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_SPECULAR,*lspecular);
   Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_POSITION,*lightpos);
   Gl::glLightModelfv(Gl::GL_LIGHT_MODEL_AMBIENT,*gambient);
   Gl::glEnable(Gl::GL_LIGHTING);
   Gl::glEnable(Gl::GL_LIGHT0);
}
private: void getfaces()
{
   total_face=0;
   for(long meshcount=0;meshcount<model->meshes->Count;meshcount++)
      total_face+=mesh[meshcount]->nfaces;
}

private: void display()
{
   Gl::glEnable(Gl::GL_DEPTH_TEST);
   Gl::glDepthFunc(Gl::GL_LEQUAL);
   Gl::glClear(Gl::GL_COLOR_BUFFER_BIT|Gl::GL_DEPTH_BITS);
   Gl::glLoadIdentity();
   lightup();
   Gl::glScalef(0.5,0.5,0.5);
   Gl::glTranslatef(0.0,-1500.0,-2500.0);
  Gl::glRotatef(280, 1, 0, 0);
  Gl::glRotatef(rotat, 0, 0, 1);
    long meshcount;
   for(meshcount=0;meshcount<model->meshes->Count;meshcount++)
   {
    for(int fd=0;fd<mesh[meshcount]->faces->Count;fd++)
      face.Add(mesh[meshcount]->faces[fd]);
      for(long i=0;i<mesh[meshcount]->nfaces;i++)
      {
        // glMaterialfv(GL_FRONT,GL_DIFFUSE,material[face[i].material]->diffuse);
       //  glMaterialfv(GL_FRONT,GL_AMBIENT,material[face[i].material]->ambient);
       //  glMaterialfv(GL_FRONT,GL_SPECULAR,material[face[i].material]->specular);
        Gl::glBegin(Gl::GL_TRIANGLES);
      Gl::glColor3f(50.0,100.0,0.0);
        Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[0]]->ToArray());
        Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[1]]->ToArray());
        Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[2]]->ToArray());
        Gl::glEnd();
      }
    face.Clear();
   }
    
}
static void Timer(int value)
{
   rotat+=1.0f;
  if(rotat>=360)
    rotat=0;
   Glut::glutPostRedisplay();
   // Glut::glutTimerFunc(30, Timer, 0);
  Gl::glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT);
  Gl::glLoadIdentity();
}

private: void keypress(unsigned char key,int x,int y)
{
   switch(key)
   {
   case 27:
      exit(0);
      break;
   }
}
private: void reshape(int w,int h)
{
   if(h==0) h=1;
   Gl::glViewport(0,0,w,h);
   Gl::glMatrixMode(Gl::GL_PROJECTION);
   Gl::glLoadIdentity();
   Glu::gluPerspective(45.0,w/h,0.0,1000.0);
   Gl::glMatrixMode(Gl::GL_MODELVIEW);
   Gl::glLoadIdentity();
}
private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) 
     {

      previev();
      reshape(AnT->Width,AnT->Height);
      model=LIB3DS::lib3ds_file_open(WndThread::directory_name);
      for(int i=0;i<model->meshes->Count;i++)
        mesh.Add(model->meshes[i]);
      // инициализация Glut 
      Glut::glutInitDisplayMode(Glut::GLUT_RGB|Glut::GLUT_DOUBLE|Glut::GLUT_DEPTH);
      Gl::glClearColor(0.0, 0.0, 0.0, 0.0);
      Gl::glClearDepth(1.0);
      Gl::glShadeModel(Gl::GL_FLAT);
      Gl::glPushMatrix();
      display();
      Gl::glPopMatrix();
      Gl::glFlush();
      
      AnT->Invalidate();
      
     }
0      2175        24.07.2012        11

0 
24.07.2012 00:00:00
По коду пробежался, но так особо много не скажешь, нужно больше информации, а лучше весь проект=)

Ну, то что можно попробовать:
1. Если таймер работает, то попробуй поменять в нем код — вызывать display

//....
Gl::glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT);
Gl::glLoadIdentity();
Gl::glPushMatrix();
display();
Gl::glPopMatrix();
Glut::glutPostRedisplay();

2. Возьми самую простую модельку, куб например и убедись что он сохранен от начала координат редактора, и сама модель небольшого размера.
И попробуй загрузить это куб и не смешать в функции display Gl::glTranslatef(0.0,-1500.0,-2500.0); на -1500.0 и -2500.0 попробуй меньшие значения, просто не понятно зачем такие большие значения(что за модель?!=)). Или лучше привяжи их(X, Y и Z) как переменные и меняй по нажатие клавиш. Хотя тот метод keypress, что сейчас, наверняка работать не будет…

3. Поставь точку останова, запусти в дебаге и глянь не пуста ли модель, все ли нормально загрузилось.

Кстате лучше при загрузке окна сразу про инициализировать glut? как в
private void Form1_Load(object sender, EventArgs e)

4. Еще, проверь ошибки OpenGL, на C++ это делается так:
GLenum errorCode;
if ((errorCode=glGetError()) != GL_NO_ERROR)
{
std::cout<<"OpenGl error "<<gluErrorString(errorCode);
}

Я думаю, что там просто заменить std::cout на label1.Text = gluErrorString(errCode), только нужно label на форму добавить.=)

Кстати это, на чем код? смахивает на C++.Net.)
0 
25.07.2012 00:00:00
Сохранил в файл координаты которые считываются, вот часть из них, может что-то даст

195,6689-X 61,97546-Y 1044,656-Z

-175,908-X 49,92894-Y 1210,162-Z

192,9469-X 46,34293-Y 1038,416-Z

110,1076-X 113,8057-Y 1616,626-Z

218,5479-X 114,4016-Y 1574,725-Z

192,0263-X 45,91137-Y 1057,38-Z

236,335-X 177,6825-Y 1469,428-Z

190,6229-X 64,56419-Y 1085,619-Z

190,6229-X 64,56419-Y 1085,619-Z

205,8839-X 120,2724-Y 1577,356-Z

178,4339-X 45,61869-Y 1132,971-Z

228,6824-X 118,8095-Y 1567,812-Z

178,4339-X 45,61869-Y 1132,971-Z

177,1831-X 65,78207-Y 1160,539-Z

-211,9875-X 157,2706-Y 1414,957-Z

201,7873-X 98,14346-Y 1385,417-Z

-175,247-X 187,9348-Y 1466,396-Z

176,206-X 66,56281-Y 1198,334-Z

-175,1153-X 115,5049-Y 1089,424-Z

175,2303-X 76,92282-Y 1166,032-Z

195,4132-X 99,3045-Y 1343,343-Z

185,8377-X 97,80929-Y 1266,137-Z

176,206-X 66,56281-Y 1198,334-Z

-67,63946-X 159,3645-Y 1612,705-Z

196,1457-X 45,84235-Y 1019,687-Z

184,9285-X 183,5985-Y 1507,405-Z

-197,9104-X 58,23966-Y 1023,104-Z
0 
25.07.2012 00:00:00
Не сильно помогло=)

На вскидку много трансформации, уводят объект из области видимости.
Попробуй, еще:
Glu.gluPerspective(45, (float)w / (float)h, 1.0, <b><i>3000</i></b>);

Попробуй отключить свет. за комментировав эти строки:
Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_DIFFUSE,*ldiffuse);
Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_AMBIENT,*lambient);
Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_SPECULAR,*lspecular);
Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_POSITION,*lightpos);
Gl::glLightModelfv(Gl::GL_LIGHT_MODEL_AMBIENT,*gambient);
Gl::glEnable(Gl::GL_LIGHTING);
Gl::glEnable(Gl::GL_LIGHT0);

И не понятно зачем чистить список с фэйсами, после одного вывода=). Попробуй закоментить
face.Clear();

А вообще какая нибудь модель выводится? Правильно ли грузится объект, массив моделей не пустой?(Продебаж)

Ошибки OpenGL проверил? Куб грузить пробовал?
0 
25.07.2012 00:00:00
Изменил дальность перспективы на 5000 и свё заработало!!! спасибо
0 
25.07.2012 00:00:00
Всегда рад помочь.=) обращайся. )
0 
25.07.2012 00:00:00
Кстати, а как запустить таймер?
Я запускаю так-
Функция таймера
void Timer(int value)
{
rotat+=1.0f;
if(rotat>=360)
rotat=0;
Glut::glutTimerFunc(33, gcnew Glut::TimerCallback(this,&mainForm::Timer), 1);
Gl::glLoadIdentity();
}
Вызов тут
display();
Gl::glPopMatrix();
Timer(1);
AnT->Invalidate();
Однако ничего не происходит.
0 
25.07.2012 00:00:00
это callback должен быть передан в glut, как указатель на функцию, вот пример:

// инициализация бибилиотеки glut
Glut.glutInit();
// инициализация режима экрана
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE);

// установка цвета очистки экрана (RGBA)
Gl.glClearColor(255, 255, 255, 1);

// установка порта вывода
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
Glut.glutTimerFunc(33,Timer,1);// тут правда я с чисто C++ скопировал=)



Но лучше просто кинь на форму таймер, сделай его enable, потом нажми на молнию, после на Tick, создастся обработчик. в него впиши вызов функции display(). Могу скрины выложить если очень надо.=)
0 
25.07.2012 00:00:00
И снова спасибо, даже не думал, что для такого может пригодиться фрэймворковсий таймер.
0 
25.07.2012 00:00:00
помог совет ставь плюс… =)

Не за что!)
0 
25.07.2012 00:00:00
Код на CLR/C++
Сам когда первый раз увидел не понял что там происходит)
0 
24.07.2012 00:00:00
Еще поменяй gluPerspective на
Glu.gluPerspective(45, (float)w / (float)h, 1.0, 1000);
^
Регистрация
Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 
×
Восстановление пароля
Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш Email. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
×
Авторизация
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.
Авторизуйтесь с помощью соц. сети или с помощью аккаунта на сайте:
×