mirror of
https://github.com/stan220/godot-docs.git
synced 2026-09-08 18:29:11 +00:00
Add Rectangle Example to ArrayMesh (#11247)
* add rectangle arraymesh example * make webp image Co-authored-by: A Thousand Ships <96648715+AThousandShips@users.noreply.github.com> * spelling --------- Co-authored-by: Marites Hendrix <github_username@users.noreply.github.com> Co-authored-by: Hugo Locurcio <hugo.locurcio@hugo.pro> Co-authored-by: A Thousand Ships <96648715+AThousandShips@users.noreply.github.com>
This commit is contained in:
co-authored by
A Thousand Ships
Marites Hendrix
Hugo Locurcio
parent
f9730cf63f
commit
5e6880717d
@@ -227,9 +227,230 @@ Put together, the full code looks like:
|
|||||||
|
|
||||||
|
|
||||||
The code that goes in the middle can be whatever you want. Below we will present some
|
The code that goes in the middle can be whatever you want. Below we will present some
|
||||||
example code for generating a sphere.
|
example code for generating shapes, starting with a rectangle.
|
||||||
|
|
||||||
Generating geometry
|
Generating a rectangle
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Since we are using ``Mesh.PRIMITIVE_TRIANGLES`` to render, we will construct a rectangle
|
||||||
|
with triangles.
|
||||||
|
|
||||||
|
A rectangle is formed by two triangles sharing four vertices. For our example, we will create
|
||||||
|
a rectangle with its top left point at ``(0, 0, 0)`` with a width and length of one as shown below:
|
||||||
|
|
||||||
|
.. image:: img/array_mesh_rectangle_as_triangles.webp
|
||||||
|
:scale: 33%
|
||||||
|
:alt: A rectangle made of two triangles sharing four vertices.
|
||||||
|
|
||||||
|
To draw this rectangle, define the coordinates of each vertex in the ``verts`` array.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
.. code-tab:: gdscript GDScript
|
||||||
|
|
||||||
|
verts = PackedVector3Array([
|
||||||
|
Vector3(0, 0, 0),
|
||||||
|
Vector3(0, 0, 1),
|
||||||
|
Vector3(1, 0, 0),
|
||||||
|
Vector3(1, 0, 1),
|
||||||
|
])
|
||||||
|
|
||||||
|
.. code-tab:: csharp C#
|
||||||
|
|
||||||
|
verts.AddRange(new Vector3[]
|
||||||
|
{
|
||||||
|
new Vector3(0, 0, 0),
|
||||||
|
new Vector3(0, 0, 1),
|
||||||
|
new Vector3(1, 0, 0),
|
||||||
|
new Vector3(1, 0, 1),
|
||||||
|
});
|
||||||
|
|
||||||
|
The ``uvs`` array helps describe where parts of a texture should go onto the mesh. The values
|
||||||
|
range from 0 to 1. Depending on your texture, you may want to change these values.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
.. code-tab:: gdscript GDScript
|
||||||
|
|
||||||
|
uvs = PackedVector2Array([
|
||||||
|
Vector2(0, 0),
|
||||||
|
Vector2(1, 0),
|
||||||
|
Vector2(0, 1),
|
||||||
|
Vector2(1, 1),
|
||||||
|
])
|
||||||
|
|
||||||
|
.. code-tab:: csharp C#
|
||||||
|
|
||||||
|
uvs.AddRange(new Vector2[]
|
||||||
|
{
|
||||||
|
new Vector2(0, 0),
|
||||||
|
new Vector2(1, 0),
|
||||||
|
new Vector2(0, 1),
|
||||||
|
new Vector2(1, 1),
|
||||||
|
});
|
||||||
|
|
||||||
|
The ``normals`` array is used to describe the direction the vertices face and is
|
||||||
|
used in lighting calculations. For this example, we will default to the ``Vector3.UP``
|
||||||
|
direction.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
.. code-tab:: gdscript GDScript
|
||||||
|
|
||||||
|
normals = PackedVector3Array([
|
||||||
|
Vector3.UP,
|
||||||
|
Vector3.UP,
|
||||||
|
Vector3.UP,
|
||||||
|
Vector3.UP,
|
||||||
|
])
|
||||||
|
|
||||||
|
.. code-tab:: csharp C#
|
||||||
|
|
||||||
|
normals.AddRange(new Vector3[]
|
||||||
|
{
|
||||||
|
Vector3.Up,
|
||||||
|
Vector3.Up,
|
||||||
|
Vector3.Up,
|
||||||
|
Vector3.Up,
|
||||||
|
});
|
||||||
|
|
||||||
|
The ``indices`` array defines the order vertices are drawn. Godot
|
||||||
|
renders in a *clockwise* direction, meaning that we must specify the vertices
|
||||||
|
of a triangle we want to draw in clockwise order.
|
||||||
|
|
||||||
|
For example, to draw the first triangle, we will want to draw the vertices ``(0, 0, 0)``,
|
||||||
|
``(1, 0, 0)``, and ``(0, 0, 1)`` in that order. This is the same as drawing ``vert[0]``, ``vert[2]``, and
|
||||||
|
``vert[1]``, i.e., indices 0, 2, and 1, in the ``verts`` array. These index values are what the
|
||||||
|
``indices`` array defines.
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:header-rows: 1
|
||||||
|
:widths: auto
|
||||||
|
|
||||||
|
* - Index
|
||||||
|
- ``verts[Index]``
|
||||||
|
- ``uvs[Index]``
|
||||||
|
- ``normals[Index]``
|
||||||
|
|
||||||
|
* - 0
|
||||||
|
- (0, 0, 0)
|
||||||
|
- (0, 0)
|
||||||
|
- Vector3.UP
|
||||||
|
|
||||||
|
* - 1
|
||||||
|
- (0, 0, 1)
|
||||||
|
- (1, 0)
|
||||||
|
- Vector3.UP
|
||||||
|
|
||||||
|
* - 2
|
||||||
|
- (1, 0, 0)
|
||||||
|
- (0, 1)
|
||||||
|
- Vector3.UP
|
||||||
|
|
||||||
|
* - 3
|
||||||
|
- (1, 0, 1)
|
||||||
|
- (1, 1)
|
||||||
|
- Vector3.UP
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
.. code-tab:: gdscript GDScript
|
||||||
|
|
||||||
|
indices = PackedInt32Array([
|
||||||
|
0, 2, 1, # Draw the first triangle.
|
||||||
|
2, 3, 1, # Draw the second triangle.
|
||||||
|
])
|
||||||
|
|
||||||
|
.. code-tab:: csharp C#
|
||||||
|
|
||||||
|
indices.AddRange(new int[]
|
||||||
|
{
|
||||||
|
0, 2, 1, // Draw the first triangle.
|
||||||
|
2, 3, 1, // Draw the second triangle.
|
||||||
|
});
|
||||||
|
|
||||||
|
Put together, the rectangle generation code looks like:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
.. code-tab:: gdscript GDScript
|
||||||
|
|
||||||
|
extends MeshInstance3D
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
|
||||||
|
# Insert setting up the PackedVector**Arrays here.
|
||||||
|
|
||||||
|
verts = PackedVector3Array([
|
||||||
|
Vector3(0, 0, 0),
|
||||||
|
Vector3(0, 0, 1),
|
||||||
|
Vector3(1, 0, 0),
|
||||||
|
Vector3(1, 0, 1),
|
||||||
|
])
|
||||||
|
|
||||||
|
uvs = PackedVector2Array([
|
||||||
|
Vector2(0, 0),
|
||||||
|
Vector2(1, 0),
|
||||||
|
Vector2(0, 1),
|
||||||
|
Vector2(1, 1),
|
||||||
|
])
|
||||||
|
|
||||||
|
normals = PackedVector3Array([
|
||||||
|
Vector3.UP,
|
||||||
|
Vector3.UP,
|
||||||
|
Vector3.UP,
|
||||||
|
Vector3.UP,
|
||||||
|
])
|
||||||
|
|
||||||
|
indices = PackedInt32Array([
|
||||||
|
0, 2, 1,
|
||||||
|
2, 3, 1,
|
||||||
|
])
|
||||||
|
|
||||||
|
# Insert committing to the ArrayMesh here.
|
||||||
|
|
||||||
|
.. code-tab:: csharp C#
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
public partial class MeshInstance3d : MeshInstance3D
|
||||||
|
{
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
// Insert setting up the surface array and lists here.
|
||||||
|
|
||||||
|
verts.AddRange(new Vector3[]
|
||||||
|
{
|
||||||
|
new Vector3(0, 0, 0),
|
||||||
|
new Vector3(0, 0, 1),
|
||||||
|
new Vector3(1, 0, 0),
|
||||||
|
new Vector3(1, 0, 1),
|
||||||
|
});
|
||||||
|
|
||||||
|
uvs.AddRange(new Vector2[]
|
||||||
|
{
|
||||||
|
new Vector2(0, 0),
|
||||||
|
new Vector2(1, 0),
|
||||||
|
new Vector2(0, 1),
|
||||||
|
new Vector2(1, 1),
|
||||||
|
});
|
||||||
|
|
||||||
|
normals.AddRange(new Vector3[]
|
||||||
|
{
|
||||||
|
Vector3.Up,
|
||||||
|
Vector3.Up,
|
||||||
|
Vector3.Up,
|
||||||
|
Vector3.Up,
|
||||||
|
});
|
||||||
|
|
||||||
|
indices.AddRange(new int[]
|
||||||
|
{
|
||||||
|
0, 2, 1,
|
||||||
|
2, 3, 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Insert committing to the ArrayMesh here.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
For a more complex example, see the sphere generation section below.
|
||||||
|
|
||||||
|
Generating a sphere
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
Here is sample code for generating a sphere. Although the code is presented in
|
Here is sample code for generating a sphere. Although the code is presented in
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Reference in New Issue
Block a user