<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>XNA</title>
        <link>http://blogs.ugidotnet.org/leonardo/category/XNA.aspx</link>
        <description>XNA's Not Acronymed</description>
        <language>it</language>
        <copyright>Leonardo</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>WPF e il 3D (quinta parte)</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2009/04/07/wpf-e-il-3d-quinta-parte.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/articles/wpf_3d.aspx"&gt;Indice degli articoli su WPF e il 3D&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dopo aver acquisito manualità con triangoli e quadrati nello spazio 3D è giunto il momento di creare una geometria che renda finalmente “giustizia” al 3D, costruiremo un cubo e aggiungeremo al nostro programma la possibilità di navigare all’interno dello spazio tridimensionale ingrandendo/rimpicciolendo e ruotando la scena col mouse.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Costruiamo un Cubo&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Come visto nel precedente articolo per costruire un quadrato occorrono 2 triangoli, in un cubo sono presenti 6 quadrati (uno per ogni faccia) ma non serviranno 6x4=24 punti distinti ma solamente 8 punti visto che molti punti saranno condivisi da più facce.&lt;/p&gt;  &lt;p&gt;Di seguito uno schema dei punti essenziali necessari per costruire il nostro cubo:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Cubo" border="0" alt="Cubo" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquintaparte_11E26/Cubo_9cd78298-b33b-4a54-b16b-69376a8dd22c.png" width="260" height="254" /&gt; &lt;/p&gt;  &lt;p&gt;Ogni faccia necessiterà di due triangoli come evidenziato nella seguente immagine:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CuboColori" border="0" alt="CuboColori" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquintaparte_11E26/CuboColori_22368a77-e4e1-4f5d-9ad1-dfc05ffbb6ac.png" width="260" height="254" /&gt; &lt;/p&gt;  &lt;p&gt;Come per il singolo quadrato basterà inserire tutti i punti univoci nella collezione Positions e inserire gli indici per creare i triangoli desiderati uno dopo l’altro. WPF ogni 3 indici creerà un triangolo (in XNA questa modalità di disegno in cui ogni gruppo di tre vertici definisce un triangolo è detta &lt;strong&gt;TriangleList&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;Volendo centrare la base del cubo nell’origine i punti univoci sono:&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="text-align: center" colspan="2"&gt;Positions&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="width: 20px"&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;(0.5, 0, 0.5)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="width: 20px"&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;(0.5, 1, 0.5)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="width: 20px"&gt;&lt;em&gt;2&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;(-0.5, 1, 0.5)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="width: 20px"&gt;&lt;em&gt;3&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;(-0.5, 0, 0.5)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="width: 20px"&gt;&lt;em&gt;4&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;(0.5, 0, -0.5)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="width: 20px"&gt;&lt;em&gt;5&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;(0.5, 1, -0.5)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="width: 20px"&gt;&lt;em&gt;6&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;(-0.5, 1, -0.5)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="width: 20px"&gt;&lt;em&gt;7&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;( -0.5, 0, -0.5)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Gli indici dei triangoli invece sono rappresentati dalla seguente tabella:&lt;/p&gt;  &lt;table style="width: 415px"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="text-align: center" colspan="6"&gt;TriangleIndices&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;em&gt;Index&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;em&gt;Index&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;em&gt;Index&lt;/em&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ff0000"&gt;&lt;em&gt;0&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff0000"&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #0066ff"&gt;&lt;em&gt;12&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #0066ff"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ff9999"&gt;&lt;em&gt;24&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff9999"&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ff0000"&gt;&lt;em&gt;1&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff0000"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #0066ff"&gt;&lt;em&gt;13&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #0066ff"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ff9999"&gt;&lt;em&gt;25&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff9999"&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ff0000"&gt;&lt;em&gt;2&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff0000"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #0066ff"&gt;&lt;em&gt;14&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #0066ff"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ff9999"&gt;&lt;em&gt;26&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff9999"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ffff00"&gt;&lt;em&gt;3&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff00"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #000080; color: #ffffff"&gt;&lt;em&gt;15&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #000080; color: #ffffff"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #99ccff"&gt;&lt;em&gt;27&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #99ccff"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ffff00"&gt;&lt;em&gt;4&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff00"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #000080; color: #ffffff"&gt;&lt;em&gt;16&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #000080; color: #ffffff"&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #99ccff"&gt;&lt;em&gt;28&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #99ccff"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ffff00"&gt;&lt;em&gt;5&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff00"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #000080; color: #ffffff"&gt;&lt;em&gt;17&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #000080; color: #ffffff"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #99ccff"&gt;&lt;em&gt;29&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #99ccff"&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #008080"&gt;&lt;em&gt;6&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #008080"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #99ff99"&gt;&lt;em&gt;18&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #99ff99"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ccccff"&gt;&lt;em&gt;30&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ccccff"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #008080"&gt;&lt;em&gt;7&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #008080"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #99ff99"&gt;&lt;em&gt;19&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #99ff99"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ccccff"&gt;&lt;em&gt;31&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ccccff"&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #008080"&gt;&lt;em&gt;8&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #008080"&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #99ff99"&gt;&lt;em&gt;20&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #99ff99"&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ccccff"&gt;&lt;em&gt;32&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ccccff"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ff00ff"&gt;&lt;em&gt;9&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff00ff"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff99"&gt;&lt;em&gt;21&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff99"&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #66ffcc"&gt;&lt;em&gt;33&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #66ffcc"&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ff00ff"&gt;&lt;em&gt;10&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff00ff"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff99"&gt;&lt;em&gt;22&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff99"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #66ffcc"&gt;&lt;em&gt;34&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #66ffcc"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td style="background-color: #ff00ff"&gt;&lt;em&gt;11&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ff00ff"&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff99"&gt;&lt;em&gt;23&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #ffff99"&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;        &lt;td style="background-color: #66ffcc"&gt;&lt;em&gt;35&lt;/em&gt;&lt;/td&gt;        &lt;td style="background-color: #66ffcc"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td colspan="6"&gt;&lt;em&gt;Ogni triangolo nella tabella ha un colore diverso e la tabella è suddivisa in 3 colonne per visualizzare i 12 triangoli necessari per rappresentare i 6 quadrati costituenti le facce del cubo&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Il codice XAML per creare il modello 3D (di materiale rosso) sarà dunque:&lt;/p&gt;  &lt;p&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquintaparte_CE58/xaml_cube_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="xaml_cube" border="0" alt="xaml_cube" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquintaparte_CE58/xaml_cube_thumb.png" width="409" height="270" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Aggiungendo il codice al programma visto &lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2009/03/02/wpf-e-il-3d-terza-parte.aspx"&gt;negli articoli precedenti&lt;/a&gt; avremmo il nostro Cubo 3D &lt;a href="http://it.wikipedia.org/wiki/Rendering"&gt;renderizzato&lt;/a&gt; nella nostra applicazione.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Aggiungiamo il supporto alla navigazione delle nostre scene 3D&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Per rendere maggiormente accattivante la sensazione di profondità della scena è necessario aggiungere il supporto alla “personalizzazione” della telecamera da parte dell’utente per poter visualizzare come meglio crede gli oggetti 3D. Per aggiungere questa funzionalità in modo rapido ed efficace utilizzeremo la libreria open-source (creata da Microsoft) &lt;strong&gt;3D Tools for the Windows Presentation Foundation&lt;/strong&gt; che fornisce utili classi per estendere il supporto 3D di WPF.&lt;/p&gt;  &lt;p&gt;Dopo aver scaricato la libreria in formato binario dal sito CodePlex all’indirizzo &lt;a title="http://www.codeplex.com/3DTools" href="http://www.codeplex.com/3DTools"&gt;http://www.codeplex.com/3DTools&lt;/a&gt; procediamo ad aggiungere un riferimento nel file nostro progetto tramite il menù Project/Add reference/Browse e indicando il file 3DTools.dll scaricato.&lt;/p&gt;  &lt;p&gt;Per poter usare nella nostra applicazione la libreria dovremmo aggiungere un &lt;a href="http://msdn.microsoft.com/it-it/library/ms747086.aspx"&gt;namespace&lt;/a&gt; come evidenziato dalla prima riga cerchiata in rosso nel codice (sotto).     &lt;br /&gt;Per aggiungere la funzionalità di navigazione 3D basterà ora decorare il controllo ViewPort3D col TrackballDecorator fornito dai 3D Tools.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="xaml_3dtools" border="0" alt="xaml_3dtools" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquintaparte_11E26/xaml_3dtools.png" width="558" height="221" /&gt;&lt;/p&gt;  &lt;p&gt;Il risultato è immediato e avviando l’applicazione sarà possibile ruotare il cubo tenendo premuto il tasto sinistro del mouse e ingrandire/rimpicciolire trascinando avanti e indietro il mouse tenendo il tasto destro premuto.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3DCube" border="0" alt="3DCube" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquintaparte_11E26/3DCube.png" width="300" height="200" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-7996fa031700f3fe.skydrive.live.com/self.aspx/Pubblica/WPFCube3D.zip"&gt;Scarica il codice sorgente dell’articolo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Nel prossimo articolo vedremo come “dipingere” sul cubo ed entreremo nelle problematiche relative all’applicazione di più materiali ad un singolo GeometryModel3D. Queste conoscenze ci torneranno utili per colorare di diversi colori ogni faccia e costruire una riproduzione fedele del Cubo di Rubiks.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/95899.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2009/04/07/wpf-e-il-3d-quinta-parte.aspx</guid>
            <pubDate>Tue, 07 Apr 2009 23:06:32 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2009/04/07/wpf-e-il-3d-quinta-parte.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/95899.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/95899.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF e il 3D (quarta parte)</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2009/04/05/wpf-e-il-3d-quarta-parte.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/articles/wpf_3d.aspx"&gt;Indice degli articoli su WPF e il 3D&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2009/03/02/wpf-e-il-3d-terza-parte.aspx"&gt;Dopo aver visto&lt;/a&gt; alcuni concetti fondamentali passiamo alla costruzione di geometrie più complicate per realizzare applicazioni più interessanti.  &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Il nostro scopo finale è costruire un &lt;/em&gt;&lt;a href="http://it.wikipedia.org/wiki/Cubo_di_Rubik"&gt;&lt;em&gt;Cubo di Rubiks&lt;/em&gt;&lt;/a&gt;&lt;em&gt; che può essere visto come un insieme di 27 cubi ma abbiamo scoperto negli articoli precedenti che l’elemento base del 3D è il triangolo. Vedremo in questo articolo come costruire attraverso dei triangoli dei quadrati che ci serviranno per realizzare dei cubi con cui realizzeremo il nostro progetto.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Costruiamo un Quadrato&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Per poter creare un quadrato occorrono due triangoli (&lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2008/12/28/wpf-e-il-3d-prima-parte.aspx"&gt;come abbiamo visto&lt;/a&gt; l’elemento fondamentale della grafica 3D è il triangolo), per ogni triangolo servono 3 punti quindi in tutto dovrebbero servire 6 punti ma effettivamente i punti distinti sono solo 4  come mostrato nella seguente schematizzazione:&lt;/p&gt;
&lt;p&gt; &lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="quad" border="0" alt="quad" width="115" height="113" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquartaparte_D601/quad_a403d232-76ce-44a2-8e78-dee40d962006.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Come possiamo allora non ripetere i punti (0,0,0) e (1,1,0) per ogni triangolo e definirli invece una sola volta risparmiando memoria?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Per fare questo basta definire tutti i punti “essenziali” in una lista (chiamata in XNA “&lt;strong&gt;Vertex Buffer&lt;/strong&gt;” mentre in WPF è rappresentata dalla proprietà &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.meshgeometry3d.positions.aspx"&gt;Positions&lt;/a&gt;) e definire i vari triangoli facendo riferimento alla posizione nella lista tramite una lista di indici (chiamata in XNA “&lt;strong&gt;Index Buffer&lt;/strong&gt;” mentre in WPF è rappresentata dalla proprietà &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.meshgeometry3d.triangleindices.aspx"&gt;TriangleIndices&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;Nella proprietà Positions, che è di fatto una collezione di punti Point3D, basterà inserire i punti univoci per tutta la geometria&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="14"&gt; &lt;/td&gt;
            &lt;td style="WIDTH: 105px" valign="top"&gt;
            &lt;p align="center"&gt;Positions  &lt;br /&gt;
            (Vertex Buffer)&lt;/p&gt;
            &lt;/td&gt;
            &lt;td valign="top" rowspan="5"&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;p&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="index" border="0" alt="index" width="115" height="113" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquartaparte_D601/index_d1d04cda-e4a4-4ef1-bacc-4f82933e993e.png" /&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="14"&gt;0&lt;/td&gt;
            &lt;td style="WIDTH: 105px" valign="top"&gt;(0,0,0)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="14"&gt;1&lt;/td&gt;
            &lt;td style="WIDTH: 105px" valign="top"&gt;(1,0,0)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="14"&gt;2&lt;/td&gt;
            &lt;td style="WIDTH: 105px" valign="top"&gt;(1,1,0)&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="14"&gt;3&lt;/td&gt;
            &lt;td style="WIDTH: 105px" valign="top"&gt;(0,1,0)&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;mentre nella proprietà TriangleIndices, che è di fatto una collezione di indici interi, bisognerà definire i triangoli veri e propri facendo riferimento alla posizione dei punti nella proprietà Positions&lt;/p&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[





.postbody table { behavior: url(#default#.POSTBODY_TABLE_WRITER_BEHAVIOR) }
.postbody td { behavior: url(#default#.POSTBODY_TD_WRITER_BEHAVIOR) }
h1, h2, h3, h4, h5, h6, p, ol, ul, pre, blockquote
{
	margin-top: 10px;
	margin-bottom: 10px;
}


.style1 {
	color: #ffffff;
	background-color: #0000ff;
}
.style2 {
	color: #ffffff;
	background-color: #ff0000;
}]]&gt;&lt;/style&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="127"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" colspan="2"&gt;
            &lt;p align="center"&gt;TriangleIndices &lt;br /&gt;
            (Index Buffer)&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class="style1" valign="top" width="13"&gt;0&lt;/td&gt;
            &lt;td style="WIDTH: 99px" class="style1" valign="top"&gt;0&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class="style1" valign="top" width="13"&gt;1&lt;/td&gt;
            &lt;td style="WIDTH: 99px" class="style1" valign="top"&gt;1&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class="style1" valign="top" width="13"&gt;2&lt;/td&gt;
            &lt;td style="WIDTH: 99px" class="style1" valign="top"&gt;2&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class="style2" valign="top" width="13"&gt;3&lt;/td&gt;
            &lt;td style="WIDTH: 99px" class="style2" valign="top"&gt;0&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class="style2" valign="top" width="13"&gt;4&lt;/td&gt;
            &lt;td style="WIDTH: 99px" class="style2" valign="top"&gt;2&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class="style2" valign="top" width="13"&gt;5&lt;/td&gt;
            &lt;td style="WIDTH: 99px" class="style2" valign="top"&gt;3&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Nella tabella le righe colorate in blu serviranno a definire il triangolo blu mentre quelle colorate in rosso definiranno il triangolo rosso. Definendo entrambi i triangoli si costruisce di fatto un quadrato.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;Ricordiamo che l’ordine in cui si definiscono i punti è molto importante per via del Back-face Culling visto nella &lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2009/01/08/wpf-e-il-3d-seconda-parte.aspx"&gt;prima parte&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Adesso proviamo a mettere insieme quello che abbiamo visto tramite un po' di codice XAML:&lt;/p&gt;
&lt;p&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="GeometryModel3D" border="0" alt="GeometryModel3D" width="503" height="156" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquartaparte_D601/GeometryModel3D.png" /&gt; &lt;/p&gt;
&lt;p&gt;Definiamo la nostra geometria all’interno di un GeometryModel3D che permette di specificare oltre alla geometria vera e propria altre proprietà come il materiale (in questo caso è stato scelto un DiffuseMaterial o materiale uniforme rosso).&lt;/p&gt;
&lt;p&gt;Inseriamo ora il nostro GeometryModel3D all’interno del contenuto del ModelVisual3D del nostro Viewport assieme ad una telecamera e ad una luce come visto nell’&lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2009/03/02/wpf-e-il-3d-terza-parte.aspx"&gt;articolo precedente&lt;/a&gt; per visualizzare il tutto.&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="546"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="544"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="XAML" border="0" alt="XAML" width="550" height="515" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dquartaparte_D601/XAML_ec5e0b1e-5dd2-4c84-bd53-24144400afb6.png" /&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="544"&gt;
            &lt;p align="justify"&gt;&lt;em&gt;Aggiungendo il quarto punto e gli indici dei triangoli al programma sviluppato nella parte precedente abbiamo visualizzato un quadrato (tutto rosso poiché il Materiale della geometria 3D è impostato al colore rosso). Visual Studio 2008 permette di ottenere un anteprima in tempo reale delle geometrie descritte tramite XAML.&lt;/em&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href="http://cid-7996fa031700f3fe.skydrive.live.com/self.aspx/Pubblica/WPFQuad3D.zip"&gt;Scarica il codice sorgente dell’articolo&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/95881.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2009/04/05/wpf-e-il-3d-quarta-parte.aspx</guid>
            <pubDate>Sun, 05 Apr 2009 16:05:02 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2009/04/05/wpf-e-il-3d-quarta-parte.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/95881.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/95881.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF e il 3D (seconda parte)</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2009/01/08/wpf-e-il-3d-seconda-parte.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/articles/wpf_3d.aspx"&gt;Indice degli articoli su WPF e il 3D&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Prima di addentrarci nella realizzazione del nostro &lt;strong&gt;Cubo di Rubiks&lt;/strong&gt; tridimensionale diamo uno sguardo alle basi del 3D partendo dalla creazione di triangoli nello spazio con WPF.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2008/12/28/wpf-e-il-3d-prima-parte.aspx"&gt;Precedentemente&lt;/a&gt; abbiamo detto che i punti, nel sistema di coordinate 3D, sono rappresentati da strutture di tipo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.point3d.aspx"&gt;Point3D&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Per poter utilizzare le classi e le strutture relative al 3D nel nostro codice dobbiamo assicurarci di aver definito il &lt;a href="http://msdn.microsoft.com/it-it/library/z2kcy19k(VS.80).aspx"&gt;namespace&lt;/a&gt; System.Windows.Media.Media3D tramite l’istruzione &lt;a href="http://msdn.microsoft.com/it-it/library/yh598w02(VS.80).aspx"&gt;using&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img width="283" height="16" title="usingMedia3D" style="border-width: 0px; display: inline;" alt="usingMedia3D" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/usingMedia3D_758b7e93-d00f-495e-99ab-eedff62cf4dd.png" /&gt; &lt;/p&gt;
&lt;p&gt;Creare un punto e definirne le coordinate (di tipo &lt;a href="http://msdn.microsoft.com/it-it/library/678hzkk9(VS.80).aspx"&gt;double&lt;/a&gt;) è semplice grazie al &lt;a href="http://msdn.microsoft.com/it-it/library/ace5hbzh.aspx"&gt;costruttore&lt;/a&gt; della struttura Point3D:&lt;/p&gt;
&lt;p&gt;&lt;img width="459" height="39" title="new_point_code" style="border-width: 0px; display: inline;" alt="new_point_code" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/new_point_code_3.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;NB: Il punto verrà solamente creato in memoria ma non sarà visualizzato&lt;/em&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Costruiamo un Triangolo&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Per poter definire un triangolo occorrono 3 punti, un insieme di punti è rappresentato dalla collezione ordinata &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.point3dcollection.aspx"&gt;Point3DCollection&lt;/a&gt; (in XNA si usano array di Vertici).&lt;/p&gt;
&lt;p&gt;Per creare un triangolo rettangolo definiamo i punti (1,0,0), (1,1,0) e (0,0,0):&lt;/p&gt;
&lt;p&gt;&lt;img width="126" height="86" title="triangle" style="border-width: 0px; display: inline;" alt="triangle" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/triangle_1.png" /&gt;  &lt;/p&gt;
&lt;p&gt;E’ possibile farlo attraverso il seguente codice C#:&lt;/p&gt;
&lt;p&gt;&lt;img width="428" height="69" title="triangle_code_long" style="border-width: 0px; display: inline;" alt="triangle_code_long" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/triangle_code_long_3.png" /&gt; &lt;/p&gt;
&lt;p&gt;o sfruttando una sintassi più compatta e meno prolissa è possibile scrivere:&lt;/p&gt;
&lt;p&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/triangle_code_short_2.png"&gt;&lt;img width="436" height="87" title="triangle_code_short" style="border-width: 0px; display: inline;" alt="triangle_code_short" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/triangle_code_short_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;E’ possibile migliorare ulteriormente tale codice indicando nel costruttore della classe Point3DCollection la capacità iniziale corrispondente al numero dei nostri punti (in questo caso 3). Eviteremo di ridimensionare la collezione mano a mano che aggiungiamo punti rendendo più efficiente il nostro codice.&lt;/p&gt;
&lt;p&gt;&lt;img width="444" height="86" title="triangle_code_short_optimized" style="border-width: 0px; display: inline;" alt="triangle_code_short_optimized" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/triangle_code_short_optimized_62d22373-fbfd-400b-bb98-616405014b19.png" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;NB: Questa piccola ottimizzazione è valida in generale per la maggior parte delle collezioni (anche per i &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/ms172192(VS.80).aspx"&gt;&lt;em&gt;Generics&lt;/em&gt;&lt;/a&gt;&lt;em&gt;) ed è maggiormente “tangibile” all’interno di cicli eseguiti molte volte.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;E’ anche possibile definire i punti direttamente nello &lt;a href="http://msdn.microsoft.com/it-it/library/ms752059.aspx"&gt;XAML&lt;/a&gt; (nell’esempio i punti sono definiti come &lt;a href="http://msdn.microsoft.com/it-it/library/ms750613.aspx"&gt;risorsa&lt;/a&gt; dalla chiave “triangle”)&lt;/p&gt;
&lt;p&gt;&lt;img width="589" height="18" title="triangle_xaml_resource" style="border-width: 0px; display: inline;" alt="triangle_xaml_resource" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/triangle_xaml_resource_9eff58fd-a8ce-405b-88d0-f4d397472170.png" /&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;WPF e Back-face Culling&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;L’ordine di aggiunta dei punti è particolarmente importante perché permette a WPF di determinare correttamente le superfici visibili tramite il &lt;a href="http://it.wikipedia.org/wiki/Back-face_culling"&gt;Back-face culling&lt;/a&gt;. In parole povere le superfici visibili dall’osservatore (nelle immagini seguenti una telecamera) sono quelle create in senso antiorario mentre quelle create in senso orario restano nascoste.&lt;/p&gt;
&lt;p&gt;Per chiarire questi concetto proviamo ad immaginare un triangolo con scritto davanti “Front” e dietro “Back”. Creandolo in senso antiorario otterremmo il risultato aspettato e la faccia “Back” non sarà visibile dalla telecamera perché sul retro del triangolo. &lt;/p&gt;
&lt;table width="530" border="0" cellspacing="0" cellpadding="2"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td width="528" valign="top"&gt;&lt;img width="544" height="294" title="triangle_camera_front" style="border-width: 0px; display: inline;" alt="triangle_camera_front" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/triangle_camera_front_14a69c07-763c-4492-88e5-19da5a0009d5.png" /&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width="528" valign="top"&gt;La faccia “Front” del triangolo è visibile frontalmente dalla telecamera perché creata in senso antiorario.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width="528" valign="top"&gt;&lt;img width="544" height="294" title="triangle_camera_back" style="border-width: 0px; display: inline;" alt="triangle_camera_back" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsecondaparte_FAAE/triangle_camera_back_c5b22e30-c1e4-4e74-a1cf-e460bf101440.png" /&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td width="528" valign="top"&gt;La faccia “Back” del triangolo rappresenta il retro del triangolo e non è visibile dalla telecamera.&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Creando invece il triangolo in senso orario indicheremo a WPF che la faccia con la scritta “Back” è quella frontale e quella con la scritta “Front” è quella sul retro.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;UPDATE:&lt;/em&gt;&lt;/strong&gt; E' disponibile il &lt;a href="http://www.atomwave.com/Wpf3DLabs/WPF3DLabs.xbap"&gt;laboratorio&lt;/a&gt; per questo articolo (Richiede Internet Explorer e il supporto applicazioni XBAP abilitato, per abilitarlo andare su Opzioni/Sicurezza/Livello Personalizzato/Applicazioni browser XAML e scegliere Chiedi conferma).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Vedremo nella &lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2009/03/02/wpf-e-il-3d-terza-parte.aspx"&gt;prossima parte&lt;/a&gt; come visualizzare il triangolo e altri oggetti 3D nella nostra applicazione&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/95129.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2009/01/08/wpf-e-il-3d-seconda-parte.aspx</guid>
            <pubDate>Thu, 08 Jan 2009 01:50:47 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2009/01/08/wpf-e-il-3d-seconda-parte.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/95129.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/95129.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF e il 3D (prima parte)</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2008/12/28/wpf-e-il-3d-prima-parte.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/articles/wpf_3d.aspx"&gt;Indice degli articoli su WPF e il 3D&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una delle grandi novità del .NET Framework 3.0 è Windows Presentation Foundation (WPF).&lt;/p&gt;
&lt;p&gt;Inizialmente usato da pochi coraggiosi programmatori, con l'avvento del .NET Framework 3.5 e del successivo SP1 è diventato un ambiente più maturo ed  imparare ad utilizzarlo sta diventando un &lt;strong&gt;must&lt;/strong&gt; se non si vuole perdere il “treno della tecnologia”.&lt;/p&gt;
&lt;p&gt;Vedremo in questa serie di articoli come e quando utilizzare le sue capacità grafiche 3D sviluppando passo passo un &lt;strong&gt;cubo di Rubiks&lt;/strong&gt; programmabile in 3D.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Halo 4 in WPF?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il supporto grafico 3D di WPF non è pensato per videogiochi all’ultimo grido o per altri programmi che fanno pesantemente uso di grafica tridimensionale, sebbene sia basato su DirectX e si avantaggi dell’&lt;a href="http://it.wikipedia.org/wiki/Accelerazione_tridimensionale"&gt;accelerazione grafica&lt;/a&gt; delle recenti schede video. &lt;br /&gt;
Per creare videogiochi con codice gestito (come C#) è possibile utilizzare &lt;a href="http://creators.xna.com/"&gt;XNA&lt;/a&gt;, un buon punto di partenza per impararlo è il sito &lt;a href="http://vs85team.spaces.live.com"&gt;XnaLearners&lt;/a&gt;, negli articoli saranno comunque evidenziate le differenze tra WPF e XNA per facilitare la “transizione” da un framework all’altro. &lt;br /&gt;
Con WPF è possibile creare visualizzazioni tridimensionali come &lt;strong&gt;grafici&lt;/strong&gt; e &lt;strong&gt;modelli&lt;/strong&gt; di oggetti/prodotti per rendere più usabile e accattivante il proprio programma.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;In principio furono… i triangoli!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Alla base di tutti i modelli tridimensionali (anche i più complessi) ci sono solamente triangoli. Una sfera ad esempio è formata solamente da triangoli, più triangoli ci sono e più la sfera è definita.&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="333"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="173"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Disegniamooggetti3Dnellenostreapplicazio_173/lowTriangles_2.gif"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="lowTriangles" border="0" alt="lowTriangles" width="185" height="185" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Disegniamooggetti3Dnellenostreapplicazio_173/lowTriangles_thumb.gif" /&gt;&lt;/a&gt; &lt;/td&gt;
            &lt;td valign="top" width="158"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Disegniamooggetti3Dnellenostreapplicazio_173/highTriangles_2.gif"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="highTriangles" border="0" alt="highTriangles" width="185" height="185" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Disegniamooggetti3Dnellenostreapplicazio_173/highTriangles_thumb.gif" /&gt;&lt;/a&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="173"&gt;Sfera con pochi triangoli&lt;/td&gt;
            &lt;td valign="top" width="158"&gt;Sfera con molti triangoli&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;NB: Esistono diverse tecniche per “far sembrare” più definito un modello composto da pochi triangoli (&lt;a href="http://en.wikipedia.org/wiki/Texture_mapping"&gt;Texture Mapping&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Bump_mapping"&gt;Bump mapping&lt;/a&gt;, etc..).&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Sistema di coordinate 3D di WPF&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Per poter definire i triangoli occorrono dei punti che hanno determinate coordinate, il sistema di riferimento per i punti nello spazio tridimensionale (a differenza del sistema di riferimento bidimensionale) è mostrato dalla seguente figura:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Disegniamooggetti3Dnellenostreapplicazio_173/XYZ_2.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="XYZ" border="0" alt="XYZ" width="119" height="102" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Disegniamooggetti3Dnellenostreapplicazio_173/XYZ_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;I punti sono formalmente oggetti di tipo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.point3d.aspx"&gt;Point3D&lt;/a&gt; che contengono le coordinate X,Y e Z, in XNA i punti sono chiamati Vertici (Vertex) e possono essere rappresentati dal tipo &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.vector3.aspx"&gt;Vector3&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/95030.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2008/12/28/wpf-e-il-3d-prima-parte.aspx</guid>
            <pubDate>Sun, 28 Dec 2008 23:30:09 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2008/12/28/wpf-e-il-3d-prima-parte.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/95030.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/95030.aspx</trackback:ping>
        </item>
    </channel>
</rss>