Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
3D grafika
Rhinoceros a skripty - druhý střední praktický příklad
24. června 2003, 00.00 | Po dlouhé odmlce vám přinášíme další díl seriálu o skriptování v Rhinoceros. V minulém díle jsme trojúhelníkovou plochu vytvářeli tak, že jsme vytvořili dané 3 body v určených souřadních a na ně jsme aplikovali příkaz SrfPt. V dnešním díle si ukážeme, jak tohoto výsledku dosáhneme jinými způsoby.
Po dlouhé odmlce vám nyní přináším další díl seriálu o skriptování v Rhinoceros. V minulém díle jsme trojúhelníkovou plochu vytvářeli tak, že jsme vytvořili dané 3 body v určených souřadních a na ně jsme aplikovali příkaz SrfPt. V dnešním díle si ukážeme, jak tohoto výsledku dosáhneme jinými způsoby. V závěru přejdeme do prostoru a vytvoříme si tetraedr.
Hlavně musím poznamenat, že ne všechny funkce zde ukazované, vám poběží v nové verzi Rhina 3, protože některé funkce byly odstraněny a nahrazeny jinými.
Kopie a posun bodů
Sub VytvorTrojuhelnik2 'Nadeklaruji promenne Dim Bod1(2) 'Vytvorim bod Bod1(0) = 0:Bod1(1) = 0:Bod1(2) = 0 'Vytvoreni a prirazeni Dim ObjBod1, ObjBod2, ObjBod3 ObjBod1 = Rhino.AddPoint(Bod1) 'Zkopiruji body ObjBod2 = Rhino.CopyObject(ObjBod1) ObjBod3 = Rhino.CopyObject(ObjBod1) 'Posunu body do vrcholu Rhino.SetObjectSelect ObjBod2, vbTrue Rhino.Command("Move " & PtObj2Str(ObjBod1) & " w10,0,0" & " ENTER") Rhino.Command("SelNone") Rhino.SetObjectSelect ObjBod3, vbTrue Rhino.Command("Move " & PtObj2Str(ObjBod1) & " w5,8.66,0" & " ENTER") 'Vytvorim plochu pomoci prikazu Rhina SrfPt Dim Plocha Plocha = Rhino.Command("SrfPt " & PtObj2Str(ObjBod1) & PtObj2Str(ObjBod2) & PtObj2Str(ObjBod3) & " ENTER") Rhino.Command("SelNone") Rhino.ResetPrompt End Sub 'Funkce pro zjisteni souradnic ve World formatu Function PtObj2Str(pointObj) Dim coord coord = Rhino.GetPointCoordinates(pointObj) PtObj2Str = " w" & coord(0) & "," & coord(1) & "," & coord(2) End Function 'Samotne telo kodu VytvorTrojuhelnik2 |
Soubor ke stažení:
Hned na začátku upozorňuji na "Místní nastavení" desetinného oddělovače v systému. Musí být nastavena tečka. Jinak se vám program zacyklí, protože Rhino bude dostávat souřadnice ve špatném formátu.
Co se změnilo oprotí prvnímu kódu? Již na začátku nevytváříme body všechny, ale pouze jenom jeden. Zbylé dva body pomocí funkce Rhino.CopyObject zkopírujeme do nadeklarovaných proměných ObjBod2 a ObjBod3. Hned poté je funkcí Rhino.SetObjectSelect vybereme a posuneme přes příkazovou řádku Rhina. Po každém takovém příkazu musíme provést příkaz SelNone, abychom zrušili výběr. Další změna nastala ve volání příkazu SrfPt. Jelikož už nemáme body nadeklarovány všechny (pouze Bod1), tak jsme museli vytvořit funkci PtObj2Str, jež nám z proměnné typu bod vytáhne souřadnice. K tomu dobře slouží funkce Rhino.GetPointCoordinates. V závěru resetujeme příkazový řádek pomocí funkce Rhino.ResetPrompt.
Kopie a rotace bodů
Sub VytvorTrojuhelnik3 'Nadeklaruji promenne Dim Bod1(2) 'Vytvorim bod Bod1(0) = 0:Bod1(1) = 0:Bod1(2) = 0 'Vytvoreni a prirazeni Dim ObjBod1, ObjBod2, ObjBod3 ObjBod1 = Rhino.AddPoint(Bod1) 'Zkopiruji body Rhino.SetObjectSelect ObjBod1, vbTrue Rhino.Command("Copy " & PtObj2Str(ObjBod1) & " w10,0,0" & " ENTER") ObjBod2 = Rhino.GetLastObjectID Rhino.Command("SelNone") Rhino.SetObjectSelect ObjBod1, vbTrue Rhino.Command("Copy " & PtObj2Str(ObjBod1) & " w10,0,0" & " ENTER") ObjBod3 = Rhino.GetLastObjectID Rhino.Command("SelNone") 'Otocim treti bod o 60 Rhino.SetObjectSelect ObjBod3, vbTrue Rhino.Command("Rotate " & PtObj2Str(ObjBod1) & " 60 ") 'Vytvorim plochu pomoci prikazu Rhina SrfPt Dim Plocha Plocha = Rhino.Command("SrfPt " & PtObj2Str(ObjBod1) & PtObj2Str(ObjBod2) & PtObj2Str(ObjBod3) & " ENTER") Rhino.Command("SelNone") Rhino.ResetPrompt End Sub 'Funkce pro zjisteni souradnic ve World formatu Function PtObj2Str(pointObj) Dim coord coord = Rhino.GetPointCoordinates(pointObj) PtObj2Str = " w" & coord(0) & "," & coord(1) & "," & coord(2) End Function 'Samotne telo kodu VytvorTrojuhelnik3 |
Soubor ke stažení:
V tomto kódu jsme nepoužili pro kopírování bodů funkce, ale příkazu z příkazové řádky. Aby jste poznali, že to jde dělat více způsoby. Nejdříve vybereme již vytvořený bod ObjBod1. Zkopírujeme jej. Ale jak ho teď přiřadit? K tomu nám poslouží funkce Rhino.GetLastObjectID, pomocí níž vytvoříme ObjBod2. Tato funkce vrací ID objektu posledně vytvořeného. Stejným způsobem vytvoříme i ObjBod3. Nyní máme dva body na správných místech. Ten třetí tam dostaneme jeho pootočením. Využijeme příkazu Rhina Rotate. Jeho syntaxe je stejná, jako bychom příkaz použili přímo v příkazové řádce.
Přímá tvorba
Sub VytvorTrojuhelnik4 'Nadeklaruji promenne Dim Bod1(2),Bod2(2),Bod3(2) 'Vytvorim body a priradim je do objektu Bod1(0) = 0:Bod1(1) = 0:Bod1(2) = 0 Bod2(0) = 10:Bod2(1) = 0:Bod2(2) = 0 Bod3(0) = 5:Bod3(1) = 8.66:Bod3(2) = 0 'Vytvorim plochu pomoci prikazu Rhina SrfPt Dim Plocha Plocha = Rhino.Command("SrfPt " & Pt2Str(Bod1) & Pt2Str(Bod2) & Pt2Str(Bod3) & " ENTER") Rhino.ResetPrompt End Sub 'Funkce pro prevod souradnic pro zadavani ve World formatu Function Pt2Str(pointObj) Pt2Str = " w" & pointObj(0) & "," & pointObj(1) & "," & pointObj(2) End Function 'Samotne telo kodu VytvorTrojuhelnik4 |
Soubor ke stažení:
Ale pokud nechceme mít dané body vymodelované, nemusíme tak vůbec činit. Stačí souřadnice předat přímo příkazu SrfPt na příkazové řádce. Bohužel, pak ztratíme vztah k daným vrcholům.
Doposud jsme vytvářeli trojúhelník, jak vidíme na obrázku.
Ale teď si ukážeme již něco v prostoru.
Tetraedr
V tomto příkladu využijeme znalostí z minulých postupů. Jednotlivé body nebudeme vytvářet a rovnou vytvoříme 4 plochy. Ty pak pomocí JOIN spojíme dohromady a uložíme do proměnné. V závěru si pak ukážeme, jak zjišťovat vlastnosti ploch.
Sub VytvorTetraedr 'Nadeklaruji promenne Dim Bod1(2),Bod2(2),Bod3(2),Bod4(2) 'Naplnim souradnice bodu Bod1(0) = 0:Bod1(1) = 0:Bod1(2) = 0 Bod2(0) = 10:Bod2(1) = 0:Bod2(2) = 0 Bod3(0) = 5:Bod3(1) = 8.66:Bod3(2) = 0 Bod4(0) = 5:Bod4(1) = 2.887:Bod4(2) = 8.165 'Vytvorim plochy pomoci prikazu Rhina SrfPt Dim Plocha1,Plocha2,Plocha3,Plocha4 Plocha1 = Rhino.Command("SrfPt " & Pt2Str(Bod1) & Pt2Str(Bod2) & Pt2Str(Bod3) & " ENTER") Plocha1 = Rhino.GetLastObjectID Plocha2 = Rhino.Command("SrfPt " & Pt2Str(Bod1) & Pt2Str(Bod2) & Pt2Str(Bod4) & " ENTER") Plocha2 = Rhino.GetLastObjectID Plocha3 = Rhino.Command("SrfPt " & Pt2Str(Bod2) & Pt2Str(Bod3) & Pt2Str(Bod4) & " ENTER") Plocha3 = Rhino.GetLastObjectID Plocha4 = Rhino.Command("SrfPt " & Pt2Str(Bod1) & Pt2Str(Bod3) & Pt2Str(Bod4) & " ENTER") Plocha4 = Rhino.GetLastObjectID 'Spojim plochy v teleso reprezentovane plochami Dim Teleso Rhino.SetObjectSelect Plocha1, vbTrue Rhino.SetObjectSelect Plocha2, vbTrue Rhino.SetObjectSelect Plocha3, vbTrue Rhino.SetObjectSelect Plocha4, vbTrue Rhino.Command("Join enter") Teleso = Rhino.GetLastObjectID 'Ukazka vystupu vlastnosti Rhino.Command("Volume ") Rhino.Command("Area ") Rhino.Command("SelNone") Rhino.ResetPrompt End Sub 'Funkce pro prevod souradnic pro zadavani ve World formatu Function Pt2Str(pointObj) Pt2Str = " w" & pointObj(0) & "," & pointObj(1) & "," & pointObj(2) End Function 'Samotne telo kodu VytvorTetraedr |
Soubor ke stažení:
Nyní popíši jen důležité úseky kódu. Vytvořené plochy musím před použitím příkazu JOIN vybrat. Pokud jsou správně vytvořeny, příkaz je spojí v jednu plochu (plošné těleso). V závěru jsou na příkazovou řádku Rhina provedeny výstupy, jež vypíší objem a plochu našeho tetraedru. Výsledný obrázek je níže i s výstupem příkazové řádky.
Zde vám ještě nabídnu ikonky pro dané příklady.
Na závěr je dobré poznamenat, že takto vytvořené skripty jsou statické. V dalším díle vytvoříme dynamické. Tím chápejte to, že nebudeme souřadnice bodu ploch zadávat ve skriptu, ale budeme je zjištovat modelováním nebo vstupem uživatele.
Obsah seriálu (více o seriálu):
- Rhinoceros a skripty - úvod
- Rhinoceros a skripty II
- Rhinoceros a skripty III - první lehký praktický příklad
- Rhinoceros a skripty - druhý střední praktický příklad
- Rhinoceros a skripty - třetí praktický příklad
Tématické zařazení:
-
23. dubna 2014
Konica Minolta přenesla výhody velkých zařízení do kompaktních modelů
-
11. května 2014
-
23. května 2014
Epson na konferenci Droidcon Berlin ukázal nové možnosti čekající na vývojáře OS Android
-
24. listopadu 2014
-
13. května 2014
Samsung NX3000: retro styl, špičkový výkon a snadná konektivita v jednom přístroji
-
30. listopadu 2014
Nový fotoaparát α7 II: první plnoformát s pětiosou optickou stabilizací obrazu na světě
-
15. prosince 2014
Konica Minolta pomůže živnostenským úřadům s digitalizací dokumentů
-
11. května 2014
-
26. listopadu 2014
Canon Junior Awards již posedmé ocení mladé fotografy v rámci Czech Press Photo
-
21. srpna 2014