Skocz do zawartości

obj i opengl


rakson23

Rekomendowane odpowiedzi

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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 20
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

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/

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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ść.

Odnośnik do komentarza
Udostępnij na innych stronach

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ę

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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ę!!

Odnośnik do komentarza
Udostępnij na innych stronach

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 ;)

Odnośnik do komentarza
Udostępnij na innych stronach

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?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności