lib3ds + opengl Перевод 3д модели в 2д изображение
Всем привет, есть такая проблема, нужно загруженную часть 3Д модели отрисовать в JPG файле. В принципи частично у меня это получилось, однако отрисовывается только часть модели (скорее всего она не под нужным углом повёрнута, как развернуть её я хз). Или я гдето как обычно натупил. Подскажите где ошибка, или как это можно иначе реализовать?
[spoiler]
Вот как я отрисовываю модель в в OPENGL окне
Вот так перевожу в JPG файл
[spoiler]
Вот как я отрисовываю модель в в OPENGL окне
|
Вот так перевожу в JPG файл
|
Если что не правильно понял, извени.
Почитай OpenGL супер книгу 325 стр. она очень поможет=)
Есть вот такой примерчик:
Bitmap bmp = new Bitmap(AnT->Width, AnT->Height);
System.Drawing.Imaging.BitmapData data = bmp.LockBits(this.ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Gl.glReadBuffer(Gl.GL_FRONT);
GL.ReadPixels(0, 0, AnT->Width, AnT->Height, GL.GL_BGR, PixelType.UnsignedByte, data.Scan0);
bmp.UnlockBits(data);
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
Должен работать. свидетельства пользователя данного примера=)))
Он просто создает битмап и читает пиксели из пиксель буфера прям в рисунок. Потом его сохраняешь.
AnT.MakeCurrent();
перед считыванием
Это заставит использовать SimpleOpenGlControl как текущий, тоесть из него будет производится считывание, или рисование.
MakeCurrent не дал не каких результатов.
А в двух окнах нормально все рисуется?
С одним окном и контролом не пробовал, щас проверю.
if(material.Count>0)
material.Clear();
if(mesh.Count>0)
mesh.Clear();
Il::ilClearImage();
Gl::glClear(Gl::GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT);
Gl::glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT);
previev();
if(model)
LIB3DS::lib3ds_file_free(model);
model=LIB3DS::lib3ds_file_open(WndThread::directory_name);
if(!model)
return;
for(int i=0;i<model->meshes->Count;i++)
mesh.Add(model->meshes[i]);
for(int i=0;i<model->materials->Count;i++)
material.Add(model->materials[i]);
int imageId=0;
Il::ilGenImages(1,Convert::ToInt32(imageId));
Il::ilBindImage(imageId);
String ^ url=material[0]->texture1_map->name;
Il::ilLoadImage(url);
mGlTextureObject=0;
int width=Il::ilGetInteger(Il::IL_IMAGE_WIDTH);
int height=Il::ilGetInteger(Il::IL_IMAGE_HEIGHT);
int bitspp=Il::ilGetInteger(Il::IL_IMAGE_BITS_PER_PIXEL);
switch(bitspp)
{
case 24:mGlTextureObject=MakeGlTexture(Gl::GL_RGB,Il::ilGetData(),width,height);
break;
case 32:mGlTextureObject=MakeGlTexture(Gl::GL_RGBA,Il::ilGetData(),width,height);
break;
}
Il::ilDeleteImage(Convert::ToInt32(imageId));
AnT->Visible=true;
// очитка окна
Gl::glClearColor(0,0,0, -1);
// установка порта вывода в соотвествии с размерами элемента anT
Gl::glViewport(0, 0, AnT->Width, AnT->Height);
// настройка проекции
Gl::glMatrixMode(Gl::GL_PROJECTION);
Gl::glLoadIdentity();
Glu::gluPerspective(45, (float)AnT->Width / (float)AnT->Height, 1.0, 10000);
Gl::glMatrixMode(Gl::GL_MODELVIEW);
Gl::glLoadIdentity();
// настройка параметров OpenGL для визуализации
Gl::glEnable(Gl::GL_DEPTH_TEST);
Gl::glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT);
Gl::glClearColor(0, 0, 0, -1);
// инициализация Glut
Gl::glClearDepth(1.0);
Gl::glShadeModel(Gl::GL_FLAT);
AnT->BackColor=Color::AliceBlue;
Gl::glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT);
Gl::glClearColor(240, 240, 240, -1);
Gl::glLoadIdentity();
Gl::glPushMatrix();
display();
Gl::glPopMatrix();
Gl::glDisable( Gl::GL_TEXTURE_2D);
AnT->Invalidate();
AnT->MakeCurrent();
Gl::glFlush();
Bitmap^ bitmap = gcnew Bitmap(AnT->Width, AnT->Height);
BitmapData^ bitmapData = bitmap->LockBits(
Rectangle(0, 0, bitmap->Width, bitmap->Height),
ImageLockMode::WriteOnly, PixelFormat::Format24bppRgb);
Gl::glReadBuffer(Gl::GL_FRONT);
Gl::glReadPixels(0, 0, bitmap->Width, bitmap->Height,
Gl::GL_BGR_EXT, Gl::GL_UNSIGNED_BYTE, bitmapData->Scan0);
bitmap->UnlockBits(bitmapData);
bitmap->RotateFlip(RotateFlipType::RotateNoneFlipY);
bitmap->Save(System::IO::Path::GetDirectoryName(System::Reflection::Assembly::GetEntryAssembly()->Location)+"\\colors\\"
+"tsht.jpg",ImageFormat::Jpeg);