Video tutorials

Setting-up the solution.

Code tour.

Register triangles from vertices.

2D simple circular shape.

ProceduralMesh et C++ dans Unreal.

J’ai eu a explorer les Procedural Mesh dans Unreal Engine sans passer par les blueprint, n’ayant pas trouvé de tutos en français qui couvrent le sujet, voici comment utiliser cet outil puissant. Je passerai quelques détails quant à la mise en place du projet et sauterai directement au code. Cette rédaction est droite au but!

Mise en place

Une fois un projet C++ dans Unreal Engine, créons une nouvelle classe qui hérite de la classe parent Actor.

Appelez cette classe comme vous le désirez! 🙂

Dans votre solution, vous aurez deux nouveaux fichiers.

Simple enough, mais il nous reste une dernière chose à faire avant de pouvoir utiliser les ProceduralMesh. Dans vos fichiers de build, ajoutez ces lignes (qui incluent le module requit). J’ai changé l’indentation de la ligne 11 pour préciser la lignehttps://antoinefortin.ca/media/de34062cd6af2ad843d766768ff7a7ff

Dans votre “nomdeprojet.uproject”-> incluez le ProceduralMeshComponenthttps://antoinefortin.ca/media/406147f8279cc19d8c44182c727edafd

À ce point ci, vous devriez être en mesure de compiler 🙂

Ajoutez le procedural mesh a l’acteur!

Dans votre AVotreActeur.h ajoutez ceci

Toujours inclure le .generated en dernier.

Dans les propriétés privées, ajoutez une UPROPERTY() et un pointeur vers le procedural Mesh que vous pouvez nommer comme vous le voulez. Je l’appelerai myProceduralMesh.https://antoinefortin.ca/media/a89af416188d47e566dcf1f0d8fb1485

Implémentons le .cpp

Dans votre constructeur ajoutez la création du procédural mesh (il se peut fortement que l’intellisense râle, mais votre compilateur acceptera le tout). Always believe the compiler after all! 😀

BasicProceduralMesh.cpphttps://antoinefortin.ca/media/0de3a2e94acf1c53b70a00d052f18ee8

Donc nous créons un mesh procédural dans le constructeur, maintenant, utilisons nos deux fonctions PostActorCreated() et PostLoad()

On peut voir un appel de la fonction CreerUnTriangle(). Dans la partie 2, nous créerons notre premier triangle en créant cette fonction dans notre fichier .cpp.

Créer un triangle

void ABasicProceduralMesh::creerTriangle()
{
	TArray<FVector> vertices;

	int triangleWidth = 100;
	int triangleHeight = 100;
	int curWidth = 0;
	int curHeight = 0;

	int numberOfTriangle = 10;
	int numberOfVertex = 0;
	for (int i = 0; i < numberOfTriangle; i++)
	{
		// Bottom Triangle
		vertices.Add(FVector(0, curWidth, 0));
		vertices.Add(FVector(0, (triangleWidth * i) + triangleWidth, 0));
		vertices.Add(FVector(0, (triangleWidth * i), triangleHeight));
		
		// Top triangle
		vertices.Add(FVector(0, curWidth, triangleHeight));
		vertices.Add(FVector(0, (triangleWidth * i) + triangleWidth, 0));
		vertices.Add(FVector(0, (triangleWidth * i) + triangleHeight, triangleHeight));

		
		for (int j = 0; j < 3;j++)
		{
			/*A*/ vertices.Add(FVector(0, curWidth, (j*triangleHeight) + triangleHeight));
			/*B*/ vertices.Add(FVector(0, curWidth + triangleWidth, (triangleHeight *j) + triangleHeight));
			/*C*/ vertices.Add(FVector(0, curWidth, (triangleHeight * (j + 1)) + triangleHeight ));
			curHeight += triangleHeight;
				
			numberOfVertex += 3;
		}
		curWidth += triangleWidth; 
		numberOfVertex += 6;
	}


	TArray<int32> Triangles;
	for (size_t i = 0; i < numberOfTriangle * numberOfVertex; i++)
	{
		Triangles.Add(i);
	}


	TArray<FVector> normals;
	normals.Add(FVector(1, 0, 0));
	normals.Add(FVector(1, 0, 0));
	normals.Add(FVector(1, 0, 0));

	TArray<FVector2D> UV0;
	UV0.Add(FVector2D(0, 0));
	UV0.Add(FVector2D(10, 0));
	UV0.Add(FVector2D(0, 10));


	TArray<FProcMeshTangent> tangents;
	tangents.Add(FProcMeshTangent(0, 1, 0));
	tangents.Add(FProcMeshTangent(0, 1, 0));
	tangents.Add(FProcMeshTangent(0, 1, 0));

	TArray<FLinearColor> vertexColors;
	vertexColors.Add(FLinearColor(0, 0, 0, 1.0));
	vertexColors.Add(FLinearColor(0.5, 0.5, 0.75, 1.0));
	vertexColors.Add(FLinearColor(0, 0, 0, 1.0));

	myProceduralMesh->CreateMeshSection_LinearColor(0, vertices, Triangles, normals, UV0, vertexColors, tangents, true);

	// Enable collision data
	myProceduralMesh->ContainsPhysicsTriMeshData(true);
}
https://antoinefortin.ca/media/45b4132bc24c1bbdf6efeca8bb4d4f59

Qui nous donne un mesh ainsi.

Next time:

Dans nos colomnes nous devons également supporter Le top triangle.

Until next time, much love!

Leave a Reply

Your email address will not be published. Required fields are marked *