Final project- Parametrický model terénu



Author:

Categories: Tutorials


CAD- Scripting

Vytvořit skript, který zjednoduší vytváření modelů terénu metodou vzájemně protínajících se ploch.

Popis formy výsledku:

Jedná se o jednoduchý tvar skládající se pouze z ploch. V našem případě slouží ke zjednodušení složité geometrie/morfologie terénu při výrobě modelu. Zde má tato forma výhodu, že lze jednoduše vyrobit z deskového materiálu.  A na rozdíl od jednoduché trojúhelníkové, či čtyřúhelníkové topologie (např. Delaunay) má výrazně nižší počet dílů ke slepení. Dobře reprezentuje zvláště přírodní terény, které obsahují plochy- svahy hor, vodní plochy, louky.

Forma se dnes používá například v konstrukci horolezeckých stěn, kde je rovněž žádoucí vytvořit, co nejpřírodnější/nejčlenitější tvar při použití minimálního počtu ploch.

faf51039c5e83c0cdd6fb81b6412d532

Příklad použití:

obrázekIMG_20191016_172722_637IMG_20191016_204943

 

Tento příklad byl vytvořen manuálně- tedy postupným přikládáním ploch k existující geometrii terénu (naklikané podle vrstevnic) tak aby co nejvíce reprezentovaly přírodní svahy. Poté byly vybrány jednotlivé plochy k vzájemnému protnutí a byla z nich použita pouze část odpovídající terénu. Výsledek je relativně přesný, co se týče podobnosti s původním povrchem a lze jednoduše vyrobit. Postup pro vytvoření geometrie je ale pracný.

Podobný postup se pokusím použít v Grasshopperu. Pužijeme vzorkový příklad kopečku, která se pokusíme zjednodušit do komolé piramidy. Výsledek očekáváme, že bude vypadat přibližně takto:

Výsledek po úpravách v blenderu

Přepis skriptu do češtiny:

1. Z poskytnutých bodů (Vstup A- Vrstevnice) vytvoř plochu a zaobli jí.

Výstřižek11

2. K dalším bodů (Vstup B- Počátky rovin k protnutí) najdi na ploše body které jsou přímo nad původními a vytvoř zde tečné roviny.

 

Výstřižek22

 

3. Protni vždy dvě roviny, jejichž počátky spolu sousedí. (K určení dvojic sousedních bodů používáme Delaunay connectivity)

-Vznikla hromada přímek

Výstřižek33

 

4. V každé z původních rovin jednotlivě, protni každou přímku s každou jinou. (Humpolácký způsob zadání do Grasshopperu- určitě existuje i způsob, pro který není potřeba vytvářet nové komponenty pokaždé, když Delaunay vytvoří bod s více spojeními.) (Komponenty jsou oranžové, protože po nich chceme aby protínaly totožné přímky. Pro tyto průsečíky vyhodí hodnotu NULL, odstraníme je pomocí Clean Tree.)

Výstřižek4 4

5. Z každé množiny bodů, které leží v jedné z původních tečných rovin vytvoř placatou Mesh. (pokud jsme na začátku naklikali do Vstupu B 11 bodů, dostaneme jedenáct Meshí) Potom všechny Meshe vzájemně sjednoť do jedné.

-Vznikne motanice Meshí, které jsou však rozděleny na střípky (faces) a obsahují požadovaný povrch. Máme ale střípků moc. Potřebujeme odstranit některé střípky, aby zbyl souvislý povrch.

 

Výstřižek55

 

6. Odstraň ty střípky, které mají volnou hranu. Tedy nenavazují na ně ze všech stran jiné střípky.

(najdeme všechny body které definují nějakou volnou (naked). A odstraníme ty z nich, které nejsou zároveň součástí některé hrany kde se potkávjí 3 střípky a víc (non-manifold).)

-Vznikla téměř požadovaná komolá piramidka. Některé střípky z ní pořád čouhají- Jak je to možné? -Byly to střípky s vnitřními hranami (interior), které až teď začaly čouhat na povrch. Tak krok opakujeme abychom odstranili i ty nově vyčuhující.

-Dalším problémem, je že nedokážeme odstranit trojúhelníkové střípky, které jsou ze dvou stran ohraničeny non-manifold edgemi. Viz zakroužkovaná situace.

Výstřižek6 Inked6_LI

 

6 znovu. Krok opakujeme, s tím, že používáme původně Non-manifoldní edge. Odstranili jsme sice nově vyčuhující, ale ukázalo se, že ne všechny střípky které jsme považovali za úplně ohraničené Non-manifoldními edgemi takové skutečně byly. Začaly vznikat díry.

VýstřižekzZ6Z

 

4b. Alternativně ve čtvrtém kroku použijeme přímo komponent, který ořezává roviny okolními rovinami, které určíme zase podle Delaunay connectivity.

Dostáváme něco, z čeho nic nečouhá. Ale tento komponent má tu nevýhodu, že vždy odstraní všechny střípky a nechá nejmenší možný ořez. Výsledek je zase děravý a některé body chybí.

Výstřižek4B4B

 

Závěr:

Jednou nám něco chybí a jindy toho máme moc.

 

