Jump to content
rakson23

obj i opengl

Recommended Posts

Witam,

chcialem dowiedziec sie czy zna ktos jakis tutorial w ktorym wytłumaczone bedzie wczytanie oraz uzycie pliku obj lub jakiegos innego (wraz ze szkieletem i współrzędnymi tekstur) dla OpenGL. Jeżeli znacie jakis tutorial wklejcie linka bo niestety teraz mam dosc a wszystko co znajduje albo jest nieaktualne albo w conajmniej dziwnych językach.

Share this post


Link to post
Share on other sites

zacytuję przedpremierowy fragment mojej pracy inżynierskiej:

 

Przede wszystkim są nam potrzebne dwa pliki glm.h, glm.cpp, które należy dołączyć do naszego

projektu. W plikach tych są zawarte funkcje które przetwarzają informacje zawarte w obiekcie OBJ.

W pliku OpenGla trzeba wkleić następującą funkcję:

void LoadModel (char *objmodel){

glFrontFace(GL_CCW); // sposób wyświetlania ścianek GL_CW lub GL_CCW

if (!objmodel_ptr)

{

objmodel_ptr = glmReadOBJ(objmodel);

if (!objmodel_ptr)

exit(0);

glmUnitize(objmodel_ptr);

glmFacetNormals(objmodel_ptr);

glmVertexNormals(objmodel_ptr, 90.0);

}

glmDraw(objmodel_ptr , GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE );

/* w zależności jaki sposób mapowania tekstur wybieramy, komentujemy tę linię

albo następną */

// glmLinearTexture(objmodel_ptr);

glmSpheremapTexture(objmodel_ptr);

}

Poprzez wywołanie funkcji w postaci:

LoadModel("obj/NazwaObiektu.obj");

wyświetlamy model. Funkcja ta nie powinna być wywoływana w funkcji Display w głównym

programie. W zmiennych globalnych trzeba jeszcze dodać: GLMmodel* objmodel_ptr;

Te dwa pliki biblioteczne zawierają również funkcję czytająca i wyświetlająca bitmapę w formacie

PPM. Wywołuje się ja w taki sposob:

Texture = glmReadPPM("tex/NazwaTekstury.ppm", &width, &height);

 

Więcej można przeczytać na stronie i z tej strony z jakiegoś przykładu scignij sobie glm.h, glm.cpp: http://www.xmission.com/~nate/

Share this post


Link to post
Share on other sites

bedzie zachwycony ze po 10 miesiacach otrzymal odpowiedx

Share this post


Link to post
Share on other sites

Cześć

 

Mam mały problem.... jak wpisuję linijkę kodu:

 

Texture = glmReadPPM("Data/Tekstury/Drewno.ppm", &width, &height);

 

to mi wyrzuca, że funkcja niezadeklarowana.... co ja mam z tym zrobić, jak i gdzie ją zadeklarować??

 

z góry dziękuję za pomoc

Share this post


Link to post
Share on other sites

Dzięki już znalazłam funkcja nazywa się GLM_TEXTURE. Teraz mam problem z szerokością i wysokością... W pliku dlm.cpp jest coś takiego:

glmReadPPM(char* filename, int* width, int* height)

ale jak wywołuję funkcję ta jak było wyżej, tzn.

GLM_TEXTURE = glmReadPPM("Data/Tekstury/Drewno.ppm", &width, &height);

to się czepia, że width i height są niezadeklarowane... Czy muszę coś dodać do zmiennych globalnych?? Jeśli tak to co??

Z góry dziękuję za pomoc

Share this post


Link to post
Share on other sites

Zakladam ze masz je gdzies zadeklarowane. Jestes pewien ze width i height sa widoczne w miejscu wywolania funkcji?

Share this post


Link to post
Share on other sites

Tak, trzeba zalinkować plik glm.h aby poszlo.

Zmienne width i height trzeba podać w zmiennych globalnych jako:

 

static GLint width , height;

 

wartości tych zmiennych pobierane są z zalinkowanych plików *.ppm

 

lepiej dla pewności zerknij sobie na kod źrodlowy:

http://aseweryn.nazwa.pl/praca_inz/kod_zrodlowy/zj_Fresnela.rar

 

rozzipuj to i zerkinj sobie na plik amain_f.cpp

 

Ten myk z czytaniem pliku .obj zostal wykorzystany do prezentacji shaderow w GLSL na wlasnoręcznie wykonanych obiektach. Aha, tutaj zostala wykorzystana tekstura sześcienna (mapowanie srodowiska). Przy zwykłych teksturach też powinno pójść.

Share this post


