lib3ds + opengl Перевод 3д модели в 2д изображение

Всем привет, есть такая проблема, нужно загруженную часть 3Д модели отрисовать в JPG файле. В принципи частично у меня это получилось, однако отрисовывается только часть модели (скорее всего она не под нужным углом повёрнута, как развернуть её я хз). Или я гдето как обычно натупил. Подскажите где ошибка, или как это можно иначе реализовать?

Вот как я отрисовываю модель в в OPENGL окне
/*http://esate.ru, revaldo666*/

 Gl::glEnable(Gl::GL_DEPTH_TEST);
       Gl::glEnable(Gl::GL_TEXTURE_2D);
       Gl::glBindTexture(Gl::GL_TEXTURE_2D,mGlTextureObject);
       Gl::glDepthFunc(Gl::GL_LEQUAL);
       Gl::glClear(Gl::GL_COLOR_BUFFER_BIT|Gl::GL_DEPTH_BITS);
       Gl::glClearColor(0, 0, 0, -1);
       Gl::glLoadIdentity();
       lightup();
       Gl::glScalef(0.5,0.5,0.5);
       Gl::glTranslatef(0.0,-1200.0,-1500.0);
       Gl::glRotatef(280, 1, 0, 0);
       Gl::glRotatef(rotat, 0, 0, 1);
       Gl::glColor3f(50.0,100.0,0.0);
       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]);
         if(material.Count>0)
         {
         for(long i=0;i<mesh[meshcount]->nfaces;i++)
         {
           Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_DIFFUSE,material[face[i]->material]->diffuse);
           Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_AMBIENT,material[face[i]->material]->ambient);
           Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_SPECULAR,material[face[i]->material]->specular);
         }
         }
       }
       face.Clear();
       
       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++)
         {
           
           Gl::glBegin(Gl::GL_TRIANGLES);
           Gl::glTexCoord2f(mesh[meshcount]->texcos[face[i]->index[0]]->s, mesh[meshcount]->texcos[face[i]->index[0]]->t);
           Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[0]]->ToArray());
           Gl::glTexCoord2f(mesh[meshcount]->texcos[face[i]->index[1]]->s, mesh[meshcount]->texcos[face[i]->index[1]]->t);
           Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[1]]->ToArray());
           Gl::glTexCoord2f(mesh[meshcount]->texcos[face[i]->index[2]]->s, mesh[meshcount]->texcos[face[i]->index[2]]->t);
           Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[2]]->ToArray());
           Gl::glEnd();
         }
        
         face.Clear();
       }

Вот так перевожу в JPG файл

/*http://esate.ru, revaldo666*/

 Bitmap ^bmp;
         bmp=gcnew Bitmap(600,600);
           for(int k=0;k<model->meshes[3]->vertices->Count;k++)
           {
             if((int)model->meshes[3]->vertices[k]->x<0&&(int)model->meshes[3]->vertices[k]->y>=0)
             {
               bmp->SetPixel(abs((int)model->meshes[3]->vertices[k]->x+50),(int)model->meshes[3]->vertices[k]->y+50,Color::Green);
              continue;
             }
             if((int)model->meshes[3]->vertices[k]->y<0&&(int)model->meshes[3]->vertices[k]->x>=0)
             {
               bmp->SetPixel((int)model->meshes[3]->vertices[k]->x+50,abs((int)model->meshes[3]->vertices[k]->y+50),Color::Green);
              continue;
             }
             if((int)model->meshes[3]->vertices[k]->x<0&&(int)model->meshes[3]->vertices[k]->y<0)
             {
               bmp->SetPixel(abs((int)model->meshes[3]->vertices[k]->x+50),abs((int)model->meshes[3]->vertices[k]->y+50),Color::Green);
               continue;
             }

             bmp->SetPixel((int)model->meshes[3]->vertices[k]->x+50,(int)model->meshes[3]->vertices[k]->y+50,Color::Green);
           }
         
         bmp->Save(System::IO::Path::GetDirectoryName(System::Reflection::Assembly::GetEntryAssembly()->Location)+"\\colors\\"
           +"tsht.jpg",ImageFormat::Jpeg);
0       1291        03.08.2012        13

0  
03.08.2012 00:00:00
По беглому просмотру кода. Я понял ты прогоняешь все векторы(vertex) и по их позиции присваиваешь цвет пикселям. Это не правильный подход.
Если что не правильно понял, извени.

Почитай 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);


Должен работать. свидетельства пользователя данного примера=)))
Он просто создает битмап и читает пиксели из пиксель буфера прям в рисунок. Потом его сохраняешь.
0  
03.08.2012 00:00:00
Сделал по этому примеру, однако возникла проблема в том, что simpleopenglcontrol находится у меня не на главной форме а на дочерней, а пиксели почемуто с главной считываются.
0  
03.08.2012 00:00:00
Попробовал проделать это с главной формой, ничего не изменилось, Сохранилось просто пустое окно контрола.
0  
03.08.2012 00:00:00
А ты в нем, что рисовал?
0  
03.08.2012 00:00:00
что-то**
0  
03.08.2012 00:00:00
Попробуй
AnT.MakeCurrent();
перед считыванием

Это заставит использовать SimpleOpenGlControl как текущий, тоесть из него будет производится считывание, или рисование.
0  
03.08.2012 00:00:00
Да рисовал, после рисовки и отображения начинал считывание.
MakeCurrent не дал не каких результатов.
0  
03.08.2012 00:00:00
если использовать одно окно и один SimpleOpenGlControl, оно работает верно?

А в двух окнах нормально все рисуется?
0  
03.08.2012 00:00:00
в двух окнах рисуется нормально.
С одним окном и контролом не пробовал, щас проверю.
0  
03.08.2012 00:00:00
Покажи участок кода где делал MakeCurrent
0  
03.08.2012 00:00:00
AnT->Refresh();
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);
0  
03.08.2012 00:00:00
Даже не знаю, что можно попробовать((
0  
04.08.2012 00:00:00
Попробуй отключить в опцию AutoMakeCurrent в property SimpleOpenGlControl.
^