Sign in Join
Wiki copytemporary

BGRABitmap tutorial 16/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 Texturen an 3D-Objekten anwenden.
22
33## Texturen erzeugen
44
55Zum Erzeugen der Texturen, benutzen wir die folgende Unit. Wie diese funktioniert, können Sie im [[BGRABitmap tutorial 8/de|Texturen-Tutorial]] nachlesen. Hier ist die Unit :
66
77``` pascal
88unit utexture;
99
1010{$mode objfpc}{$H+}
1111
1212interface
1313
1414uses
1515 Classes, SysUtils, BGRABitmap, BGRABitmapTypes;
1616
1717function CreateGrassTexture(tx,ty: integer): TBGRABitmap;
1818function CreateVerticalWoodTexture(tx, ty: integer): TBGRABitmap;
1919function CreateWoodTexture(tx,ty: integer): TBGRABitmap;
2020
2121implementation
2222
2323uses BGRAGradients;
2424
2525function Interp256(value1,value2,position: integer): integer; inline;
2626begin
2727 result := (value1*(256-position)+value2*position) shr 8;
2828end;
2929
3030function Interp256(color1,color2: TBGRAPixel; position: integer): TBGRAPixel; inline;
3131begin
3232 result.red := Interp256(color1.red,color2.red,position);
3333 result.green := Interp256(color1.green,color2.green,position);
3434 result.blue := Interp256(color1.blue,color2.blue,position);
3535 result.alpha := Interp256(color1.alpha,color2.alpha,position);
3636end;
3737
3838function CreateWoodTexture(tx,ty: integer): TBGRABitmap;
3939var
4040 colorOscillation, globalColorVariation: integer;
4141 p: PBGRAPixel;
4242 i: Integer;
4343begin
4444 result := CreateCyclicPerlinNoiseMap(tx,ty,1.5,1.5,1,rfBestQuality);
4545 p := result.Data;
4646 for i := 0 to result.NbPixels-1 do
4747 begin
4848 colorOscillation := round(sqrt((sin(p^.red*Pi/16)+1)/2)*256);
4949 globalColorVariation := p^.red;
5050 p^:= Interp256( Interp256(BGRA(247,188,120),BGRA(255,218,170),colorOscillation),
5151 Interp256(BGRA(157,97,60),BGRA(202,145,112),colorOscillation), globalColorVariation);
5252 inc(p);
5353 end;
5454end;
5555
5656function CreateVerticalWoodTexture(tx, ty: integer): TBGRABitmap;
5757var
5858 globalPos: single;
5959 colorOscillation, globalColorVariation: integer;
6060 p: PBGRAPixel;
6161 i: Integer;
6262 x,nbVertical: integer;
6363begin
6464 result := CreateCyclicPerlinNoiseMap(tx,ty,1,1,1,rfBestQuality);
6565 p := result.Data;
6666 x := 0;
6767 nbVertical := tx div 128;
6868 if nbVertical = 0 then nbVertical := 1;
6969 for i := 0 to result.NbPixels-1 do
7070 begin
7171 globalPos := p^.red*Pi/32 + nbVertical*x*2*Pi/tx*8;
7272 colorOscillation := round(sqrt((sin(globalPos)+1)/2)*256);
7373 globalColorVariation := p^.red; //round(sin(globalPos/8)*128+128);
7474 p^:= Interp256( Interp256(BGRA(247,188,120),BGRA(255,218,170),colorOscillation),
7575 Interp256(BGRA(157,97,60),BGRA(202,145,112),colorOscillation), globalColorVariation);
7676 inc(p);
7777 inc(x);
7878 if x = tx then x := 0;
7979 end;
8080end;
8181
8282function CreateGrassTexture(tx,ty: integer): TBGRABitmap;
8383var
8484 p: PBGRAPixel;
8585 i: Integer;
8686begin
8787 result := CreateCyclicPerlinNoiseMap(tx,ty,1,1,1,rfBestQuality);
8888 p := result.Data;
8989 for i := 0 to result.NbPixels-1 do
9090 begin
9191 p^ := Interp256( BGRA(0,128,0), BGRA(192,255,0), p^.red );
9292 inc(p);
9393 end;
9494end;
9595
9696end.
9797```
9898
9999## Holzwürfel auf dem Gras
100100
101101Hier ist eine Unit die eine Szene erzeugt mit einem Flecken Gras und darauf einem Würfel aus Holz:
102102
103103``` pascal
104104unit ex2;
105105
106106{$mode objfpc}{$H+}
107107
108108interface
109109
110110uses
111111 Classes, SysUtils, BGRAScene3D, BGRABitmap, BGRABitmapTypes;
112112
113113type
114114 { TExample2 }
115115
116116 TExample2 = class(TBGRAScene3D)
117117 grass,wood,vWood: TBGRABitmap;
118118
119119 constructor Create;
120120 procedure ApplyTexCoord(face: IBGRAFace3D; Times: integer = 2);
121121 procedure Render; override;
122122 destructor Destroy; override;
123123 end;
124124
125125implementation
126126
127127uses utexture;
128128
129129const texSize = 128;
130130
131131{ TExample2 }
132132
133133constructor TExample2.Create;
134134var
135135 base,v: array of IBGRAVertex3D;
136136 box : IBGRAObject3D;
137137begin
138138 inherited Create;
139139
140140 //erzeugt die Texturen
141141 grass := CreateGrassTexture(texSize,texSize);
142142 vWood := CreateVerticalWoodTexture(texSize,texSize);
143143 wood := CreateWoodTexture(texSize,texSize);
144144
145145 //erzeugt den Boden
146146 with CreateObject(grass) do
147147 begin
148148 base := MainPart.Add([-50,20,-50, -50,20,50, 50,20,50, 50,20,-50]);
149149 ApplyTexCoord(AddFace(base),4);
150150 end;
151151
152152 //erzeugt die Holzkiste
153153 box := CreateObject(vWood);
154154 with box do
155155 begin
156156 v := MainPart.Add([-1,-1,-1, 1,-1,-1, 1,1,-1, -1,1,-1,
157157 -1,-1,+1, 1,-1,+1, 1,1,+1, -1,1,+1]);
158158
159159 ApplyTexCoord(AddFace([v[0],v[1],v[2],v[3]]));
160160 ApplyTexCoord(AddFace([v[4],v[5],v[1],v[0]],wood));
161161 ApplyTexCoord(AddFace([v[7],v[6],v[5],v[4]]));
162162 ApplyTexCoord(AddFace([v[3],v[2],v[6],v[7]],wood));
163163 ApplyTexCoord(AddFace([v[1],v[5],v[6],v[2]]));
164164 ApplyTexCoord(AddFace([v[4],v[0],v[3],v[7]]));
165165
166166 MainPart.Scale(20);
167167 end;
168168 //RemoveObject(box);
169169
170170 ViewPoint := Point3D(-40,-40,-100);
171171end;
172172
173173procedure TExample2.ApplyTexCoord(face: IBGRAFace3D; Times: integer);
174174begin
175175 with face do
176176 begin
177177 TexCoord[0] := PointF(0,0);
178178 TexCoord[1] := PointF(texSize*Times-1,0);
179179 TexCoord[2] := PointF(texSize*Times-1,texSize*Times-1);
180180 TexCoord[3] := PointF(0,texSize*Times-1);
181181 end;
182182end;
183183
184184procedure TExample2.Render;
185185begin
186186 inherited Render;
187187end;
188188
189189destructor TExample2.Destroy;
190190begin
191191 grass.free;
192192 wood.free;
193193 vWood.free;
194194 inherited Destroy;
195195end;
196196
197197end.
198198```
199199
200200Zuerst werden die benötigten Texturen erzeugt. Der Grasflecken ist ein Objekt mit Grastextur, festgelegt durch 4 Kanten. Die Textur ist als Parameter der Funktion "CreateObject" festgelegt. "AddFace" gibt ein IBGRAFace3D-Objekt zurück, das an die benutzerdefinierte Prozedur "ApplyTexCoord" weitergegeben wird. Diese Prozedur setzt die Eigenschaft "TexCoord" einen jeden Kante der Fläche. Diese Koordinaten sind pixelzentrierte Fließkommakoordinaten.
201201
202202Die hölzerne Kiste wird als Objekt mit vertikaler Holztextur erzeugt. Die Kanten definieren einen Würfel mit Unit-Koordinaten. Dieser wird später skaliert. Beim Erzeugen der Grund- und Deckfläche wenden wir eine andere Textur an, nämlich eine dazu senkrechte Holztextur.
203203
204204Zuletzt legen wir die Sichtbarkeit fest. Die soll ein bisschen von der Seite erfolgen. Der Standardwert ist (0,0,-100). Auf diese Weise hat die Szene etwas Perspektive.
205205
206-<figure>
207-<img src="BGRATutorial16a.png" title="BGRATutorial16a.png" />
208-<figcaption>BGRATutorial16a.png</figcaption>
209-</figure>
206+![](/wiki-images/c/c2/BGRATutorial16a.png)
210207
211208### Beleuchtung und Normalen
212209
213210Wir fügen einfach etwas Licht hinzu:
214211
215212``` pascal
216213 LightingNormal:= lnFace;
217214
218215 AmbiantLightness := 0.25;
219216 with CreateObject do
220217 begin
221218 AddPointLight(MainPart.Add(-100,-80,0),140,0.5);
222219 end;
223220```
224221
225222Hier wird die Helligkeit genau so wie im letzten Tutorial verwendet. Aber die Lichtquelle ist punktförmig. Um eine Kante festzulegen brauchen wir ein Objekt, das diese beinhaltet. Es ist möglich, später das Licht zu verschieben. Je weiter ein Objekt vom Licht entfernt ist, desto dunkler ist es. Der Parameter der optimalen Distanz gibt die Distanz an, die Lichtintensität steht im nächsten Parameter. Das bedeutet, wenn ein Objekt in einer Distanz von 140 ist, dann ist die Helligkeit 0.5.
226223
227224Beachten Sie: Wir haben LightingNormal zu lnFace festgelegt. Dies ergibt, dass das Licht so berechnet wird, als wären die Seitenflächen flach. Die Beleutung berücksichtigt keine Abrundungen. Die könnte in anderen Fällen nützlich sein, aber nicht hier.
228225
229-<figure>
230-<img src="BGRATutorial16b.png" title="BGRATutorial16b.png" />
231-<figcaption>BGRATutorial16b.png</figcaption>
232-</figure>
226+![](/wiki-images/3/3a/BGRATutorial16b.png)
233227
234228[[BGRABitmap tutorial 15/de|Voriges Tutorial (3D)]]
235229
236230Seite übersetzt durch: --billyraybones 12:06, 23 October 2011 (CEST)
237231
238232---
239233*From the Free Pascal wiki, page "BGRABitmap tutorial 16/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).*

Back to history