/******************************************************************** Monkey Saddle Plugin für Cinema 4D Version 5 (c) Jürgen Meier (www.3d-meier.de) Version : 1.01 11.02.2004 *********************************************************************/ Function(doc) { // Variablen deklarieren var i,j, // Indizes für die Schleifen zz, // Zähler u, // Parameter für die Fläche v, // Parameter für die Fläche du, // Segmentbreite u dv, // Segmentbreite v x, // x Koordinate eines Punktes y, // y Koordinate eines Punktes z, // z Koordinate eines Punktes SP, // Anzahl Punkte des Polygonobjektes SK, // Anzahl Kanten des Polygonobjektes SQ, // Anzahl Quadrate des Polygonobjektes P1,P2,P3,P4; // Punkte für ein Quadrat // Eingabe der Variablen var d = new(SimpleDialog); d->SetTitle("Monkey Saddle"); d->SetData(0,"u-Min",FIELD_FLOAT,-1000,1000,-1); d->SetData(1,"u-Max",FIELD_FLOAT,-1000,1000,1); d->SetData(2,"v-Min",FIELD_FLOAT,-1000,1000,-1); d->SetData(3,"v-Max",FIELD_FLOAT,-1000,1000,1); d->SetData(4,"Skalierungsfaktor",FIELD_FLOAT,1,10000,100); d->SetData(5,"Nu",FIELD_INTEGER,1,1000,25); d->SetData(6,"Nv",FIELD_INTEGER,1,1000,25); if (!d->DoDialog()) return FALSE; var uMin=(d->GetData(0)); // Bereich u var uMax=(d->GetData(1)); // Bereich v var vMin=(d->GetData(2)); // Bereich v var vMax=(d->GetData(3)); // Bereich v var f=(d->GetData(4)); // Skalierungsfaktor var Nu=(d->GetData(5)); // Anzahl Unterteilungen u var Nv=(d->GetData(6)); // Anzahl Unterteilungen v // Segmentbreiten berechnen du=(uMax-uMin)/Nu; dv=(vMax-vMin)/Nv; // Parameter des Polygonobjektes berechnen // Anzahl Punkte des Polygonobjektes SP=(Nu+1)*(Nv+1); // Anzahl Kanten des Polygonobjektes SK=Nu*(Nv+1) + Nv*(Nu+1); // Anzahl Quadrate des Polygonobjektes SQ=Nu*Nv; // Polygonobjekt erzeugen var M=doc->NewPolygonObject("Monkey Saddle",NULL,NULL,SP,SK,0,SQ); // Punkte des Polygonobjektes berechnen /******************************************************************** ANORDNUNG DER PUNKTE Beispiel : Nu=8 Nv=6 6 06 13 20 27 34 41 48 55 - 62 | | | | | | | | | 5 05 - 12 - 19 - 26 - 33 - 40 - 47 - 54 - 61 | | | | | | | | | 4 04 - 11 - 18 - 25 - 32 - 39 - 46 - 53 - 60 ^ | | | | | | | | | Nv | 3 03 - 10 - 17 - 24 - 31 - 38 - 45 - 52 - 59 j | | | | | | | | | 2 02 - 09 - 16 - 23 - 30 - 37 - 44 - 51 - 58 | | | | | | | | | 1 01 - 08 - 15 - 22 - 29 - 36 - 43 - 50 - 57 | | | | | | | | | 0 00 - 07 - 14 - 21 - 28 - 35 - 42 - 49 - 56 0 1 2 3 4 5 6 7 8 i-> Nu ********************************************************************/ // Zähler zurücksetzen zz=0; // Parameterbereich durchlaufen for (i=0;i<=Nu;i++) { for (j=0;j<=Nv;j++) { // Berechnung der Parameter u=uMin+i*du; v=vMin+j*dv; // Berechnung der Koordinaten x= u*f; y= (u*u*u-3*u*v*v)*f; z= v*f; // Punkt speichern M->SetPoint(zz, vector(x,y,z)); // Zähler erhöhen zz=zz+1; } } // Linien setzen // Zähler zurücksetzen zz=0; // Linien längs for (i=0;i<=Nu;i++) { for (j=0;jSetEdge(zz,i*(Nv+1)+j,i*(Nv+1)+j+1); // Zähler erhöhen zz=zz+1; } } // Querlinien setzen for (j=0;j<=Nv;j++) { for (i=0;iSetEdge(zz,i*(Nv+1)+j,(i+1)*(Nv+1)+j); // Zähler erhöhen zz=zz+1; } } // Quadrate setzen // Zähler zurücksetzen zz=0; // Schleife for (j=0;jSetQuadrangle(zz,P1,P2,P3,P4); // Zähler erhöhen zz=zz+1; } } // Update M->UpdateObject(); // Objekt aktivieren doc->ActivateObject(M); // Refresh doc->SendMessage(DOCUMENT_CHANGED); } main() { RegisterMenuHook("Monkey Saddle","Function"); }