Sign in Join
Wiki copytemporary

BGRABitmap tutorial 15/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: BGRABitmap tutorial 15/de

OldNewLine
1+Dieses Tutorial zeigt Ihnen, wie Sie 3D-Objekte mittels des TBGRAScene3D-Objekts darstellen.
2+
3+## Das Szenenobjekt
4+
5+Das Szenenobjekt ist in der Unit "BGRAScene3D" enthalten. Hier ist ein einfaches Beispiel:
6+
7+``` pascal
8+uses BGRAScene3D, BGRABitmap, BGRABitmapTypes;
9+
10+procedure TForm1.FormPaint(Sender: TObject);
11+var
12+ scene: TBGRAScene3D;
13+ bmp: TBGRABitmap;
14+ base: array of IBGRAVertex3D;
15+ topV: IBGRAVertex3D;
16+begin
17+ bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,BGRABlack);
18+
19+ scene := TBGRAScene3D.Create(bmp);
20+ //erzeugt eine Pyramide
21+ with scene.CreateObject(BGRA(255,240,128)) do
22+ begin
23+ //erzeugt die Kanten
24+ topV := MainPart.Add(0,-15,0);
25+ //die Basis der Pyramide ist im Uhrzeigersinn angeordnet, wenn wir von unten auf die Pyramide sehen
26+ base := MainPart.Add([-20,15,-20, 20,15,-20, 20,15,20, -20,15,20]);
27+
28+ AddFace(base);
29+ //fügt vier Flächen hinzu, die drei Kanten sind im Uhrzeigersinn angeordnet
30+ AddFace([base[0],topV,base[1]]);
31+ AddFace([base[1],topV,base[2]]);
32+ AddFace([base[2],topV,base[3]]);
33+ AddFace([base[3],topV,base[0]]);
34+ topV := nil;
35+ base := nil;
36+ end;
37+ scene.Render;
38+ scene.Free;
39+
40+ bmp.Draw(Canvas,0,0);
41+ bmp.Free;
42+end;
43+```
44+
45+Das Szenenobjekt zeichnet sich selbst auf ein TBGRABitmap-Objekt. Sie können die Bitmap entweder als Parameter beim Erzeugen des Objekts übergeben, so wie hier, oder nachträglich der Eigenschaft "Surface" zuweisen. Die Szene wird automatisch in der Bitmap zentriert.
46+
47+Das Szenenobjekt bietet die Funktion "CreateObject", welche eine Schnittstelle auf das erzeugte Objekt zurückgibt. Objekte innerhalb einer Szene werden automatisch freigegeben, wenn Sie die Szene freigeben.
48+
49+Ein Objekt hat eine Eigenschaft "MainPart", die es erlaubt, Kanten zu erzeugen und auf diese zuzugreifen. Die Koordinaten können als drei einzelne Werte angegeben werden, als TPoint3D-Records, oder als Array von einzelnen Werten, dessen Länge ein Vielfaches von 3 ist. Wenn Sie eine Kante erzeugen, erhalten Sie eine IBGRAVertex3D-Schnittstelle, die Sie zum Erzeugen von Flächen verwenden können.
50+
51+Die X-Achse zeigt nach rechts, die Y-Achse zeigt nach unten, und die Z-Achse zeigt vorwärts (hinter den Bildschirm). Das bedeutet, dass XY gleich liegt wie in einer Bitmap, und dass es einen Wert für die Tiefe gibt. Die Flächen müssen im Uhrzeigersinn geordnet sein, um sichtbar zu sein.
52+
53+Hier wird die Farbe für das gesamte Objekt beim Erzeugen festgelegt, aber Sie können sie auch individuell für jede Fläche setzen, oder für jede Kante.
54+
55+<figure>
56+<img src="BGRATutorial15a.png" title="BGRATutorial15a.png" />
57+<figcaption>BGRATutorial15a.png</figcaption>
58+</figure>
59+
60+Wie Sie sehen, wird die Pyramide von der Seite gezeigt, wir können also nur eine Fläche sehen. Es gibt auch keine Beleuchtung.
61+
62+Fügen Sie im 'with'-Block folgende Zeilen ein:
63+
64+``` pascal
65+ MainPart.Scale(1.3);
66+ MainPart.RotateYDeg(30);
67+ MainPart.RotateXDeg(20);
68+ MainPart.Translate(0,-5,0);
69+```
70+
71+Die erste Zeile macht das Objekt etwas größer. Zwei Drehungen werden angewendet. Die erste erfolgt um die Y-Achse und die zweite um die X-Achse. Um den Drehsinn festzulegen, schauen wir in Richtung einer Achse. Ein positiver Wert in Grad bedeutet eine Drehung im Uhrzeigersinn, ein positiver Wert in Radiant bedeutet eine Drehung im Gegenzeigersinn.
72+
73+Zuletzt erfolgt eine vertikale Schiebung, um das Objekt zu zentrieren.
74+
75+<figure>
76+<img src="BGRATutorial15b.png" title="BGRATutorial15b.png" />
77+<figcaption>BGRATutorial15b.png</figcaption>
78+</figure>
79+
80+Jetzt fügen wir etwas Licht hinzu:
81+
82+``` pascal
83+ //setzt die ambiente Helligkeit auf Dunkel (1 ist normale Helligkeit, 2 ist völliges Weiss)
84+ scene.AmbiantLightness := 0.5;
85+ //fügt eine direktionale Beleuchtung von links-oben hinzu, die maximale Helligkeit ist 0.5 + 1 = 1.5
86+ scene.AddDirectionalLight(Point3D(1,1,1), 1);
87+```
88+
89+Das Beispiel verwendet Helligkeitswerte. 0 ist schwarz, 1 bedeutet unveränderte Farbe, und 2 ist weiss. Die direktionale Beleuchtung braucht einen Point3D-Parameter, um die Richtung des Lichtstrahls anzuzeigen. Dieser muss nicht normalisiert werden.
90+
91+<figure>
92+<img src="BGRATutorial15c.png" title="BGRATutorial15c.png" />
93+<figcaption>BGRATutorial15c.png</figcaption>
94+</figure>
95+
96+## Ableiten von TBGRAScene3D
97+
98+Der Szenencode kann in ein Objekt eingebettet werden. Hier ist das vorige Beispiel in einer einzelnen Unit:
99+
100+``` pascal
101+unit ex1;
102+
103+{$mode objfpc}{$H+}
104+
105+interface
106+
107+uses
108+ Classes, SysUtils, BGRAScene3D, BGRABitmapTypes;
109+
110+type
111+
112+ { TExample1 }
113+
114+ TExample1 = class(TBGRAScene3D)
115+ SandColor: TBGRAPixel;
116+ constructor Create;
117+ procedure Render; override;
118+ end;
119+
120+implementation
121+
122+{ TExample1 }
123+
124+constructor TExample1.Create;
125+var
126+ base: array of IBGRAVertex3D;
127+ top: IBGRAVertex3D;
128+begin
129+ inherited Create;
130+
131+ SandColor := BGRA(255,240,128);
132+
133+ //erzeugt eine Pyramide
134+ with CreateObject(SandColor) do
135+ begin
136+ top := MainPart.Add(0,-15,0);
137+ //die Basis der Pyramide ist im Uhrzeigersinn angeordnet, wenn wir von unten auf die Pyramide sehen
138+ base := MainPart.Add([-20,15,-20, 20,15,-20, 20,15,20, -20,15,20]);
139+ AddFace(base);
140+ //fügt vier Flächen hinzu, die drei Kanten sind im Uhrzeigersinn angeordnet
141+ AddFace([base[0],top,base[1]]);
142+ AddFace([base[1],top,base[2]]);
143+ AddFace([base[2],top,base[3]]);
144+ AddFace([base[3],top,base[0]]);
145+
146+ MainPart.Scale(1.3);
147+ MainPart.RotateYDeg(30);
148+ MainPart.RotateXDeg(20);
149+ MainPart.Translate(0,-5,0);
150+ end;
151+
152+ //setzt die ambiente Helligkeit auf Dunkel (1 ist normale Helligkeit, 2 ist völliges Weiss)
153+ AmbiantLightness := 0.5;
154+ //fügt eine direktionale Beleuchtung von links-oben hinzu, die maximale Helligkeit ist 0.5 + 1 = 1.5
155+ AddDirectionalLight(Point3D(1,1,1),1);
156+
157+ //wir können Antialiasing eisetzen, weil es eine einfache Szene ist
158+ Antialiasing := True;
159+end;
160+
161+procedure TExample1.Render;
162+begin
163+ //füllt den Hintergrund
164+ Surface.GradientFill(0,0,Surface.Width,Surface.Height,SandColor,MergeBGRA(SandColor,BGRABlack),gtRadial,PointF(0,0),PointF(Surface.Width,Surface.Height),dmSet);
165+
166+ inherited Render;
167+end;
168+
169+end.
170+```
171+
172+Um die Szene jetzt zu zeichnen, geben wir ein:
173+
174+``` pascal
175+uses BGRABitmap, BGRABitmapTypes, BGRAScene3D, ex1;
176+
177+procedure TForm1.FormPaint(Sender: TObject);
178+var
179+ bmp: TBGRABitmap;
180+ scene: TBGRAScene3D;
181+begin
182+ bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,BGRABlack);
183+
184+ scene := TExample1.Create;
185+ scene.Surface := bmp;
186+ scene.Render;
187+ scene.Free;
188+
189+ bmp.Draw(Canvas,0,0);
190+ bmp.Free;
191+end;
192+```
193+
194+Nebenbei, es wurde Antialiasing und ein Hintergrund hinzugefügt. Beachten Sie, dass Antialiasing nur bei einfachen Szenen funktioniert. Komplexe Szenen mit Texturen und transparenten Farben werden nicht korrekt dargestellt.
195+
196+<figure>
197+<img src="BGRATutorial15d.png" title="BGRATutorial15d.png" />
198+<figcaption>BGRATutorial15d.png</figcaption>
199+</figure>
200+
201+[[BGRABitmap tutorial 14/de|Voriges Tutorial (Canvas 2D)]] \| [[BGRABitmap tutorial 16/de|Nächstes Tutorial (Texturen mit 3D-Objekten)]]
202+
203+Seite übersetzt von: --billyraybones 00:05, 21 October 2011 (CEST)
204+
205+---
206+*From the Free Pascal wiki, page "BGRABitmap tutorial 15/de", as it stood on 2020-02-10 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
207+Category: Graphics/de

Back to history