2010-08-11 1 views
7

Ich fragte mich, ob es ein Tutorial gab, das 3D-Graphik-Theorie mit dem entsprechenden Code, ohne mit OpenGL oder DirectX oder so etwas einführt. Ich bin sehr zufrieden mit der technischen Mathematik (ich bin ein A/V-DSP-Student, also arbeite ich die ganze Zeit mit viel Mathe). Die meisten Tutorials, die ich entweder sehe, zeigen mir die gleichen alten Matrix-Translations-/Rotations-Beispiele, zusammen mit einer Diskussion über Projektionen und zeigen mir ähnliche Dreiecke, wie Projektionen funktionieren, oder nehme an, dass du alles über 3D weißt oder einfach eine Menge davon verwendest OpenGL-Primitive. Ich habe ein Buch (Interaktive Computergrafik: Ein Top-Down-Ansatz) zu dem Thema bestellt, aber ich möchte jetzt sofort anfangen.3D-Grafik-Theorie und Code ohne OpenGL, DirectX, XNA, usw.

Ich würde wirklich gerne etwas, das nur mit einer SDL-Oberfläche oder einem Java Graphics2D-Objekt gearbeitet hat und nur Matrix Mathe verwendet, um alles zu rendern. Ich hatte gehofft, dass ich ein paar einfache Dinge machen könnte, wie zum Beispiel einige einfache Formen, bevor das Buch kam. Idealerweise etwas, das Themen einführte und codierte Beispiele gab, wie sie funktionierten.

EDIT: Alle Antworten waren großartig, aber ich liebte den Code. Genau das, was ich suchte, auch wenn es in Pascal war;)

Antwort

7

Begraben einige alte Pascal Quelle: D Vor etwa 14 Jahren habe ich es für die Anzeige sehr einfache 3D-Objekte verwendet. xrot, yrot, zrot drehen Punkte ([x, y, z] multipliziert mit der Rotationsmatrix). Und ich verwendete eine sehr einfache 3d-zu-2d-Transformation, basierend auf der Fluchtpunktprojektion mit dem Fluchtpunkt in der Mitte des Bildschirms. Als Beispiel ist ein Vertex-Array definiert. Sie müssen auch ein Trigons-Array hinzufügen.

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; 

bei gefüllten Trigonen, habe ich eine Funktion des Freundes, der die Form mit horizontalen Linien zieht (hline (x, y, Breite, Farbe)):

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 für pascal: D – Seth

2

Eine Möglichkeit, OpenGL und DirectX-Lösungen zu vermeiden, ist die Suche nach älteren Grafikbüchern, die OpenGL und DirectX älter sind - etwas aus der Mitte der 80er Jahre (OpenGL Mai) waren zwar schon vorhanden, aber am PC nicht weit verbreitet). Bereit sein, von GWBasic oder ähnlichem zu übersetzen. ;>

Oder nehmen Sie einfach ein Trigonometrie-Lehrbuch. Das Projizieren von 3D-Koordinaten auf 2D ist nichts anderes als trigonal und wird manchmal als ein fortgeschrittenes Thema in Trig-Büchern behandelt.

+0

Was Formen und Sachen füllen? – GrayGnome

+0

Mitte der 80er Jahre ist ein bisschen zu weit zurück (wahrscheinlich weit genug, dass jedes Codebeispiel nicht in C++ wäre). Ich habe ein paar Spiele Programmierbücher aus den späten 90er Jahren, die Software 3D im Detail diskutieren - Datenstrukturen, Geometrie, Rendering-Modi, Optimierung, etc. (Die ersten Verbraucher 3D-Hardware-Beschleuniger nicht den Massenmarkt bis 1996-ish). – Seth

+0

Suchen Sie nach SIGGRAPH Papieren. Sie decken so viele Sachen ab. – dthorpe

2

Diese Artikelserie hat mir geholfen, die Grundlagen der 3D-Grafik zu verstehen: Exploring 3D in Flash. Die Artikel befinden sich in Actionscript/ECMAScript in einer Flash DOM-Umgebung, können aber leicht in andere Umgebungen übersetzt werden.

Ich persönlich folgte den Artikeln, indem ich die Beispiele in Tcl/Tk-Zeichnung auf einer Tk-Leinwand übersetzte. Sie könnten stattdessen versuchen, Perl/Tk oder TkInter oder eine viel engere Übersetzung zu Javascript mit HTML5 Canvas oder etwas wie Raphael, um die Zeichnung zu tun. Am Ende des Artikels haben Sie eine einfache, aber brauchbare 3D API.

4

Dieses Buch

oder zumindest leihen Sie es von Ihrer nächsten Universitätsbibliothek.

Computer graphics, principles and practice


Es ist ein paar Jahre alt geworden, aber es war (vor der programmierbaren Shader-Revolution) als die Bibel Grafiken. Sie können wahrscheinlich die ersten paar Kapitel über Eingabemethoden und palettierte Displays überspringen, aber so gut wie alles andere hat sich hervorragend bewährt.

+0

Es ist eines von 2 Grafiken Bücher, die ich halten (die andere gegangen ist fehlt) und es ist dicker als eine Bibel :-) hier nichts falsch machen kann. – phkahler