Sign in Join
Wiki copytemporary

BGRABitmap tutorial 15/de: what changed

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

OldNewLine
11Dieses Tutorial zeigt Ihnen, wie Sie 3D-Objekte mittels des TBGRAScene3D-Objekts darstellen.
22
33## Das Szenenobjekt
44
55Das Szenenobjekt ist in der Unit "BGRAScene3D" enthalten. Hier ist ein einfaches Beispiel:
66
77``` pascal
88uses BGRAScene3D, BGRABitmap, BGRABitmapTypes;
99
1010procedure TForm1.FormPaint(Sender: TObject);
1111var
1212 scene: TBGRAScene3D;
1313 bmp: TBGRABitmap;
1414 base: array of IBGRAVertex3D;
1515 topV: IBGRAVertex3D;
1616begin
1717 bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,BGRABlack);
1818
1919 scene := TBGRAScene3D.Create(bmp);
2020 //erzeugt eine Pyramide
2121 with scene.CreateObject(BGRA(255,240,128)) do
2222 begin
2323 //erzeugt die Kanten
2424 topV := MainPart.Add(0,-15,0);
2525 //die Basis der Pyramide ist im Uhrzeigersinn angeordnet, wenn wir von unten auf die Pyramide sehen
2626 base := MainPart.Add([-20,15,-20, 20,15,-20, 20,15,20, -20,15,20]);
2727
2828 AddFace(base);
2929 //fügt vier Flächen hinzu, die drei Kanten sind im Uhrzeigersinn angeordnet
3030 AddFace([base[0],topV,base[1]]);
3131 AddFace([base[1],topV,base[2]]);
3232 AddFace([base[2],topV,base[3]]);
3333 AddFace([base[3],topV,base[0]]);
3434 topV := nil;
3535 base := nil;
3636 end;
3737 scene.Render;
3838 scene.Free;
3939
4040 bmp.Draw(Canvas,0,0);
4141 bmp.Free;
4242end;
4343```
4444
4545Das 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.
4646
4747Das 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.
4848
4949Ein 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.
5050
5151Die 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.
5252
5353Hier 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.
5454
55-<figure>
56-<img src="BGRATutorial15a.png" title="BGRATutorial15a.png" />
57-<figcaption>BGRATutorial15a.png</figcaption>
58-</figure>
55+![](/wiki-images/a/af/BGRATutorial15a.png)
5956
6057Wie Sie sehen, wird die Pyramide von der Seite gezeigt, wir können also nur eine Fläche sehen. Es gibt auch keine Beleuchtung.
6158
6259Fügen Sie im 'with'-Block folgende Zeilen ein:
6360
6461``` pascal
6562 MainPart.Scale(1.3);
6663 MainPart.RotateYDeg(30);
6764 MainPart.RotateXDeg(20);
6865 MainPart.Translate(0,-5,0);
6966```
7067
7168Die 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.
7269
7370Zuletzt erfolgt eine vertikale Schiebung, um das Objekt zu zentrieren.
7471
75-<figure>
76-<img src="BGRATutorial15b.png" title="BGRATutorial15b.png" />
77-<figcaption>BGRATutorial15b.png</figcaption>
78-</figure>
72+![](/wiki-images/2/29/BGRATutorial15b.png)
7973
8074Jetzt fügen wir etwas Licht hinzu:
8175
8276``` pascal
8377 //setzt die ambiente Helligkeit auf Dunkel (1 ist normale Helligkeit, 2 ist völliges Weiss)
8478 scene.AmbiantLightness := 0.5;
8579 //fügt eine direktionale Beleuchtung von links-oben hinzu, die maximale Helligkeit ist 0.5 + 1 = 1.5
8680 scene.AddDirectionalLight(Point3D(1,1,1), 1);
8781```
8882
8983Das 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.
9084
91-<figure>
92-<img src="BGRATutorial15c.png" title="BGRATutorial15c.png" />
93-<figcaption>BGRATutorial15c.png</figcaption>
94-</figure>
85+![](/wiki-images/5/5d/BGRATutorial15c.png)
9586
9687## Ableiten von TBGRAScene3D
9788
9889Der Szenencode kann in ein Objekt eingebettet werden. Hier ist das vorige Beispiel in einer einzelnen Unit:
9990
10091``` pascal
10192unit ex1;
10293
10394{$mode objfpc}{$H+}
10495
10596interface
10697
10798uses
10899 Classes, SysUtils, BGRAScene3D, BGRABitmapTypes;
109100
110101type
111102
112103 { TExample1 }
113104
114105 TExample1 = class(TBGRAScene3D)
115106 SandColor: TBGRAPixel;
116107 constructor Create;
117108 procedure Render; override;
118109 end;
119110
120111implementation
121112
122113{ TExample1 }
123114
124115constructor TExample1.Create;
125116var
126117 base: array of IBGRAVertex3D;
127118 top: IBGRAVertex3D;
128119begin
129120 inherited Create;
130121
131122 SandColor := BGRA(255,240,128);
132123
133124 //erzeugt eine Pyramide
134125 with CreateObject(SandColor) do
135126 begin
136127 top := MainPart.Add(0,-15,0);
137128 //die Basis der Pyramide ist im Uhrzeigersinn angeordnet, wenn wir von unten auf die Pyramide sehen
138129 base := MainPart.Add([-20,15,-20, 20,15,-20, 20,15,20, -20,15,20]);
139130 AddFace(base);
140131 //fügt vier Flächen hinzu, die drei Kanten sind im Uhrzeigersinn angeordnet
141132 AddFace([base[0],top,base[1]]);
142133 AddFace([base[1],top,base[2]]);
143134 AddFace([base[2],top,base[3]]);
144135 AddFace([base[3],top,base[0]]);
145136
146137 MainPart.Scale(1.3);
147138 MainPart.RotateYDeg(30);
148139 MainPart.RotateXDeg(20);
149140 MainPart.Translate(0,-5,0);
150141 end;
151142
152143 //setzt die ambiente Helligkeit auf Dunkel (1 ist normale Helligkeit, 2 ist völliges Weiss)
153144 AmbiantLightness := 0.5;
154145 //fügt eine direktionale Beleuchtung von links-oben hinzu, die maximale Helligkeit ist 0.5 + 1 = 1.5
155146 AddDirectionalLight(Point3D(1,1,1),1);
156147
157148 //wir können Antialiasing eisetzen, weil es eine einfache Szene ist
158149 Antialiasing := True;
159150end;
160151
161152procedure TExample1.Render;
162153begin
163154 //füllt den Hintergrund
164155 Surface.GradientFill(0,0,Surface.Width,Surface.Height,SandColor,MergeBGRA(SandColor,BGRABlack),gtRadial,PointF(0,0),PointF(Surface.Width,Surface.Height),dmSet);
165156
166157 inherited Render;
167158end;
168159
169160end.
170161```
171162
172163Um die Szene jetzt zu zeichnen, geben wir ein:
173164
174165``` pascal
175166uses BGRABitmap, BGRABitmapTypes, BGRAScene3D, ex1;
176167
177168procedure TForm1.FormPaint(Sender: TObject);
178169var
179170 bmp: TBGRABitmap;
180171 scene: TBGRAScene3D;
181172begin
182173 bmp := TBGRABitmap.Create(ClientWidth,ClientHeight,BGRABlack);
183174
184175 scene := TExample1.Create;
185176 scene.Surface := bmp;
186177 scene.Render;
187178 scene.Free;
188179
189180 bmp.Draw(Canvas,0,0);
190181 bmp.Free;
191182end;
192183```
193184
194185Nebenbei, 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.
195186
196-<figure>
197-<img src="BGRATutorial15d.png" title="BGRATutorial15d.png" />
198-<figcaption>BGRATutorial15d.png</figcaption>
199-</figure>
187+![](/wiki-images/9/95/BGRATutorial15d.png)
200188
201189[[BGRABitmap tutorial 14/de|Voriges Tutorial (Canvas 2D)]] \| [[BGRABitmap tutorial 16/de|Nächstes Tutorial (Texturen mit 3D-Objekten)]]
202190
203191Seite übersetzt von: --billyraybones 00:05, 21 October 2011 (CEST)
204192
205193---
206194*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).*
207195Category: Graphics/de

Back to history