Link to post
Share on other sites

Wielkie dzięki!!

Mam jeszcze pytanie jak wyeksportować plik ppm z Max'a.... Ja ma tylko mtl.... a jak się nie da to, w funkcji wczytującej mtl jast tak:

glmReadMTL(GLMmodel* model, char* name)

to co ja mam zrobić z tym model ??

z góry dziękuję

Share this post


Link to post
Share on other sites

Ja pliki .ppm zapisywałam ze zwykłych bitmap w GIMPie. Obiekt eksportowałam bez tekstur z Lightwave3D, wię Ci z MAXem nie pomogę.

 

Niestety w tym sposobie ładowania modeli mozna tylko mapować planarnie albo sferycznie i nie ma UV, zresztą inne mapowanie nie było mi potrzebne.

 

I taka mała dygresja, może nie związana z tematem wątku. Kiedyś dawno temu była przeglądarka do plików 3D i chyba sie nazywała 3DEksplorer, mogła ona zapisywać obiekty jako kod C++/OpenGL w postaci klasy. Nie udało mi się jednak obczaić jak to załadować do OpenGLa.

Share this post


Link to post
Share on other sites

Ta przegladarka nazywa sie dokladnie - Deep Exploration i exportuje do kodu c++ praktycznie wszystkie informacje zwiazane z modelem - liste vertexow, normalne, indexy, materialy. Wygenerowany kod posiada gotowa funkcje renderujaca listy opengl i wystarczy miec zainicjowany kontekst opengla zeby go uzyc.

Share this post


Link to post
Share on other sites

Kolejne pytanie: Dlaczego napisana przeze mnie aplikacja się zamyka?? -.-'

Poradziłam sobie z tymi teksturami i przy kompilacji nie wyskakują już żadne błędy, ale kiedy uruchamiam aplikację to się od razu zamyka... Domyślam się, że to ma związek z tymi teksturami, że się nie ładują i następuje wyjście, ale nie wiem dlaczego... Jak ktoś ma jakieś rady to bardzo proszę o pomoc.

Z góry dziękuję!!

Share this post


Link to post
Share on other sites

Dodaj do kodu messageboxa w miejscach sprawdzania bledow albo zapodaj kawalek kodu odpowiedzialnego za zdarzenia.

Share this post


Link to post
Share on other sites

Jeśli pisałeś w Dev-C++ to czasami pomaga komenda na końcu programu:

 

getchar();

Share this post


Link to post
Share on other sites

Mam jeszcze jedno pytanie: Jak ładuje modele bez tekstur to one są jakby płaskie... Nie widać "głębokości".... Czy wiecie może dlaczego??

Share this post


Link to post
Share on other sites

Pewnie dlatego ze nie wlaczyles swiatla. Po jego wlaczeniu dodatkowo musisz przekazac normalne dla kazdego face`a.

Edited by Ziper

Share this post


Link to post
Share on other sites

W tej funkcji masz już znormalizowany obiekt:

void LoadModel (char *objmodel){

glFrontFace(GL_CCW); // sposób wyświetlania ścianek GL_CW lub GL_CCW

if (!objmodel_ptr)

{

objmodel_ptr = glmReadOBJ(objmodel);

if (!objmodel_ptr)

exit(0);

glmUnitize(objmodel_ptr);

glmFacetNormals(objmodel_ptr); // tutaj normalne faceów

glmVertexNormals(objmodel_ptr, 90.0); // normalne wierzchołków

}

glmDraw(objmodel_ptr , GLM_SMOOTH | GLM_MATERIAL );

}

 

Tak jak mój przedmówca powiem, że powinieneś tylko światła właczyć, w odpowiednim miejscu instrukcją:

 

glEnable(GL_LIGHTING); // włączenie oświetlenia

glEnable(GL_LIGHT0); // włączenie konkretnego światła (z tego co pamiętam z wykładów to chyba do óśmiu jednocześnie można)

 

Może masz normalne odwrócone do wewnątrz obiektu i zamiast glFrontFace(GL_CCW); powinno być glFrontFace(GL_CW);. Ale w takim wypadku zobaczysz wnętrze obiektu, więc jest mało prawdopodobne, że to jest przyczyną.

 

Obstawiam swiatła ;)

Share this post


Link to post
Share on other sites

Wiecie może dlaczego jak ładuję pliki obj to mnie się program wyłącza?? W innej aplikacji mi działa, a w drugiej nie chce?? Wszystko robię tak samo z tą tylko różnicą, że w tym co się wyłącza ładuję pliki bmp, ale nie na te obj tylko na zwykłe sześciany?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy