2010-08-11 15 views
7

Zastanawiam się, czy istniał jakikolwiek samouczek wprowadzający teorię grafiki 3D przy wyświetlaniu odpowiedniego kodu, bez przy użyciu OpenGL lub DirectX lub czegoś podobnego. Jestem bardzo zadowolony z matematyki inżynierskiej (jestem studentem A/V DSP, więc cały czas pracuję z matematyką).Teoria grafiki 3D i kod bez OpenGL, DirectX, XNA, i in.

Większość samouczków, które widzę, pokazuje mi te same stare przykłady tłumaczenia/rotacji macierzy, wraz z dyskusją na temat rzutów i pokazuję mi użycie podobnych trójkątów, jak działają projekcje, lub zakładam, że wiesz wszystko o 3D lub po prostu używasz grona Prymitywy OpenGL. Zamówiłem książkę (Interactive Computer Graphics: A Top-Down Approach) na temat, ale chciałbym zacząć już teraz.

Naprawdę podoba mi się coś, co po prostu działało z powierzchnią SDL lub obiektem Java Graphics2D i po prostu wykorzystałem matematykę matematyczną do renderowania wszystkiego. Miałem nadzieję, że uda mi się zrobić proste rzeczy, takie jak renderowanie prostych kształtów, zanim książka nadejdzie. Idealnie coś, co wprowadzało tematy i dawało zakodowane przykłady na temat ich działania.

EDYCJA: Wszystkie odpowiedzi były świetne, ale po prostu uwielbiałem kod. Dokładnie to, czego szukałem, nawet jeśli było to w Pascalu;)

Odpowiedz

7

Pochowany stary źródło paskal: D Około 14 lat temu użyłem go do wyświetlania bardzo prostych obiektów 3d. Xrot, yrot, zrot mają obracać punkty ([x, y, z] pomnożone przez macierz rotacji). Użyłem też bardzo prostej transformacji 3D-to-2d, opartej na projekcji zanikającego punktu z punktem zbiegu na środku ekranu. Jako przykład istnieje zdefiniowana tablica wierzchołków. Musisz również dodać tablicę trigonów.

const depth = 1500; 
     deg = pi/180; 

     { some vertices for a dice :) } 
     vertices:array[0..23] of real= (50, 50, 50,  { 0} 
           -50, 50, 50,  { 1} 
            50,-50, 50,  { 2} 
           -50,-50, 50,  { 3} 
            50, 50,-50,  { 4} 
           -50, 50,-50,  { 5} 
            50,-50,-50,  { 6} 
           -50,-50,-50,  { 7} 
           ); 

{ transform 3d coordinates to pixel coordinates } 
procedure 3d_to_2d(x, y, z : real; var px, py : longint); 
var k:real; 
begin 
k:=((depth shr 1)+z)/depth; 
px:=(getmaxx shr 1)+trunc(x*k);  { getmaxx is the width of the screen } 
py:=(getmaxy shr 1)+trunc(y*k);  { getmaxy is the height of the screen } 
end; 

{ rotate around the x axis by rx degrees } 
procedure xrot(var x,y,z:real;rx:integer); 
var x1,y1,z1:real; 
begin 
y1:=(y * cos(rx * deg))+(z* (sin(rx * deg))); 
z1:=(-y* sin(rx * deg))+(z* (cos(rx * deg))); 
y:=y1; z:=z1; 
end; 

{ rotate around the y axis by ry degrees } 
procedure yrot(var x,y,z:real;ry:integer); 
var x1,y1,z1:real; 
begin 
x1:=(x * cos(ry * deg))+(z*(sin(ry * deg))); 
z1:=(-x * sin(ry * deg))+(z*(cos(ry * deg))); 
x:=x1; z:=z1; 
end; 

{ rotate around the z axis by rz degrees } 
procedure zrot(var x,y,z:real; rz:integer); 
var x1,y1,z1:real; 
begin 
x1:=(x* cos(rz * deg))+(y*(sin(rz * deg))); 
y1:=(-x* sin(rz * deg))+(y*(cos(rz * deg))); 
x:=x1; y:=y1; 
end; 

wypełniaczami trigons użyłem funkcji znajomego, który rysuje kształt przy pomocy linii poziomych (hline (x, y, szerokość, kolor)):

TYPE pt=RECORD x,y:LongInt;END; 

