2004-06-24 16:32:45 +02:00
|
|
|
<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>
|
2005-01-14 16:25:29 +01:00
|
|
|
La truttura nexus divide la mesh in tante piccole parti.<br>
|
|
|
|
Ciascuna parte ha le facce indicizzate localmente, e sono codificate
|
|
|
|
esplicitamente le corrispondenze tra vertici di patches diverse.<br>
|
|
|
|
|
2004-06-24 16:32:45 +02:00
|
|
|
<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>
|
2005-01-14 16:25:29 +01:00
|
|
|
<pre>
|
2004-06-24 16:32:45 +02:00
|
|
|
Crude e' un formato tipo il ply... solo che usa dei VFile per
|
2005-01-14 16:25:29 +01:00
|
|
|
storare i dati.(3 unsigned int per una faccia e 3 float per un vertice).
|
|
|
|
Per cui e' composto di 3 files:
|
|
|
|
Header (<b>.crd</b>)
|
|
|
|
Magic: 'c' 'r' 'd' 0x00 (4 bytes)
|
|
|
|
N vertici: unsigned int (4 bytes)
|
|
|
|
N facce: unsigned int (4 bytes)
|
|
|
|
Box: Box3f (6 float min(x, y, z) e max(x, y, z))
|
|
|
|
|
|
|
|
File dei vertici: Point3f in sequenza (3 float, x, y, z)
|
|
|
|
File delle facce: 3 unsigned int
|
|
|
|
|
|
|
|
opzionalmente file degli attributi dei vertici e delle facce.
|
|
|
|
|
|
|
|
Come interfaccia e' sufficente che dia accesso casuale a facce e vertici...
|
|
|
|
</pre>
|
|
|
|
|
2004-06-24 16:32:45 +02:00
|
|
|
<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="nexus"><h2>Nexus</h2></a>
|
2005-01-14 16:25:29 +01:00
|
|
|
<pre>
|
|
|
|
E' una struttura con 2 files:
|
|
|
|
|
|
|
|
File delle patches: (<b>.nxs</b>)
|
|
|
|
1Kb riservato per dati globali:
|
|
|
|
Magic: 'n' 'x' 's' 0x00
|
|
|
|
Signature: unsigned int (maschera di bit)
|
|
|
|
Chunk size: unsigned int
|
|
|
|
Index offset: int64 (offset to the index begin,
|
|
|
|
must be a multiple of chunk size)
|
|
|
|
History offset: int64: multiple of chunk_size
|
|
|
|
|
|
|
|
Tot vert: unsigned int
|
|
|
|
Tot face: unsigned int
|
|
|
|
Bound sphere: Sphere3f (4 float: Point3f center (x, y, z), (radius))
|
|
|
|
|
|
|
|
Dati (la sequenza di patches)
|
|
|
|
|
|
|
|
Index
|
|
|
|
History
|
|
|
|
|
|
|
|
'Index' contiene l'indice delle patches, per ogni patch viene storato:
|
|
|
|
offset, size dei dati geometrici nel file delle patches etc.
|
|
|
|
'History' vedi history.h
|
|
|
|
|
|
|
|
Index e History sono tenuti in memoria se il file e' aperto per creare
|
|
|
|
o per modificare, e sono salvati quando si chiude il file.
|
|
|
|
|
|
|
|
File dei bordi:
|
|
|
|
Links.
|
|
|
|
Index (offset, size tot size used)
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
</pre>
|
|
|
|
<br>
|
2004-06-24 16:32:45 +02:00
|
|
|
|
|
|
|
<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>
|