Sign in Join
Wiki copytemporary

BGRABitmap tutorial 10/de: what changed

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

OldNewLine
11Dieses Tutorial zeigt, wie Sie Texturen transformieren können ("texture mapping").
22
33### Erzeugen Sie ein neues Projekt
44
55Erzeugen Sie ein neues Projekt und fügen Sie eine Referenz auf [[BGRABitmap/de|BGRABitmap]] hinzu, genau so wie im [[BGRABitmap tutorial/de|ersten Tutorial]].
66
77### Verwenden des Vorgabe-Mappings
88
99Schauen wir uns an was passiert, wenn wir ein Polygon mit einer Textur zeichnen und dabei das Vorgabe-Mapping anwenden:
1010
1111``` pascal
1212procedure TForm1.FormPaint(Sender: TObject);
1313var image: TBGRABitmap;
1414 tex: TBGRABitmap;
1515begin
1616 //schwarzer Hintergrund
1717 image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );
1818
1919 tex:= TBGRABitmap.Create('image.png'); //lade eine Bitmap
2020 image.FillPolyAntialias( [PointF(110,10), PointF(250,10), PointF(350,160), PointF(10,160)], tex);
2121 tex.Free;
2222
2323 image.Draw(Canvas,0,0,True); //auf dem Bildschirm zeichnen
2424 image.free;
2525end;
2626```
2727
2828### Starten Sie das Programm
2929
3030Sie erhalten etwas in dieser Art:
3131
32-<figure>
33-<img src="BGRATutorial10a.png" title="BGRATutorial10a.png" />
34-<figcaption>BGRATutorial10a.png</figcaption>
35-</figure>
32+![](/wiki-images/7/7e/BGRATutorial10a.png)
3633
3734Wie Sie sehen ist das Bild nicht verformt.
3835
3936### Affine Transformation
4037
4138Wir können aber auch eine affine Transformation anwenden, wie folgt:
4239
4340``` pascal
4441uses BGRABitmap, BGRABitmapTypes, BGRATransform;
4542
4643procedure TForm1.PaintImage;
4744var image: TBGRABitmap;
4845 tex: TBGRABitmap;
4946 affine: TBGRAAffineBitmapTransform;
5047
5148begin
5249 //schwarzer Hintergrund
5350 image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );
5451
5552 tex:= TBGRABitmap.Create('image.png'); //lade eine Bitmap
5653
5754 //create a rotation of 45°
5855 affine := TBGRAAffineBitmapTransform.Create(tex,True);
5956 affine.RotateDeg(45);
6057
6158 //nimm diese Transformation als Parameter anstelle von 'tex'
6259 image.FillPolyAntialias( [PointF(110,10), PointF(250,10), PointF(350,160), PointF(10,160)], affine);
6360
6461 affine.Free;
6562 tex.Free;
6663
6764 image.Draw(Canvas,0,0,True); //auf dem Bildschirm zeichnen
6865 image.free;
6966end;
7067```
7168
7269### Starten Sie das Programm
7370
7471Sie erhalten ein gedrehtes Bild in dem Polygon:
7572
76-<figure>
77-<img src="BGRATutorial10b.png" title="BGRATutorial10b.png" />
78-<figcaption>BGRATutorial10b.png</figcaption>
79-</figure>
73+![](/wiki-images/2/2a/BGRATutorial10b.png)
8074
8175### Texturen-Mapping
8276
8377Wenn die Textur an der Polygonlinie ausgerichtet sein soll, dann setzen wir ein Textur-Mapping ein.
8478
8579#### Lineares Mapping
8680
8781Lineares Mapping streckt das Bild linear bis zu den Rändern. Dazu schreiben wir:
8882
8983``` pascal
9084procedure TForm1.PaintImage;
9185var image: TBGRABitmap;
9286 tex: TBGRABitmap;
9387begin
9488 image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );
9589
9690 tex:= TBGRABitmap.Create('image.png');
9791 image.FillPolyLinearMapping( [PointF(110,10), PointF(250,10), PointF(350,160), PointF(10,160)], tex,
9892 [PointF(0,0), PointF(tex.width-1,0), PointF(tex.Width-1,tex.Height-1), PointF(0,tex.Height-1)], true);
9993 tex.Free;
10094
10195 image.Draw(Canvas,0,0,True);
10296 image.free;
10397end;
10498```
10599
106100Für das Mapping benutzen wir die Prozedur 'FillPolyLinearMapping'. Einige Parameter sind neu. Die Texturkoordinaten legen für jeden Punkt des Polygons die Lage in der Textur fest. Die letzte Option 'Interpolation' liefert uns die beste Qualität.
107101
108102### Starten Sie das Programm
109103
110104Jetzt ist die Textur verformt, passend zur Form des Polygons.
111105
112-<figure>
113-<img src="BGRATutorial10c.png" title="BGRATutorial10c.png" />
114-<figcaption>BGRATutorial10c.png</figcaption>
115-</figure>
106+![](/wiki-images/f/f3/BGRATutorial10c.png)
116107
117108#### Perspektives Mapping
118109
119110Das perspektive Mapping erlaubt es, die Tiefe eines jeden Punktes zu ändern.
120111
121112``` pascal
122113procedure TForm1.PaintImage;
123114var image: TBGRABitmap;
124115 tex: TBGRABitmap;
125116begin
126117 image := TBGRABitmap.Create(ClientWidth,ClientHeight, BGRABlack );
127118
128119 tex:= TBGRABitmap.Create('image.png');
129120 image.FillPolyPerspectiveMapping( [PointF(110,10), PointF(250,10), PointF(350,160), PointF(10,160)],
130121 [75, 75, 50, 50],
131122 tex, [PointF(0,0), PointF(tex.width-1,0), PointF(tex.Width-1,tex.Height-1), PointF(0,tex.Height-1)], true);
132123 tex.Free;
133124
134125 image.Draw(Canvas,0,0,True);
135126 image.free;
136127end;
137128```
138129
139130Hier ist die Tiefe an der Polygonoberseite 75, am unteren Rand des Polygons bei 50. Dies bedeutet, dass die Unterseite näher beim Betrachter liegt, so als ob die Fläche horizontal wäre (wie ein Fussboden).
140131
141132### Starten Sie das Programm
142133
143134Jetzt scheint es sich um ein 3D-Polygon zu handeln:
144135
145-<figure>
146-<img src="BGRATutorial10d.png" title="BGRATutorial10d.png" />
147-<figcaption>BGRATutorial10d.png</figcaption>
148-</figure>
136+![](/wiki-images/6/67/BGRATutorial10d.png)
149137
150138### Schlussfolgerungen
151139
152140Mittels dieser Techniken ist es möglich, ein Bild zu verformen - wie in LazPaints Werkzeug "Gitterverformung" ("grid deformation") - oder 3D-Objekte mit Texturen darzustellen, wie in den Tests 19-21 der Funktion 'testbgrafunc' (ebenfalls im LazPaint-Archiv enthalten).
153141
154142[[BGRABitmap tutorial 9/de|Voriges Tutorial (Phong-Schattierung)]] \| [[BGRABitmap tutorial 11/de|Nächstes Tutorial (Kombinieren von Transformationen)]]
155143
156144---
157145*From the Free Pascal wiki, page "BGRABitmap tutorial 10/de", as it stood on 2020-02-09 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).*

Back to history