vcglib/apps/nexus/nexus.html

175 lines
6.3 KiB
HTML
Raw Normal View History

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>