/******************************************************************** Bohemian Dome 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 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("Bohemian Dome"); d->SetData(0,"Konstante a",FIELD_FLOAT,0,100,0.5); d->SetData(1,"Konstante b",FIELD_FLOAT,0,100,1.5); d->SetData(2,"Konstante c",FIELD_FLOAT,0,100,1.0); d->SetData(3,"Skalierungsfaktor",FIELD_FLOAT,1,10000,100); d->SetData(4,"Nu",FIELD_INTEGER,1,1000,25); d->SetData(5,"Nv",FIELD_INTEGER,1,1000,50); 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 f=(d->GetData(3)); // Skalierungsfaktor var Nu=(d->GetData(4)); // Anzahl Unterteilungen u var Nv=(d->GetData(5)); // Anzahl Unterteilungen v // Definitionsbereiche festlegen uMin=0.0; uMax=2*PI; vMin=0.0; vMax=2*PI; // Segmentbreiten berechnen du=(uMax-uMin)/Nu; dv=(vMax-vMin)/Nv; // Parameter des Polygonobjektes berechnen // Anzahl Punkte des Polygonobjektes SP=(Nu+0)*(Nv+0); // Anzahl Kanten des Polygonobjektes SK=2*Nu*Nv; // Anzahl Quadrate des Polygonobjektes SQ=Nu*Nv; // Polygonobjekt erzeugen var M=doc->NewPolygonObject("Bohemian Dome",NULL,NULL,SP,SK,0,SQ); // Punkte des Polygonobjektes berechnen /******************************************************************** ANORDNUNG DER PUNKTE Beispiel : Nu=12 Nv=8 | | | | | | | | 11 88 - 89 - 90 - 91 - 92 - 93 - 94 - 95 - | | | | | | | | 10 80 - 81 - 82 - 83 - 84 - 85 - 86 - 87 - | | | | | | | | 9 72 - 73 - 74 - 75 - 76 - 77 - 78 - 79 - | | | | | | | | 8 64 - 65 - 66 - 67 - 68 - 69 - 70 - 71 - | | | | | | | | 7 56 - 57 - 58 - 59 - 60 - 61 - 62 - 63 - | | | | | | | | 6 48 - 49 - 50 - 51 - 52 - 53 - 54 - 55 - | | | | | | | | 5 40 - 41 - 42 - 43 - 44 - 45 - 46 - 47 - | | | | | | | | 4 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - ^ | | | | | | | | Nu | 3 24 - 25 - 26 - 27 - 28 - 29 - 30 - 31 - i | | | | | | | | 2 16 - 17 - 18 - 19 - 20 - 21 - 22 - 23 - | | | | | | | | 1 08 - 09 - 10 - 11 - 12 - 13 - 14 - 15 - | | | | | | | | 0 00 - 01 - 02 - 03 - 04 - 05 - 06 - 07 - 0 1 2 3 4 5 6 7 j-> Nv ********************************************************************/ // Zähler zurücksetzen zz=0; // Parameterbereich durchlaufen for (i=0;iSetPoint(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;iSetEdge(zz,i*Nv+j,i*Nv+j+1); // Zähler erhöhen zz=zz+1; } // Letzte Linie setzen (Kreis schließen) // Linien speichern M->SetEdge(zz,(i+1)*Nv-1,i*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) // Linie speichern M->SetEdge(zz,(Nu-1)*Nv+j,j); // Zähler erhöhen zz=zz+1; } // Quadrate setzen // Zähler zurücksetzen zz=0; // Schleife for (i=0;iSetQuadrangle(zz,P1,P2,P3,P4); // Zähler erhöhen zz=zz+1; } } // Quernaht schließen for (i=0;iSetQuadrangle(zz,P4,P3,P2,P1); // Zähler erhöhen zz=zz+1; } // Letztes Quadrat der Quernaht // Punkte für das Quadrat definieren P1=Nv*Nu-1; P2=Nv-1; P3=0; P4=Nv*(Nu-1); // Quadrat speichern M->SetQuadrangle(zz,P1,P2,P3,P4); // Zähler erhöhen zz=zz+1; // Längsnaht schließen 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("Bohemian Dome","Function"); }