Rhinoceros a skripty - druhý střední praktický příklad - Grafika.cz - vše o počítačové grafice

Odběr fotomagazínu

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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Odkud pochází fotografka Anne Erhard?

V dnešní soutěži hrajeme o:



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í: Skript rtroj2.rvb 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í: Skript rtroj3.rvb 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í: Skript rtroj4.rvb 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.

Výsledek skriptů

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í: Skript tetraedr.rvb 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.

Výsledek skriptu tetraedr
Výsledek vlastností plochy

Zde vám ještě nabídnu ikonky pro dané příklady.

Ikona pro skript rtroj2.rvb Ikona pro skript rtroj3.rvb Ikona pro skript rtroj4.rvb Ikona pro skript tetraedr.rvb

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):

Tématické zařazení:

 » Rubriky  » 3dscena  

 » Rubriky  » Go verze  

 » Rubriky  » 3D grafika  

 

 

 

Poptávka bazar

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: