/******************************************************************** Seashell 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 h, // Hilfsvariable 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 SD, // Anzahl Dreiecke 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("Seashell"); d->SetData(0,"Konstante a",FIELD_FLOAT,0,1000,0.2); d->SetData(1,"Konstante b",FIELD_FLOAT,0,1000,1.0); d->SetData(2,"Konstante c",FIELD_FLOAT,0,1000,0.1); d->SetData(3,"Konstante n",FIELD_FLOAT,0,1000,2.0); d->SetData(4,"Skalierungsfaktor",FIELD_FLOAT,1,10000,200); d->SetData(5,"Nu",FIELD_INTEGER,1,1000,20); d->SetData(6,"Nv",FIELD_INTEGER,1,1000,60); if (!d->DoDialog()) return FALSE; var a=(d->GetData(0)); // Konstante a var b=(d->GetData(1)); // Konstante b var c=(d->GetData(2)); // Konstante c var n=(d->GetData(3)); // Konstante n var f=(d->GetData(4)); // Skalierungsfaktor var Nu=(d->GetData(5)); // Anzahl Unterteilungen u var Nv=(d->GetData(6)); // Anzahl Unterteilungen v // Definitionsbereiche festlegen uMin=0.0; uMax=2.0; vMin=0.0; vMax=2.0; // Segmentbreiten berechnen du=(uMax-uMin)/Nu; dv=(vMax-vMin)/Nv; // Parameter des Polygonobjektes berechnen // Anzahl Punkte des Polygonobjektes SP=Nu*Nv+1; // Anzahl Kanten des Polygonobjektes SK=2*Nu*Nv; // Anzahl Dreiecke des Polygonobjektes SD=Nu; // Anzahl Quadrate des Polygonobjektes SQ=Nu*(Nv-1); // Polygonobjekt erzeugen var M=doc->NewPolygonObject("Seashell",NULL,NULL,SP,SK,SD,SQ); // Punkte des Polygonobjektes berechnen // Den Punkt an der Spitze bei j=Nv nicht berechnen da er sonst // Nu mal berechnet wird : daher in der Schleife nur bis j Nu ********************************************************************/ // Zähler zurücksetzen zz=0; // Parameterbereich durchlaufen for (i=0;iSetPoint(zz,vector(x,y,z)); // Zähler erhöhen zz=zz+1; } } // Letzten Punkt an der Spitze setzen bei v=vMax und u=uMax // Berechnung der Koordinaten x=c*cos(n*2*PI)*f; y=b*f; z=c*sin(n*2*PI)*f; // Punkt speichern M->SetPoint(zz,vector(x,y,z)); // Linien setzen // Zähler zurücksetzen zz=0; // Linien längs for (i=0;iSetEdge(zz,i*Nv+j,i*Nv+j+1); // Zähler erhöhen zz=zz+1; } // Letzte Linie zum Endpunkt // Linie speichern M->SetEdge(zz,(i+1)*Nv-1,Nu*Nv); // Zähler erhöhen zz=zz+1; } // Querlinien setzen for (j=0;jSetEdge(zz,i*Nv+j,(i+1)*Nv+j); // Zähler erhöhen zz=zz+1; } // Letzte Linie setzen (Kreis schließen) // Linien speichern M->SetEdge(zz,(Nu-1)*Nv+j,j); // Zähler erhöhen zz=zz+1; } // Dreiecke setzen // Zähler zurücksetzen zz=0; // Schleife for (i=0;iSetTriangle(zz,P1,P2,P3); // Zähler erhöhen zz=zz+1; } // Letztes Dreieck setzen // Punkte für ein Dreieck definieren P1=Nu*Nv-1; P2=Nu*Nv; P3=Nv-1; // Dreieck speichern M->SetTriangle(zz,P1,P2,P3); // 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; } // Letztes Quadrat setzen // Punkte für ein Quadrat definieren P1=(Nu-1)*Nv+j; P2=(Nu-1)*Nv+j+1; P3=j+1; P4=j; // Quadrat speichern M->SetQuadrangle(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("Seashell","Function"); }