lib3ds + Tao openGL не отображается модель
Всем привет, в общем проблема ясна из названия темы, в SimpleOpenGlControl не отображается модель.
Считывание 3д модели происходит библиотекой 3dslib
Вот код, может кто-то поймёт в чем дело [spoiler]
Считывание 3д модели происходит библиотекой 3dslib
Вот код, может кто-то поймёт в чем дело [spoiler]
|
Ну, то что можно попробовать:
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.)
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
На вскидку много трансформации, уводят объект из области видимости.
Попробуй, еще:
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 проверил? Куб грузить пробовал?
Я запускаю так-
Функция таймера
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();
Однако ничего не происходит.
// инициализация бибилиотеки 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(). Могу скрины выложить если очень надо.=)
Не за что!)
Сам когда первый раз увидел не понял что там происходит)
Glu.gluPerspective(45, (float)w / (float)h, 1.0, 1000);