![]() |
Re: Eigene 3D-Engine
Ich kann mich irren, aber bezieht sich diese Formel nicht auf eine 3D darstellung eines Würfels, wo der Linienwinkel, die nach hinten gehen, genau 45° betragen
|
Re: Eigene 3D-Engine
Da ich mich nun auch zu denen zählen will die jedes rad selber erfinden wollen hab ich auch eine kleine 3D-Engine geschrieben, basierend nem happen Assembler und delphi code, einem bisschen canvas.
Kann 32bit texturen, z-bufferung und Alphablending ( MMX optimiert ;) aber noch nicht eingebunden ^^ ). hab das projekt aber geparkt weil mir das restliche optimieren zu stressig war. Denk dran, der Reiz an der Sache ist, es selber zu machen. versuch zu beginn erst mal beliebige polygone zweidimensional darzustellen. Dann hast dus schon fast ! Du willst code sehen ? tja... selbst is der programmierer ^^ |
Re: Eigene 3D-Engine
Liste der Anhänge anzeigen (Anzahl: 1)
achja ich hab das so hingezaubert
Delphi-Quellcode:
sollte noch dazu sagen: result kriegt die tatsächlichen Bildschirmkoordinaten und als z-wert die berechneten z-werte zum interpolieren ( z-buffer)
function transform3d(p: TPolygon):TPolygon;
var f1, f2, f3 : single; q: TPOlygoN; const fov = 300; begin // rotation q := p; q.a.x := round( p.a.x * cos(vp_a) + p.a.z * sin(vp_a)); q.a.z := round( p.a.z * cos(vp_a) - p.a.x * sin(vp_a)); q.b.x := round( p.b.x * cos(vp_a) + p.b.z * sin(vp_a)); q.b.z := round( p.b.z * cos(vp_a) - p.b.x * sin(vp_a)); q.c.x := round( p.c.x * cos(vp_a) + p.c.z * sin(vp_a)); q.c.z := round( p.c.z * cos(vp_a) - p.c.x * sin(vp_a)); p :=q; q.a.z := q.a.z+ vp_org.z; q.b.z := q.b.z+ vp_org.z; q.c.z := q.c.z+ vp_org.z; q.a.x := round( p.a.x * cos(vp_b) + p.a.y * sin(vp_b)); q.a.y := round( p.a.y * cos(vp_b) - p.a.x * sin(vp_b)); q.b.x := round( p.b.x * cos(vp_b) + p.b.y * sin(vp_b)); q.b.y := round( p.b.y * cos(vp_b) - p.b.x * sin(vp_b)); q.c.x := round( p.c.x * cos(vp_b) + p.c.y * sin(vp_b)); q.c.y := round( p.c.y * cos(vp_b) - p.c.x * sin(vp_b)); // projektion f1 := fov/(max(10,(fov+q.a.z))); // d/b f2 := fov/(max(10,(fov+q.b.z))); f3 := fov/(max(10,(fov+q.c.z))); result.a.x := screenXC + round((q.a.x + vp_org.x)*f1); result.b.x := screenXC + round((q.b.x + vp_org.x)*f2); result.c.x := screenXC + round((q.c.x + vp_org.x)*f3); result.a.y := screenYC - round((q.a.y + vp_org.y)*f1); result.b.y := screenYC - round((q.b.y + vp_org.y)*f2); result.c.y := screenYC - round((q.c.y + vp_org.y)*f3); result.a.z := q.a.z+fov; result.b.z := q.b.z+fov; result.c.z := q.c.z+fov; end; |
Re: Eigene 3D-Engine
Code:
Wie, was ging nicht ?
Hab das nun von Ben versucht, aber das ging nicht
Natürlich geht das! Habs doch selbst mal in jungen Jahren so gemacht! Wichtig ist natürlich das die Vektoren ein kartesisches Rechtssystem bilden und man sich nicht irgendwo verrechnet. Aber dann geht das garantiert! |
Re: Eigene 3D-Engine
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich hab mal uralten Sourcecode rausgekramt .. 10 Jahre alt *G* Damals noch in Trubo Pascal für DOS, und das mal nach Delphi portiert .. gab natürlich Probleme weil die Datentypen jetzt alle größer sind und ich das umpflügen musste, jetzt hauts aber hin, aber nicht alle Routinen sind Delphi kompatibel gemacht *g* Das Programm lädt die 3D Object beschreibung aus Box.3D und stellt den Würfel dar. Die 3D --> 2D Projektion erfolgt aber nicht mathematisch, sondern ignoriert einfach die Z Koordinate. Und bitte nehmt mich jetzt nicht auseinander weil der Sourcecode aussieht wie hingesch***** ... der ist wirklich von 1995. rantanplan |
Re: Eigene 3D-Engine
Zitat:
Bitte nicht übel nehmen, ich bin erst in der 9. Klasse. Und: Wenn die Z-Koordinate ausgelassen wird, ist es ja nicht 3d. ;) -NIP- |
Re: Eigene 3D-Engine
Zitat:
Zitat:
|
Re: Eigene 3D-Engine
naja ich sag nix mehr dazu ...
|
Re: Eigene 3D-Engine
mh doch zwei sachen ^^
erstens is zur Zeit Abistress auf der Speisekarte , zweitens zu meinem Codeschnipsel: vp ist Viewport vp_a ist der Winkel um die Hochachse, eigentlich fehlt noch vp_g also gamma damit ich alle drei winkel drin hab, hab ich aber noch nicht so weit gebraucht, und achja vp_org ist der origin also der Ursprung des Viewports. ScreenXC und YC sind die werte der Bildschirmmitte und gute nacht :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz