Autor Wątek: [SDL,3D]: jak przedstawić widok z kamery 3D na ekranie  (Przeczytany 1241 razy)

Offline 6502

  • Użytkownik

# Maj 03, 2010, 16:20:43
Witam,
Korzystam z kursu grafiki 3d, zaimplementowałem podane na stonie macierze do przekształcenia widoku (kamery) i projekcji, ale to chyba nie wszystko co trzeba zrobić, bo obiekty nie wyświetlają się poprawnie.
Gdy ustawię kamerę w punkcie 0,0,0 wyświetla mi obiekty znajdujące się za nią z przodu, z dystansu.Podobnie jest z obrotami, przy obrocie kamery obiekty obracają się wokół punktu przed kamerą a nie wokół niej. Obiekty w świecie 3d po w/w przekształceniach rzutuje na ekran przez:

scale=ogniskowa/(ogniskowa+z);
x=x*scale+320;
y=y*scale+240; 
Czy jest to poprawna metoda?Wydaje mi się, że to może być powodem tych problemów.
Jakie trzeba zastosować dodatkowe przekształcenia aby wszystko działało OK?
« Ostatnia zmiana: Maj 03, 2010, 16:23:44 wysłana przez 6502 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

# Maj 03, 2010, 17:23:25
...Gdy ustawię kamerę w punkcie 0,0,0 wyświetla mi obiekty znajdujące się za nią z przodu, z dystansu.
Brak Bufora głębokości ?
Sorki. Nie umiem czytać ze zrozumieniem.

6502 - a co chcesz osiągnąć ?
GLfloat h = (GLfloat) height / (GLfloat) width;
  GLfloat xmax, znear, zfar;

  znear = 0.05f;
  zfar  = 3000000.0f;
  xmax  = znear * 1.0f;

  glViewport( 0, 0, (GLint) width, (GLint) height );
  glMatrixMode( GL_PROJECTION );
  glLoadIdentity();
  glFrustum( -xmax, xmax, -xmax*h, xmax*h, znear, zfar );
  glMatrixMode( GL_MODELVIEW );
  glLoadIdentity();
Oto przykładowy kod. Powinieneś mieć normalny widok

@Jeśli nie korzystasz z OGL > 3.0 , to spokojnie używaj wbudowanych funkcji:glFrustum , glRotate , glTranslate itp..

Edit kolejny:
Daj screen
« Ostatnia zmiana: Maj 03, 2010, 17:57:15 wysłana przez Wladekprogramista »

Offline 6502

  • Użytkownik

# Maj 03, 2010, 17:42:16
@Wladekprogramista: Prosty silnik 3D, do tego niezbędna jest kamera właśnie.
Dzięki za kod , ale nie korzystam z GLUT ani OpenGL.
« Ostatnia zmiana: Maj 03, 2010, 17:47:38 wysłana przez 6502 »

# Maj 03, 2010, 17:52:01
@Wladekprogramista: Prosty silnik 3D, do tego niezbędna jest kamera właśnie.
Dzięki za kod , ale nie korzystam z GLUT ani OpenGL.
A co tu ma glut do tego?

Powiem ci szczerze że nie bawiłem się w taką "akcelerację" 3D  :P
« Ostatnia zmiana: Maj 03, 2010, 18:36:55 wysłana przez Wladekprogramista »

Offline 6502

  • Użytkownik

# Maj 03, 2010, 18:26:05
oto zdjecie:
http://img690.imageshack.us/i/kamerag.png/
Punkty na siatce mają współrzędną Z równą 0, kamera w punkcie 0,0,0

(GLUT...fakt coś mi się pomyliło)

Offline hashedone

  • Użytkownik

# Maj 03, 2010, 18:38:49
Czy ty się w ogóle zastanowiłeś co robisz? SDL nie służy i w żaden sposób nie wspiera programowania 3D. Potrzebujesz do tego OGL (albo DX, ale jeśli korzystasz z SDL to OGL się ładnie integruje), lub jakiegoś silnika graficznego. Jeśli chcesz to robić w SDL to musisz rozwiązać sam problemy takie jak przekształcenia, rzutowanie, rasteryzacja, bufor głebokości, blending, wiele, wiele innych. Tego się nie robi (zwykle). Wprawdzie są coraz bardziej popularne raytracery opierające się o CPU, ale pisze się już w ogóle z pominięciem wszelkich api graficznych (a wyświetla ew. jakimś putpixelem, jednym wielkim surfacem, czy najlepiej przez użycie czegoś w stylu WinGDI). Ale jeśli był byś na etapie na którym byś był ewentualnie w stanie zabrać się za coś takiego nie zadawał byś takich pytań (ani nie wspominał o GLUT w takim kontekście). Zabierz się za jakieś normalne API 3D, albo jakiś silnik, bo SDL się do tego nie nadaje.

Offline James

  • Użytkownik

# Maj 03, 2010, 18:42:46
Może on po prostu pisze własny rasteryzer, to po co mu OGL? ;p

Offline 6502

  • Użytkownik

# Maj 03, 2010, 18:45:51
Tak, wbrew pozorom zastanawiałem się po co mi to. Nie mam w planach zbudowanie jakiegoś super silnika tylko zrozumienie jak działają podstawowe przekształcenia w świecie 3D, po prostu lubię takie rzeczy wiedzieć, chyba nie ma w tym nic dziwnego.Jak będę robił w przyszłości coś bardziej złożonego w lepszej bibliotece na pewno mi się to przyda.
« Ostatnia zmiana: Maj 03, 2010, 18:58:28 wysłana przez 6502 »

Offline Vx-x.

  • Użytkownik
    • Vx-x. Page

# Maj 03, 2010, 19:16:06
Poszukaj informacji na googlu o "software rasterizer", tutek jak to działa jest nawet na devmaster.net. Tu nie chodzi tylko o wymnożenie macierzy transformacji...
http://www.devmaster.net/articles/software-rendering/part1.php
« Ostatnia zmiana: Maj 03, 2010, 19:18:22 wysłana przez Vx-x. »

Offline 6502

  • Użytkownik

# Maj 03, 2010, 19:27:30
dzieki, rozejrzę się za tym
EDIT: na devmaster znalazłem wyjaśnienie, tak jak przypuszczałem źle obliczałem skalę dla x i y.
x`=x*distance/z;
y`=y*distance/z;
thnx
« Ostatnia zmiana: Maj 03, 2010, 20:07:47 wysłana przez 6502 »