/******************************************************************** Boy´s Surface 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 a,b, // Hilfsvariablen für die Berechnung u, // Parameter für die Fläche v, // Parameter für die Fläche du, // Segmentbreite u dv, // Segmentbreite v uMax,uMin, // Definitionsbereich u vMax,vMin, // Definitionsbereich 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("Boy´s Surface"); d->SetData(0,"Skalierungsfaktor",FIELD_FLOAT,1,10000,100); d->SetData(1,"Nu",FIELD_INTEGER,1,1000,50); d->SetData(2,"Nv",FIELD_INTEGER,1,1000,50); if (!d->DoDialog()) return FALSE; var f=(d->GetData(0)); // Skalierungsfaktor var Nu=(d->GetData(1)); // Anzahl Unterteilungen u var Nv=(d->GetData(1)); // Anzahl Unterteilungen v // Definitionsbereiche festlegen uMin=-PI/2; uMax=PI/2; vMin=0.0; vMax=PI; // 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("Boy´s Surface",NULL,NULL,SP,SK,0,SQ); // Punkte des Polygonobjektes berechnen a=sqrt(2); // 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 b=2-a*sin(3*u)*sin(2*v); x=f*(a*cos(v)*cos(v)*cos(2*u)+cos(u)*sin(2*v))/b; y=f*(a*cos(v)*cos(v)*sin(2*u)+cos(u)*sin(2*v))/b; z=f*(3*cos(v)*cos(v))/b; // 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("Boy´s Surface","Function"); }