Code Vonc

Calcul des normales

Script COFFEE pour Cinéma 4D R13.

Comment installer ?How to install ?
CommentairesComments

Ce mini tutoriel vous montrera comment calculer la normale d'un polygone et d'un point dans Cinéma 4D avec un script COFFEE.



1. Normale d'un polygone :


Calcul de la normale (N) et du barycentre (O) d'un polygone :


main(doc, op)
{
	if (!op) return;
	var poly = op->GetPolygon(0);
	
	var ptnA = op->GetPoint(poly->a);
	var ptnB = op->GetPoint(poly->b);
	var ptnC = op->GetPoint(poly->c);
	var ptnD = op->GetPoint(poly->d);
	
	var normale = vcross((ptnA - ptnC) , (ptnB - ptnD));
	
	var ptnO;
	if (ptnC == ptnD) ptnO = (ptnA + ptnB + ptnC) / 3; // Triangle
	else ptnO = (ptnA + ptnB + ptnC + ptnD) / 4; // Quadrangle
	
	println(normale); // Normale
	println(ptnO); // Point O
}



2. Normale d'un sommet :


Calcul de la normale (NP) du sommet adjacent aux polygones 1, 2, 3 et 4, ayant respectivement les normales N1, N2, N3 et N4. :


	var NP = N1 + N2 + N3 + N4;


Calcul de la normale des polygones, des sommets, et le barycentre de chaque polygone d'un objet sélectionné :


main(doc, op)
{
	if (!op) return;

	var opNpol = op->GetPolygonCount();
	var opNpt = op->GetPointCount();

	var opNorPol = new(array, opNpol); // Tableau des normales des polys
	var opNorPt = new(array, opNpt); // Tableau des normales des sommets
	var opPosPol = new(array, opNpol); // Tableau de la position des polys

	var i;
	for (i = 0 ; i < opNpol ; i++) {
		var poly = op->GetPolygon(i);
		var ptnA = poly->a; // Indice du sommet
		var ptnB = poly->b;
		var ptnC = poly->c;
		var ptnD = poly->d;

		var ptnAp = op->GetPoint(ptnA); // Position du sommet
		var ptnBp = op->GetPoint(ptnB);
		var ptnCp = op->GetPoint(ptnC);
		var ptnDp = op->GetPoint(ptnD);

		opNorPol[i] = vcross((ptnAp - ptnCp) , (ptnBp - ptnDp)); // Normale du polygone

		if (!opNorPt[ptnA]) opNorPt[ptnA] = opNorPol[i]; // Normale du sommet
		else opNorPt[ptnA] +=  opNorPol[i];
		if (!opNorPt[ptnB]) opNorPt[ptnB] = opNorPol[i];
		else opNorPt[ptnB] +=  opNorPol[i];
		if (!opNorPt[ptnC]) opNorPt[ptnC] = opNorPol[i];
		else opNorPt[ptnC] +=  opNorPol[i];
		if (!opNorPt[ptnD]) opNorPt[ptnD] = opNorPol[i];
		else opNorPt[ptnD] +=  opNorPol[i];

		if (ptnD == ptnC) opPosPol[i] = (ptnAp + ptnBp + ptnCp)/3; // Calcul du centre du polygone, si c'est un triangle...
		else opPosPol[i] = (ptnAp + ptnBp + ptnCp + ptnDp)/4; // ...ou un quadrangle.

	}

// Le tableau opNorPol contient maintenant le vecteur normale de chaque polygone.
// Le tableau opNorPt contient maintenant le vecteur normale de chaque sommet.
// Le tableau opPosPol contient maintenant les coordonnées du centre de chaque polygone.

}