141 lines
5.8 KiB
HTML
141 lines
5.8 KiB
HTML
|
<html>
|
||
|
<style type="text/css"><!--
|
||
|
body { margin-left: 10%; margin-right: 10%; }
|
||
|
h1 { font-size: 150%; margin-left: 3%; page-break-before: always;}
|
||
|
h2 { font-size: 120%; margin-left: 1%; }
|
||
|
h3 { font-size: 110%; margin-left: 0%; }
|
||
|
ul { list-style: none; }
|
||
|
ul { padding: 0 0 0 1.5em; }
|
||
|
li { padding: 0 0 0.5em 0; }
|
||
|
em {font-size: 133%; font-family:monospace}
|
||
|
|
||
|
--></style>
|
||
|
<body>
|
||
|
|
||
|
<p>
|
||
|
<center><img src="nexus_logo_midi.png"></center>
|
||
|
<p>
|
||
|
<h2>Index:</h2>
|
||
|
<p>
|
||
|
<ul>
|
||
|
|
||
|
<li><a href="#picture">Big picture</a></li>
|
||
|
<li><a href="#struct">Structures and interfaces</a></li>
|
||
|
<ul>
|
||
|
<li><a href="#vfile">VFile</a></li>
|
||
|
<li><a href="#crude">Crude</a></li>
|
||
|
<li><a href="#pchain">PChain</a></li>
|
||
|
<li><a href="#nexus">Nexus</a></li>
|
||
|
<li><a href="#bmt">Bmt</a></li>
|
||
|
</ul>
|
||
|
<li><a href="#algo">Algorithms</a></li>
|
||
|
<ul>
|
||
|
<li><a href="#plyto">Plys to Crude</a></li>
|
||
|
<li><a href="#crudeto">Crude to PChain</a></li>
|
||
|
<li><a href="#crudepchainto">Crude + Pchain to Nexus</a></li>
|
||
|
<li><a href="#nexusto">Nexus to Bmt</a></li>
|
||
|
</ul>
|
||
|
</ul>
|
||
|
|
||
|
|
||
|
<a name="picture"><h1>Big picture</h1></a>
|
||
|
<a name="struct"><h1>Structures and interfaces</h1></a>
|
||
|
|
||
|
<a name="vfile"><h2>VFile</h2></a>
|
||
|
VFile dovrebbe avere piu' o meno la stessa interfaccia di <em>vector</em>
|
||
|
ma usare un file per storare i dati (un mmapping, ma non limitato a 4Gb).<br>
|
||
|
|
||
|
<a name="crude"><h2>Crude</h2></a>
|
||
|
Crude e' un formato tipo il ply... solo che usa dei VFile per
|
||
|
storare i dati.(3 unsigned int per una faccia e 3 float per un vertice)<br>
|
||
|
Per cui e' composto di 3 files almeno: header (numero di facce,
|
||
|
vertici e Bounding box), file dei vertici, file delle facce ed
|
||
|
opzionalmente file degli attributi dei vertici e delle facce.<br>
|
||
|
Come interfaccia e' sufficente che dia accesso casuale a facce e vertici...
|
||
|
<a name="pchain"><h2>PChain</h2></a>
|
||
|
Sta per 'partition chain' cioe' una catena di partizioni dello
|
||
|
spazio.<br>
|
||
|
Una <em>PChain</em> detto in matematichese e' una funzione da
|
||
|
[0..L] X R^3 -> N (cioe' dato un livello e un punto nello spazio
|
||
|
restituisce un numero naturale. (una patch)<br>
|
||
|
Oltre a questo va aggiunta una funzione che dato un punto e una patch
|
||
|
ne restituisce la distanza (o un valore 'equivalente').<br>
|
||
|
Si deve poter salvare su disco e recuperare una pchain<br>
|
||
|
|
||
|
<a name="remap"><h2>Remap</h2></a>
|
||
|
E' composta da 3 files:<br>
|
||
|
indice delle patches: per ogni patch il numero di vertici, di facce e
|
||
|
di bordi<br>
|
||
|
vertici -> lista di patches: per ogni vertice una lista di patch
|
||
|
di cui fa parte (se sono + di 1 e' ovviamente di bordo.<br>
|
||
|
facce->patches: per ogni faccia un intero che dice in quale patch
|
||
|
sta.<br>
|
||
|
|
||
|
|
||
|
<a name="nexus"><h2>Nexus</h2></a>
|
||
|
E' una struttura con 3 files: 'index', 'patches' e 'borders'.<br>
|
||
|
'Index' contiene l'indice delle patches: per ogni patch viene storato
|
||
|
offset, size (ma questa potrebbe essere storata direttamente nei
|
||
|
files?) dei dati geometrici nel file delle patches e dei bordi nel
|
||
|
file dei borders, oltre alla bounding sphere.<br>
|
||
|
'Patches' e' un VFile di chunks da 4k dove i dati geometrici di una
|
||
|
patch occupano un numero intero di chunks. P.S. Come ce la caviamo con
|
||
|
gli attributi dei vertici e delle facce?<br>
|
||
|
'Borders' e' un VFile di 'links' dove ogni link fa riferimento ad un
|
||
|
vertice di bordo tra la patch A (V_a) e la B (V_b) e contiene
|
||
|
(V_a, V_b, B) (A e' implicito). L'informazione e' replicata nei bordi
|
||
|
relativi a B con (V_b, V_a, A)<br>
|
||
|
|
||
|
<a name="bmt"><h2>Bmt</h2></a>
|
||
|
Bmt (batched multi triangulation) e' il formato per la
|
||
|
multirisoluzione:<br>
|
||
|
E' un vettore di 'Cell' scritti su disco + un 'Index' e una 'History'.
|
||
|
Cell contiene i dati da visualizzare: vertici e strip (e altro?).<br>
|
||
|
Index contiene per ogni cell 'offset' per trovare la cell
|
||
|
corrispondente, error e bounding sphere (e per il face o vertex
|
||
|
count?).<br>
|
||
|
History e' la storia della multirisoluzione.<br>
|
||
|
|
||
|
<a name="algo"><h1>Algorithms</h1></a>
|
||
|
<a name="plyto"><h2>Plys to Crude</h2></a>
|
||
|
Si copiano i vertici un ply dopo l'altro nel crude.<br>
|
||
|
Per le facce si copiano sommando un offset ai vertici<br>
|
||
|
Se si montano insieme piu' ply i vertici rimangono duplicati.<br>
|
||
|
E' piu' semplice fare il join dentro Nexus.<br>
|
||
|
|
||
|
<a name="crudeto"><h2>Crude + PChain to Remap</h2></a>
|
||
|
Come prima cosa si costruisce il pchain passandogli il Crude.<br>
|
||
|
Asegnamo per ogni faccia la sua patch al livello 0.<br>
|
||
|
Per ogni patch sappiamo quante ce ne sono.<br>
|
||
|
Ridistribuiamo le patch troppo piccole (e rimappiamo i numeri delle
|
||
|
patches per rimuovere i buchi (anche dentro il PChain).<br>
|
||
|
Per risparmiare nella stessa passata ci segnamo dove vanno i vertici<br>
|
||
|
Poi facciamo un'altra passate per contare i bordi<br>
|
||
|
Infine si sortano le facce secondo l'ordine delle patches.<br>
|
||
|
|
||
|
<a name="crudepchainto"><h2>Crude + Remap to Nexus</h2></a>
|
||
|
Per ogni patch raccogliamo le facce, e i vertici (ma non li
|
||
|
unifichiamo) e costruiamo una patch nel Nexus.<br>
|
||
|
Ci dobbiamo segnare i bordi mano a mano che lo facciamo:
|
||
|
per ogni patch ci salviamo una lista di triplette: il numero assoluto
|
||
|
del vertice di bordo, il numero relativo nella patch che stiamo
|
||
|
salvando, e il numero della patch (o delle patch) con la quale
|
||
|
confina.<br>
|
||
|
Queste informazioni le tiriamo fuori dal Remap dei vertici<br>
|
||
|
Una volta salvate tutte le patches ci smazziamo i bordi:
|
||
|
per ogni patch prendiamo quella lista e la incrociamo con quella
|
||
|
delle patches confinanti per costruire i bordi da passare a nexus.<br>
|
||
|
|
||
|
<a name="nexusto"><h2>Nexus + PChain to Bmt</h2></a>
|
||
|
Per costruire il file multirisoluzione aggiungeremo semplicemente
|
||
|
nuove patches al file nexus.<br>
|
||
|
Ad ogni passo selezioniamo un gruppo di patches (il PChain ci dice i
|
||
|
gruppi), li joiniamo insieme usando i bordi per riunificare i vertici
|
||
|
e per marcare i bordi esterni.<br>
|
||
|
Poi semplifichiamo e splittiamo (e sempre il PChain ci dice quali
|
||
|
nuove patches creare), ridistribuiamo le patches troppo piccole.<br>
|
||
|
E aggiungiamo le nuove patches al Nexus, e i nuovi bordi.<br>
|
||
|
Ci salviamo anche la storia da qualche parte.<br>
|
||
|
</body>
|
||
|
</html>
|