@@ -227,9 +227,230 @@ Put together, the full code looks like:
227
227
228
228
229
229
The code that goes in the middle can be whatever you want. Below we will present some
230
- example code for generating a sphere .
230
+ example code for generating shapes, starting with a rectangle .
231
231
232
- Generating geometry
232
+ Generating a rectangle
233
+ ----------------------
234
+
235
+ Since we are using ``Mesh.PRIMITIVE_TRIANGLES `` to render, we will construct a rectangle
236
+ with triangles.
237
+
238
+ A rectangle is formed by two triangles sharing four vertices. For our example, we will create
239
+ a rectangle with its top left point at ``(0, 0, 0) `` with a width and length of one as shown below:
240
+
241
+ .. image :: img/array_mesh_rectangle_as_triangles.webp
242
+ :scale: 33%
243
+ :alt: A rectangle made of two triangles sharing four vertices.
244
+
245
+ To draw this rectangle, define the coordinates of each vertex in the ``verts `` array.
246
+
247
+ .. tabs ::
248
+ .. code-tab :: gdscript GDScript
249
+
250
+ verts = PackedVector3Array([
251
+ Vector3(0, 0, 0),
252
+ Vector3(0, 0, 1),
253
+ Vector3(1, 0, 0),
254
+ Vector3(1, 0, 1),
255
+ ])
256
+
257
+ .. code-tab :: csharp C#
258
+
259
+ verts.AddRange(new Vector3[]
260
+ {
261
+ new Vector3(0, 0, 0),
262
+ new Vector3(0, 0, 1),
263
+ new Vector3(1, 0, 0),
264
+ new Vector3(1, 0, 1),
265
+ });
266
+
267
+ The ``uvs `` array helps describe where parts of a texture should go onto the mesh. The values
268
+ range from 0 to 1. Depending on your texture, you may want to change these values.
269
+
270
+ .. tabs ::
271
+ .. code-tab :: gdscript GDScript
272
+
273
+ uvs = PackedVector2Array([
274
+ Vector2(0, 0),
275
+ Vector2(1, 0),
276
+ Vector2(0, 1),
277
+ Vector2(1, 1),
278
+ ])
279
+
280
+ .. code-tab :: csharp C#
281
+
282
+ uvs.AddRange(new Vector2[]
283
+ {
284
+ new Vector2(0, 0),
285
+ new Vector2(1, 0),
286
+ new Vector2(0, 1),
287
+ new Vector2(1, 1),
288
+ });
289
+
290
+ The ``normals `` array is used to describe the direction the vertices face and is
291
+ used in lighting calculations. For this example, we will default to the ``Vector3.UP ``
292
+ direction.
293
+
294
+ .. tabs ::
295
+ .. code-tab :: gdscript GDScript
296
+
297
+ normals = PackedVector3Array([
298
+ Vector3.UP,
299
+ Vector3.UP,
300
+ Vector3.UP,
301
+ Vector3.UP,
302
+ ])
303
+
304
+ .. code-tab :: csharp C#
305
+
306
+ normals.AddRange(new Vector3[]
307
+ {
308
+ Vector3.Up,
309
+ Vector3.Up,
310
+ Vector3.Up,
311
+ Vector3.Up,
312
+ });
313
+
314
+ The ``indices `` array defines the order vertices are drawn. Godot
315
+ renders in a *clockwise * direction, meaning that we must specify the vertices
316
+ of a triangle we want to draw in clockwise order.
317
+
318
+ For example, to draw the first triangle, we will want to draw the vertices ``(0, 0, 0) ``,
319
+ ``(1, 0, 0) ``, and ``(0, 0, 1) `` in that order. This is the same as drawing ``vert[0] ``, ``vert[2] ``, and
320
+ ``vert[1] ``, i.e., indices 0, 2, and 1, in the ``verts `` array. These index values are what the
321
+ ``indices `` array defines.
322
+
323
+ .. list-table ::
324
+ :header-rows: 1
325
+ :widths: auto
326
+
327
+ * - Index
328
+ - ``verts[Index] ``
329
+ - ``uvs[Index] ``
330
+ - ``normals[Index] ``
331
+
332
+ * - 0
333
+ - (0, 0, 0)
334
+ - (0, 0)
335
+ - Vector3.UP
336
+
337
+ * - 1
338
+ - (0, 0, 1)
339
+ - (1, 0)
340
+ - Vector3.UP
341
+
342
+ * - 2
343
+ - (1, 0, 0)
344
+ - (0, 1)
345
+ - Vector3.UP
346
+
347
+ * - 3
348
+ - (1, 0, 1)
349
+ - (1, 1)
350
+ - Vector3.UP
351
+
352
+ .. tabs ::
353
+ .. code-tab :: gdscript GDScript
354
+
355
+ indices = PackedInt32Array([
356
+ 0, 2, 1, # Draw the first triangle.
357
+ 2, 3, 1, # Draw the second triangle.
358
+ ])
359
+
360
+ .. code-tab :: csharp C#
361
+
362
+ indices.AddRange(new int[]
363
+ {
364
+ 0, 2, 1, // Draw the first triangle.
365
+ 2, 3, 1, // Draw the second triangle.
366
+ });
367
+
368
+ Put together, the rectangle generation code looks like:
369
+
370
+ .. tabs ::
371
+ .. code-tab :: gdscript GDScript
372
+
373
+ extends MeshInstance3D
374
+
375
+ func _ready():
376
+
377
+ # Insert setting up the PackedVector**Arrays here.
378
+
379
+ verts = PackedVector3Array([
380
+ Vector3(0, 0, 0),
381
+ Vector3(0, 0, 1),
382
+ Vector3(1, 0, 0),
383
+ Vector3(1, 0, 1),
384
+ ])
385
+
386
+ uvs = PackedVector2Array([
387
+ Vector2(0, 0),
388
+ Vector2(1, 0),
389
+ Vector2(0, 1),
390
+ Vector2(1, 1),
391
+ ])
392
+
393
+ normals = PackedVector3Array([
394
+ Vector3.UP,
395
+ Vector3.UP,
396
+ Vector3.UP,
397
+ Vector3.UP,
398
+ ])
399
+
400
+ indices = PackedInt32Array([
401
+ 0, 2, 1,
402
+ 2, 3, 1,
403
+ ])
404
+
405
+ # Insert committing to the ArrayMesh here.
406
+
407
+ .. code-tab :: csharp C#
408
+
409
+ using System.Collections.Generic;
410
+
411
+ public partial class MeshInstance3d : MeshInstance3D
412
+ {
413
+ public override void _Ready()
414
+ {
415
+ // Insert setting up the surface array and lists here.
416
+
417
+ verts.AddRange(new Vector3[]
418
+ {
419
+ new Vector3(0, 0, 0),
420
+ new Vector3(0, 0, 1),
421
+ new Vector3(1, 0, 0),
422
+ new Vector3(1, 0, 1),
423
+ });
424
+
425
+ uvs.AddRange(new Vector2[]
426
+ {
427
+ new Vector2(0, 0),
428
+ new Vector2(1, 0),
429
+ new Vector2(0, 1),
430
+ new Vector2(1, 1),
431
+ });
432
+
433
+ normals.AddRange(new Vector3[]
434
+ {
435
+ Vector3.Up,
436
+ Vector3.Up,
437
+ Vector3.Up,
438
+ Vector3.Up,
439
+ });
440
+
441
+ indices.AddRange(new int[]
442
+ {
443
+ 0, 2, 1,
444
+ 2, 3, 1,
445
+ });
446
+
447
+ // Insert committing to the ArrayMesh here.
448
+ }
449
+ }
450
+
451
+ For a more complex example, see the sphere generation section below.
452
+
453
+ Generating a sphere
233
454
-------------------
234
455
235
456
Here is sample code for generating a sphere. Although the code is presented in
0 commit comments