Pro realné použití se hodí spíše situace, kdy máme příliš geometrie. Z Grasshopperu můžeme exportovat pomocí Solution/bake selected, exportovat například ve formátu .ply a například v Blenderu manuálně odstranit Přebytečné faces. Je to výrazně rychlejší, než vytvářet v průniky rovin v Blenderu manuálně.

manually deleted

Toto je výsledek z Blenderu, kde proběhlo pouze odstraňování přebytečných střípků.

Fajn by bylo, kdybychom ani tohle nemuseli dělat. Nějaký nápad?

Lomenicovy teren- pracovni verze

Lomenicovy-teren-pracovni-verze 17.1.

Update 22.5. 2020

Funguje to!

1

2

3

4

5

 

 

Problém kterým jsem se zabýval je popsaný na:

https://discourse.mcneel.com/t/intersecting-planes-surface/96227

Řešením se ukázalo být vyvoření cyklu pro odstaňování Faces.

Faces odstraňujeme na základě valence Hran. Pokud je hrana Naked-Volná odstraníme Face ke kterému přiléhá. Abychom si postupně neodstranili celý model, nesmíme brát všechny naked edges, ale vyhnout se odstraňování obvodové hrany modelu. Takhle vypadá jednen cyklus odstraňování:

Výstřižek

Kromě obvodové polyliny jsme ještě cestou museli odstranit z množiny Naked hran ještě na Duplicitní hrany a interiérové hrany. Mesh by v sobě jinak měla díry, které by se s každým vyklem rozrůstaly. Na odčítání dvou množin hran od sebe navzájem jsme zvolili geometrický způsob: Na množině Naked hran najdeme midpointy každé z hran. Potom si zjistíme vzdálenosti všech midpointů ke všem hranám z množiny Obvodové polyliny. Vyfiltrujeme extrémňě malé vzdálenosti a množiny Naked hran odstraníme ty hrany na ktrých byl midpoint s touto malou vzdáleností. První množinu máme jako data tree abychom mohli odstranit na konci faces. Data tree má totiž takovou rtrukturu, že každá větev znamená jeden Face.

Zatím je skript ve formě špagetového kódu, s tím, že se cykly opakují kopírováním.

Další postup práce je:

1) Otestovat na jiných příkladech

2) Zjednodušení skriptu, vyčištění, zorganizování

3) Vytvoření Cyklu v C+, nebo phytonu? Který se sám rozhoodne kolikrát se spustí

4) Vytvořit Unwrap skript který současně přidá tloušťku materiálu a připraví výkres jednotlivých dílů k vyřezání na CNC/Laseru + informací o sklonu hran ke sbroušení

Aktuální verze skriptu:

Intersecting_planes_surface_22.5_prototype

Update 28.6.

It seems like I have came upon some solution.
I will try to describe how the script works in basic outline.

Input:
User is to insert contour lines (as points) of the actual terrain. From which a smoothed dealaunay mesh is created.

Than user places bunch of points somewhere below the model. They are to be projected onto the mesh to become origins of the planes, to form the desired model. Each plane rotation is tangent of the smooth mesh at each point.

Place two groups of origins:
One near the otline of the surface.

And second group in the interior of surface.

Last input is scale of the model. A bounding box is created to limit the resulting model.

Process:
So we have planes with their origins at the mesh.

To say which two planes to intersect together we make dealaunay connectivity between the origins of the planes. If the origins have connection together, the corresponding planes will intersect.

 

Nex the the intersection of all planes and the bounding box is solved.

Boundary surfaces inside theese intersections (with boundary box) are created. Than they are split with the intersection lines (of the planes with one one another). That’s our Mesh. We have to delete certain parts from it to get the surface.

Lets leave the mesh and create some Rim polyline that will indicate the border of the surface. First sort Plane origins (only the group around outline of surface) clockwise.

Than solve intersection of the first Plane (numbering from sorted origins) and the second. Second and third…Last and the first. Resulting lines will pierce the bounding box at certain points.

Connect theese points into one continuous ployline. That’s the Rim plyline.

We can create border of the model straightaway by extruding the Rim polyline and trimming it from down.

Here comes the tricky part. Deleting the faces from the Mesh we created earlier.
We will delete all faces that have a naked edge in them.
But don’t delete the faces that have thave the Rim plyline, as one of their edges! This way we will reduce number of faces. Assuming that our desired surface is continuous, this does not delete anything, we want to keep.
Theese are the naked edges. We want to delate them (adjoined faces).

This is the Rim polyline. We don’t want to delete it.

And here is the Mesh after wee deleted Naked edges. But Rim plyline is still intact.

When we repeat this step we get rid of all unnecessary floppy faces. Keep repeating until there is just one continuous surface left. We use Anemone for making the cycle.

At his point the mesh is complete, when we join it with borders and clean it to be just as many faces as the input planes (origins).

Last thing is nesting the parts onto some sheets. I created an algorythm to assign angles to edges. Angles are half angles of the planes, to indicate cutting angle of the edge of individual parts. Dashed lines are the edges on the other face of the piece of material. I used a cript, i found here: https://www.grasshopper3d.com/forum/topics/text-curves

Positive angle value means cutting into the volume of the piece. Negative out.
IMG_20200628_170035low

It doesn’t work in all situations of imput. In fact it has so many bugs, that it would need a week of debugging or so, to be acctually useful.
However I hope this helps to understand one possible way of solving this task.
Cheers

 

Intersecting_planes_surface_28.6