PROCEDURE Tri(P:ARRAY OF pt;co:BYTE); 
VAR q,w:INTEGER; 
    S:pt; 
    f12,f13,f23:LongInt; 
    s1,s2:LongInt; 


BEGIN 

    IF p[0].y>p[2].y THEN BEGIN s:=p[0];p[0]:=p[2];p[2]:=s;END; { sort the points } 
    IF p[0].y>p[1].y THEN BEGIN s:=p[0];p[0]:=p[1];p[1]:=s;END; 
    IF p[1].y>p[2].y THEN BEGIN s:=p[1];p[1]:=p[2];p[2]:=s;END; 

    q:=(p[0].y-p[1].y); { y distance between point 0 and 1 } 
    IF q<>0 THEN f12:=LongInt((p[0].x-p[1].x) shl 6) DIV q ELSE f12:=0; 

    q:=(p[0].y-p[2].y); 
    IF q<>0 THEN f13:=LongInt((p[0].x-p[2].x) shl 6) DIV q ELSE f13:=0; 

    q:=(p[1].y-p[2].y); 
    IF q<>0 THEN f23:=LongInt((p[1].x-p[2].x) shl 6) DIV q ELSE f23:=0; 

    s1:=p[0].x shl 6;s2:=s1; 
    FOR q:=p[0].y TO p[1].y DO 
    BEGIN 
    Hline(s1 shr 6,s2 shr 6,q,co); 
    s1:=s1+f12; 
    s2:=s2+f13; 
    END; 
    s1:=p[2].x shl 6;s2:=s1; 
    FOR q:=p[2].y DOWNTO p[1].y DO 
    BEGIN 
    Hline(s1 shr 6,s2 shr 6,q,co); 
    s1:=s1-f23; 
    s2:=s2-f13; 
    END; 
END; 
+2

+1 dla pascal: D – Seth

2

Jednym ze sposobów na uniknięcie OpenGL i DirectX jest szukanie starszych książek graficznych sprzed OpenGL i DirectX - na przykład coś z połowy lat 80. (OpenGL może były w pobliżu, ale nie w powszechnym użyciu na PC). Przygotuj się do tłumaczenia z GWBasic lub podobnego. ;>

Lub po prostu podnieś podręcznik do trygonometrii. Projekcja 3D Coords na 2D jest niczym innym, jak wyzwalaczem, a czasem jest opisywana jako zaawansowany temat w podręcznikach trig.

+0

Co z wypełnianiem kształtów i tym podobnych rzeczy? – GrayGnome

+0

Połowa lat 80. jest nieco zbyt daleko w tyle (prawdopodobnie wystarczająco daleko, aby jakikolwiek przykład kodu nie był w C++). Mam kilka książek o programowaniu gier z końca lat 90., które szczegółowo omawiają oprogramowanie 3D - struktury danych, geometria, tryby renderowania, optymalizacja itp. (Pierwsze akceleratory sprzętowe 3D konsumentów nie trafiły na rynek masowy do 1996 r.). – Seth

+0

Poszukaj dokumentów SIGGRAPH. Obejmują wiele takich rzeczy. – dthorpe

2

Ta seria artykułów pomogła mi zrozumieć podstawy grafiki 3D: Exploring 3D in Flash. Artykuły są w Actionscript/ECMAScript w środowisku Flash DOM, ale można je łatwo przetłumaczyć na inne środowiska.

Osobiście śledziłem artykuły, tłumacząc przykłady na rysunek Tcl/Tk na płótnie Tk. Zamiast tego możesz wypróbować Perl/Tk lub TkInter lub znacznie bliższe tłumaczenie na javascript przy użyciu płótna HTML5 lub coś w rodzaju Raphael, aby wykonać rysunek. Pod koniec artykułu pojawi się prosty, ale użyteczny interfejs 3D API.

4

Zdobądź tę książkę

lub przynajmniej pożyczyć go z najbliższej biblioteki uniwersyteckiej.

Computer graphics, principles and practice


To kilka lat teraz, ale to było (przed rewolucją programowalnych shaderów) uważany Biblii grafika. Prawdopodobnie można pominąć wiele pierwszych rozdziałów dotyczących metod wprowadzania i wyświetlaczy na paletach, ale prawie wszystko inne wyjątkowo dobrze się spisało.

+0

Jest to jedna z 2 książek graficznych, które przechowuję (druga zaginęła) i jest grubsza niż Biblia :-) Nie może się tu nie udać. – phkahler