Scenegraph/it: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
No edit summary
 
(70 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
FreeCAD is basically a collage of different powerful libraries, the most important being [http://en.wikipedia.org/wiki/Open_CASCADE openCascade], for managing and constructing geometry, [http://en.wikipedia.org/wiki/Coin3D Coin3d] to display that geometry, and [http://en.wikipedia.org/wiki/Qt_(toolkit) Qt] to put all this in a nice Graphical User Interface.


{{Docnav/it
The geometry that appears in the 3D views of FreeCAD are rendered by the Coin3D library. Coin3D is an implementation of the [http://en.wikipedia.org/wiki/Open_Inventor OpenInventor] standard. The openCascade software also provides the same functionality, but it was decided, at the very beginnings of FreeCAD, not to use the built-in openCascade viewer and rather switch to the more performant coin3D software. A good way to learn about that library is the book [http://www-evasion.imag.fr/Membres/Francois.Faure/doc/inventorMentor/sgi_html/ Open Inventor Mentor].
|[[Scripted_objects/it|Script di oggetti]]
|[[Pivy/it|Pivy]]
}}


{{TOCright}}
[http://en.wikipedia.org/wiki/Open_Inventor OpenInventor] is actually a 3D scene description language. The scene described in openInventor is then rendered in OpenGL on your screen. Coin3D takes care of doing this, so the programmer doesn't need to deal with complex openGL calls, he just has to provide it with valid OpenInventor code. The big advantage is that openInventor is a very well-known and well documented standard.


==Introduzione==
One of the big jobs FreeCAD does for you is basically to translate openCascade geometry information into openInventor language.


Le geometrie che appaiono nelle [[3D_view|viste 3D]] di FreeCAD sono visualizzate (renderizzate) dalla libreria [https://en.wikipedia.org/wiki/Coin3D Coin3d]. Coin3D è un'implementazione delle funzionalità standard di [https://en.wikipedia.org/wiki/Open_Inventor OpenInventor]. Anche il software [https://en.wikipedia.org/wiki/Open_CASCADE openCascade] fornisce queste funzionalità, ma fin dagli inizi dello sviluppo di FreeCAD, è stato deciso di non utilizzare il visualizzatore di OpenCascade e di sostituirlo con il software Coin3D in quanto più performante. Un buon modo per conoscere questa libreria è quello di consultare il manuale [http://www-evasion.imag.fr/Membres/Francois.Faure/doc/inventorMentor/sgi_html/ Open Inventor Mentor].
OpenInventor describes a 3D scene in the form of a [http://en.wikipedia.org/wiki/Scene_graph scenegraph], like the one below:

==Descrizione==

[https://en.wikipedia.org/wiki/Open_Inventor OpenInventor] è in realtà un linguaggio di descrizione della scena 3D. La scena descritta in Open Inventor viene renderizzata (visualizzata) sul vostro schermo con OpenGL. Coin3D si occupa di questo processo, quindi non è necessario che il programmatore tratti complesse chiamate a OpenGL, ma deve solo fornire un codice Open Inventor valido. Il principale vantaggio è che Open Inventor è uno standard molto conosciuto e ben documentato.

Sostanzialmente, uno dei lavori più importanti che FreeCAD esegue per noi consiste nel tradurre le informazioni sulla geometria OpenCascade in linguaggio Open Inventor.

Open Inventor descrive una scena 3D in forma di [https://en.wikipedia.org/wiki/Scene_graph grafo della scena] (Scenegraph), come indicato qui sotto:


[[Image:Scenegraph.gif]]
[[Image:Scenegraph.gif]]
image from [http://www-evasion.imag.fr/~Francois.Faure/doc/inventorMentor/sgi_html/index.html Inventor mentor]
{{Caption|Immagine tratta da [https://web.archive.org/web/20190807185912/http://www-evasion.imag.fr/~Francois.Faure/doc/inventorMentor/sgi_html/ Inventor mentor]}}

Un grafo della scena di Open Inventor è una struttura di tipo "grafico ad albero" e descrive tutto ciò che fa parte di una scena 3D, come ad esempio la geometria, i colori, i materiali, le luci, ecc, e organizza tutti i dati in una struttura gerarchica, pratica e chiara. Tutto può essere raggruppato in sotto-strutture (nodi-figlio), il che consente di organizzare i contenuti della scena più o meno nel modo desiderato. Ecco un esempio di un file di Open Inventor:


{{Code|lang=bash|code=
An openInventor scenegraph describes everything that makes part of a 3D scene, such as geometry, colors, materials, lights, etc, and organizes all that data in a convenient and clear structure. Everything can be grouped into sub-structures, allowing you to organize your scene contents pretty much the way you like. Here is an example of an openInventor file:
#Inventor V2.0 ascii
<syntaxhighlight>
#Inventor V2.0 ascii
Separator {
Separator {
RotationXYZ {
RotationXYZ {
axis Z
axis Z
angle 0
angle 0
}
}
Transform {
Transform {
translation 0 0 0.5
translation 0 0 0.5
}
}
Separator {
Separator {
Material {
Material {
diffuseColor 0.05 0.05 0.05
diffuseColor 0.05 0.05 0.05
}
}
Transform {
Transform {
rotation 1 0 0 1.5708
rotation 1 0 0 1.5708
scaleFactor 0.2 0.5 0.2
scaleFactor 0.2 0.5 0.2
}
}
Cylinder {
Cylinder {
}
}
}
}
}
}
}}


Come si vede, la struttura è molto semplice. Si utilizzano i nodi (separator) per organizzare i dati in blocchi, un po' come si fa per organizzare i file in cartelle e sottocartelle. Ogni dichiarazione riguarda ciò che viene in seguito, per esempio, i primi due elementi del nostro nodo radice (root separator) sono una rotazione e una traslazione e agiscono entrambi sull'elemento successivo, che è un nodo (separator). In tale nodo sono definiti un materiale e una ulteriore trasformazione. Pertanto, il nostro cilindro sarà influenzato da entrambe le trasformazioni, da quella che è stata applicata direttamente ad esso e da quella che è stata applicata al suo nodo (separator) genitore.
</syntaxhighlight>


Per organizzare la una scena, sono disponibili molti altri tipi di elementi, come gruppi, commutatori o annotazioni. Per gli oggetti si possono definire dei materiali molto complessi, con colori, texture, modalità di ombreggiatura e trasparenza. Si possono anche definire luci, punti di vista (camera) e perfino il movimento. È anche possibile incorporare parti di script nei file di Open Inventor, per definire comportamenti più complessi.
As you can see, the structure is very simple. You use separators to organize your data into blocks, a bit like you would organize your files into folders. Each statement affects what comes next, for example the first two items of our root separator are a rotation and a translation, both will affect the next item, which is a separator. In that separator, a material is defined, and another transformation. Our cylinder will therefore be affected by both transformations, the one who was applied directly to it and the one that was applied to its parent separator.


Se siete interessati a saperne di più su Open Inventor, consultate direttamente il suo manuale più famoso, il libro: [http://www-evasion.imag.fr/~Francois.Faure/doc/inventorMentor/sgi_html/index.html Inventor mentor].
We also have many other types of elements to organize our scene, such as groups, switches or annotations. We can define very complex materials for our objects, with color, textures, shading modes and transparency. We can also define lights, cameras, and even movement. It is even possible to embed pieces of scripting in openInventor files, to define more complex behaviours.


Normalmente, in FreeCAD, non è necessario interagire direttamente con il grafo della scena di Open Inventor. Ogni oggetto in un documento di FreeCAD, sia che si tratti di un Mesh, di una forma Parte o di qualsiasi altra cosa, viene automaticamente convertito in codice Open Inventor e inserito nel grafo della scena principale che appare in una [[3D_view|vista 3D]]. Questo grafo della scena viene costantemente aggiornato quando si apportano delle modifiche, oppure si aggiungono o si rimuovono degli oggetti nel documento. In realtà, ogni oggetto (nell'ambito App) ha un fornitore di vista (un corrispondente oggetto nell'ambito Gui), responsabile del rilascio del codice Open Inventor.
If you are interested in learning more about openInventor, head directly to its most famous reference, the [http://www-evasion.imag.fr/~Francois.Faure/doc/inventorMentor/sgi_html/index.html Inventor mentor].


Poter accedere al direttamente al grafo della scena presenta comunque molti vantaggi. Ad esempio, si può modificare temporaneamente la visualizzazione di un oggetto, oppure si possono aggiungere alla scena oggetti che nel documento di FreeCAD non hanno esistenza reale, come la geometria di costruzione, i riferimenti, i suggerimenti grafici oppure strumenti quali i manipolatori oppure informazioni sullo schermo.
In FreeCAD, normally, we don't need to interact directly with the openInventor scenegraph. Every object in a FreeCAD document, being a mesh, a part shape or anything else, gets automatically converted to openInventor code and inserted in the main scenegraph that you see in a 3D view. That scenegraph gets updated continuously when you do modifications, add or remove objects to the document. In fact, every object (in App space) has a view provider (a corresponding object in Gui space), responsible for issuing openInventor code.


FreeCAD dispone di diversi strumenti per visualizzare o modificare il codice Open Inventor. Ad esempio, il seguente codice Python mostra la rappresentazione Open Inventor di un oggetto selezionato:
But there are many advantages to be able to access the scenegraph directly. For example, we can temporarily change the appearence of an object, or we can add objects to the scene that have no real existence in the FreeCAD document, such as construction geometry, helpers, graphical hints or tools such as manipulators or on-screen information.


{{Code|code=
FreeCAD itself features several tools to see or modify openInventor code. For example, the following python code will show the openInventor representation of a selected object:
obj = FreeCAD.ActiveDocument.ActiveObject
<syntaxhighlight>
viewprovider = obj.ViewObject
obj = FreeCAD.ActiveDocument.ActiveObject
viewprovider = obj.ViewObject
print viewprovider.toString()
print viewprovider.toString()


}}
</syntaxhighlight>
But we also have a python module that allows complete access to anything managed by Coin3D, such as our FreeCAD scenegraph. So, read on to [[Pivy]].


Inoltre, c'è anche un modulo Python che consente l'accesso completo a tutto quello che è gestito da Coin3D, come il grafo della scena di FreeCAD. Continuate quindi la lettura in [[Pivy/it|Pivy]].
{{docnav|Mesh to Part|Pivy}}


== Esempi di codifica ==
[[Category:Poweruser Documentation]]

{{clear}}
Si veda [[Coin3d_snippets|Coin3d snippets]] per gentile concessione della ricerca di MariwanJ per [[Design456_Workbench|Design456 Workbench]]. Il repository di codice può essere trovato su https://github.com/MariwanJ/COIN3D_Snippet.
<languages/>
{{Top}}

{{Docnav/it
|[[Scripted_objects/it|Script di oggetti]]
|[[Pivy/it|Pivy]]
}}

{{Powerdocnavi{{#translation:}}}}
[[Category:Developer Documentation{{#translation:}}]]

Latest revision as of 07:22, 10 December 2022

Introduzione

Le geometrie che appaiono nelle viste 3D di FreeCAD sono visualizzate (renderizzate) dalla libreria Coin3d. Coin3D è un'implementazione delle funzionalità standard di OpenInventor. Anche il software openCascade fornisce queste funzionalità, ma fin dagli inizi dello sviluppo di FreeCAD, è stato deciso di non utilizzare il visualizzatore di OpenCascade e di sostituirlo con il software Coin3D in quanto più performante. Un buon modo per conoscere questa libreria è quello di consultare il manuale Open Inventor Mentor.

Descrizione

OpenInventor è in realtà un linguaggio di descrizione della scena 3D. La scena descritta in Open Inventor viene renderizzata (visualizzata) sul vostro schermo con OpenGL. Coin3D si occupa di questo processo, quindi non è necessario che il programmatore tratti complesse chiamate a OpenGL, ma deve solo fornire un codice Open Inventor valido. Il principale vantaggio è che Open Inventor è uno standard molto conosciuto e ben documentato.

Sostanzialmente, uno dei lavori più importanti che FreeCAD esegue per noi consiste nel tradurre le informazioni sulla geometria OpenCascade in linguaggio Open Inventor.

Open Inventor descrive una scena 3D in forma di grafo della scena (Scenegraph), come indicato qui sotto:

Immagine tratta da Inventor mentor

Un grafo della scena di Open Inventor è una struttura di tipo "grafico ad albero" e descrive tutto ciò che fa parte di una scena 3D, come ad esempio la geometria, i colori, i materiali, le luci, ecc, e organizza tutti i dati in una struttura gerarchica, pratica e chiara. Tutto può essere raggruppato in sotto-strutture (nodi-figlio), il che consente di organizzare i contenuti della scena più o meno nel modo desiderato. Ecco un esempio di un file di Open Inventor:

#Inventor V2.0 ascii
 
Separator { 
    RotationXYZ {	
       axis Z
       angle 0
    }
    Transform {
       translation 0 0 0.5
    }
    Separator {	
       Material {
          diffuseColor 0.05 0.05 0.05
       }
       Transform {
          rotation 1 0 0 1.5708
          scaleFactor 0.2 0.5 0.2
       }
       Cylinder {
       }
    }
}

Come si vede, la struttura è molto semplice. Si utilizzano i nodi (separator) per organizzare i dati in blocchi, un po' come si fa per organizzare i file in cartelle e sottocartelle. Ogni dichiarazione riguarda ciò che viene in seguito, per esempio, i primi due elementi del nostro nodo radice (root separator) sono una rotazione e una traslazione e agiscono entrambi sull'elemento successivo, che è un nodo (separator). In tale nodo sono definiti un materiale e una ulteriore trasformazione. Pertanto, il nostro cilindro sarà influenzato da entrambe le trasformazioni, da quella che è stata applicata direttamente ad esso e da quella che è stata applicata al suo nodo (separator) genitore.

Per organizzare la una scena, sono disponibili molti altri tipi di elementi, come gruppi, commutatori o annotazioni. Per gli oggetti si possono definire dei materiali molto complessi, con colori, texture, modalità di ombreggiatura e trasparenza. Si possono anche definire luci, punti di vista (camera) e perfino il movimento. È anche possibile incorporare parti di script nei file di Open Inventor, per definire comportamenti più complessi.

Se siete interessati a saperne di più su Open Inventor, consultate direttamente il suo manuale più famoso, il libro: Inventor mentor.

Normalmente, in FreeCAD, non è necessario interagire direttamente con il grafo della scena di Open Inventor. Ogni oggetto in un documento di FreeCAD, sia che si tratti di un Mesh, di una forma Parte o di qualsiasi altra cosa, viene automaticamente convertito in codice Open Inventor e inserito nel grafo della scena principale che appare in una vista 3D. Questo grafo della scena viene costantemente aggiornato quando si apportano delle modifiche, oppure si aggiungono o si rimuovono degli oggetti nel documento. In realtà, ogni oggetto (nell'ambito App) ha un fornitore di vista (un corrispondente oggetto nell'ambito Gui), responsabile del rilascio del codice Open Inventor.

Poter accedere al direttamente al grafo della scena presenta comunque molti vantaggi. Ad esempio, si può modificare temporaneamente la visualizzazione di un oggetto, oppure si possono aggiungere alla scena oggetti che nel documento di FreeCAD non hanno esistenza reale, come la geometria di costruzione, i riferimenti, i suggerimenti grafici oppure strumenti quali i manipolatori oppure informazioni sullo schermo.

FreeCAD dispone di diversi strumenti per visualizzare o modificare il codice Open Inventor. Ad esempio, il seguente codice Python mostra la rappresentazione Open Inventor di un oggetto selezionato:

obj = FreeCAD.ActiveDocument.ActiveObject
viewprovider = obj.ViewObject
print viewprovider.toString()

Inoltre, c'è anche un modulo Python che consente l'accesso completo a tutto quello che è gestito da Coin3D, come il grafo della scena di FreeCAD. Continuate quindi la lettura in Pivy.

Esempi di codifica

Si veda Coin3d snippets per gentile concessione della ricerca di MariwanJ per Design456 Workbench. Il repository di codice può essere trovato su https://github.com/MariwanJ/COIN3D_Snippet.

Inizio