Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
03.02.2003, 22:11
Tron



ich hab vor einiger zeit (is auch schon nen paar monate her) angefangen nen kleinen raytracer zu schreiben. leider bin ich in letzter zeit so ziemlich garnicht dazu gekommen daran weiter zu schreiben, deshalb will ich mal zeigen, was ich bisher fabriziert habe, um mir selbst 'nen tritt in den a*** zu verpassen und mal wieder was daran zu schaffen.
nu erstmal ein kleinen bildchen und dann ein paar erlaeuterungen:


wer das ganz in gros (1024x768) sehen moechte: bild

zuerst sei mal gesagt, was man da ueberhaupt sieht:
im hintergrund eine ebene mit schachbtettmuster, in der mitte eine blaue kugel, um diese 1000 auf einer ellipse angeordnete kugeln, die immer groeser werden mit farbe von rot bis gelb

die szene ist nu nicht sonderlich aufregendes, zeigt aber immerhin alles, was mein raytracer so kann:
- diffuse beleuchtung
- reflektion
- schatten
(okok... das ist ja wohl absolutes muss fuer nen raytracer)
- phong highlights
- bisherige koerper: kugel, ebene und hintergrund (in dieser szene nicht verwendet)
dank polymorphie ist es ganz simpel weitere hinzuzufuegen: einfach von der abstrakten klasse objekt ableiten und die beiden methoden Intersect (schneiden) und Dye (einfaerben) implementieren.
- lichtquellen: punktlichtquelle, parallele lichtquelle (nicht in der szene), ambiente lichtquelle
ebenfalls dank polymorphie leicht erweiterbar
- texturen: bisher nur einfarbig und das allseits beliebte raytracer-standard-schachbrett-2farbig
hier sei ebenfalls auf polymorphie fuer erweiterungen verwiesen, (:
allerdings ist die texturschnittstelle noch nicht fertig.
zudem koennen texturen durch matrizen manipuliert werden, z.b. das schachbrettmuster in der szene ist gedreht und gestreckt.
- um farb-clipping zu vermeiden wird die farbe zunaechst ohne begrenzungen berechnet (als float) und dann per e-funktion in den ueblichen bereich zwischen 0-255 gequetscht, den unterschied zu normalem clipping erkennt man besonders bei den phong highlights, da diese keine 'farbringe' aufweisen sondern 'sanft' nach weiss blenden.
- das bild wird als .bmp auf die platte gebannt
fuer ein besseres format, z.b. png, war ich zu faul, .bmp tut's auch und fuer alles andere gibt's paint shop (;

was in planung ist:
- die koerper sollen durch matrizen veraenderbar sein.
- ebenfalls fehlt noch ein effektives system die szene einzuteilen, bisher liegt alles in einer lagen liste, d.h. fuer jedes pixel muss _jedes_ objekt getestet werden. (sau lahm)
- zu obigem punkt: bounding spheres oder boxes fuer die objekte

die szenenbeschreibung wird auf recht simple weise erzeugt:
Quellcode:Objects
  << new plane
    (
      vector(0, 0, -1), -0.5,
      surface(1.0, 0.0, 0.0, 0),
      new checker
        (
          colour(0.2, 0.2, 0.2), colour(0.6, 0.6, 0.6),
          1.0,
          rotateZ(-11.25 / 180 * 3.14159265) * scale(4, 2, 1)
        )
    )
  << new sphere
    (
      point(0, 0, 0.5), 0.5,
      surface(1.0, 1.0, 1.0, 80),
      new pigment(colour(0.1, 0.1, 0.5), 1.0)
    );
das fuegt die ebene im hintergrund und die blaue kugel ein.
kurze erklaerung:
Quellcode:<< new plane
    (
      vector(0, 0, -1), -0.5,
ebene in der normalen+abstand schreibweise
Quellcode:surface(1.0, 0.0, 0.0, 0),das ist das, was ich vorhin mit 'die textur-schnittstelle ist nochnicht fertig' meinte: hier sind die oberflaecheneigenschaften zusammengefasst; bis auf diffuse reflektion ist bei der ebene alles 0.
Quellcode:new checker
        (
die schachbretttextur
Quellcode:colour(0.2, 0.2, 0.2), colour(0.6, 0.6, 0.6),die beiden farben
Quellcode:1.0,diffuse refkletion... jaja, an der texturschnittstelle wird noch gearbeitet (:
Quellcode:rotateZ(-11.25 / 180 * 3.14159265) * scale(4, 2, 1)
        )
    )
und die transformation der textur: rotateZ und scale erzeugen entsprechende 4x4 matrizen.

bei den lichtquellen ist es analog: Lights << new lichtquelle(parameter);

wer dem programm bei der arbeit zusehen moechte: hier
das berechnet die szene in 1024x768 (dauert 'nen weilchen)

ich hoffe, ich finde bald mal wieder etwas zeit und muse, daran weiter zu werkeln.
ich bin fuer fragen, kritik und anregungen jeglicher art offen.

<edit>
ich sollte noch ein wort ueber meine entwicklungsumgebung verlieren: edit, MinGW, ein makefile und ein paar batches - ja, nennt mich pervers (:
</edit>

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 03.02.2003 um 22:18 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
03.02.2003, 22:16
Ornest



Öhmm .. ja .. EVIL! Sieht geil aus!
Ich möcht nicht unbedingt den ganzen Code sehen, war bestimmt viel Arbeit ;)

--

zum Seitenanfang zum Seitenende Profil || Suche
002
04.02.2003, 00:07
apfelkorn



wie hast du das parsen der szenenbeschreibung realisiert? über einen compilercompiler oder einen eigenen parser?

--

zum Seitenanfang zum Seitenende Profil || Suche
003
04.02.2003, 00:49
the_viking



hmm hardcoded würd ich sagen so wie ers oben beschrieben hat :)

aber scene-parsing ist doch gar nicht so schwer, leichter als ein raytracer würd ich sagen :)

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
004
04.02.2003, 06:46
Tron



@ornest: sind grade mal ca. 35k.

@apfelkorn/the_viking:
jo, quasi-hardcoded: ich habe eine klasse geschrieben, die ein dynamisches array ist. (also wenn es voll ist, verdoppelt es seine groese)
ja... is ja gut, im prinzip ist es ne billigversion der stl-vector klasse.
und ich habe den << operator ueberladen, um neue objekte anzufuegen.
nen parser hab ich noch keinen dafuer geschrieben, erstmal will ich nen halbwegs gescheiten raytracer fabrizieren, ein schoener parser steht da ganz unten auf der prioritaetenliste.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
005
04.02.2003, 08:04
WareWolf



very nice, erinnert mich an den guten alten Povray der nächtelang meinen 386er zum Schwitzen brachte. Das Ergebnis war dann eine Latte pseudoanimierter *.tga Bildchen in denen eine ChromeKugel auf einem Schachbrettboden an farbigen Zylindern vorbeirollte...
..oder an animierten Titelbuchstaben für ein eigenes Game:

auf jedenfall: Respekt, ist programmiertechnisch bestimmt nicht ohne, wenn sich auch über den Nutzen streiten lässt ;)

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche
006
04.02.2003, 12:18
the_viking



hmm aber einen raytracer zu coden ist sicher ein guter einstieg in die 3D-Engine welt

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
007
04.02.2003, 22:30
Tron



Zitat:
the_viking postete
hmm aber einen raytracer zu coden ist sicher ein guter einstieg in die 3D-Engine welt
wuerde ich nicht sagen, die zielsetzungen zwischen einem raytracer und einer3d engine unterscheiden sich deutlichst: bei einer 3d-engine geht es ums 'polys pushen', raytracer hingegen zielen auf qualitativ hochwertige bilder, da kann eine szene gut und gerne einige stunden brauchen, man denke an radiosity oder solche netten sachen.
auf vom aufbau haben beide nur sehr wenig gemeinsam

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
008
08.02.2003, 16:30
Prefect



... und die Freaks von http://www.openrt.de/ versuchen wohl alles, um das zu ändern ;)

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
009
08.02.2003, 22:00
the_viking



@Prefect: lol... wenn da mal was draus wird :) vielleicht in 5 Jahren

aber für nen raytracer braucht man gute 3D-Mathe Kentnisse, wenn man spiegelungen und schatten sowie "phong"-Highlights berechnen will

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche