User Tools

Site Tools


combining

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
combining [2024/03/31 16:21]
badmin [Combining multiple models into a single .binvox file]
combining [2024/04/02 15:19] (current)
badmin [Merging the resulting binvox files]
Line 1: Line 1:
  
-===== Combining multiple models into a single .binvox file =====+===== Combining ​(merging) ​multiple models into a single .binvox file =====
  
 This is a fairly popular use case, for which I had promised to write a tutorial many years ago.. :-| This is a fairly popular use case, for which I had promised to write a tutorial many years ago.. :-|
 +
 +==== An example 3D model with multiple components ====
 +
 +I constructed the example from [[https://​sketchfab.com/​3d-models/​me-but-utterly-shocked-96ac65ba1a8048e089d572b2808dac0a|this 3D model on Sketchfab]] and a sphere,
 +combined using the ''​blender''​ 3D modeller (https://​www.blender.org):​
 +
 +{{ :​wiki:​3d_mesh_two_components.png?​direct&​400 |}}
 +
 +==== Splitting the 3D model ====
 +
 +In ''​blender''​ I selected the "​heart"​ sphere, deleted it, and saved the puppet as an ''​.obj''​ file (File -> Export -> Wavefront (.obj), then select Z as the up axis). Next, Edit -> Undo, and the same step to save the sphere to an ''​.obj''​ file.
 +
 +The resulting files: [[https://​www.patrickmin.com/​binvox_merge/​example/​puppet.obj|puppet.obj]] and [[https://​www.patrickmin.com/​binvox_merge/​example/​heart.obj|heart.obj]]
 +
 +==== Voxelizing both models in the same coordinate system ====
 +
 +The goal is to voxelize them such that after merging they end up in the same spot relative to each other.
 +
 +For this we need to determine the smallest bounding box that contains both models. Since in our example the "​heart"​ is inside the body, we can use the bounding box of the puppet.
 +
 +''​binvox''​ determines a model'​s bounding box and prints it to the terminal:
 +
 +<​code>​
 +# > binvox -d 128 puppet.obj
 +
 +--- [binvox] mesh voxelizer, version 1.36, build #889 on 2023/07/23 12:28:17, running on Linux
 +
 +...
 +
 +  Mesh::​normalize,​ bounding box: [-0.768355, -0.313688, -0.034275, 1] - [0.658711, 0.407517, 2.04301, 1]
 +  ​
 +...
 +</​code>​
 +
 +Make a note of these values, and pass them to ''​binvox''​ when voxelizing the heart:
 +<​code>​
 +# > binvox -d 128 -bb -0.768355 -0.313688 -0.034275 0.658711 0.407517 2.04301 heart.obj
 +</​code>​
 +
 +I will update ''​binvox''​ such that it prints these ''​-bb''​ parameters so they can be copied and pasted.
 +
 +Now both models have been voxelized such that they can be merged, and be the same relative size and in the same relative position.
 +
 +==== Merging the resulting binvox files ====
 +
 +For this, the ''​binvox_merge''​ tool was created. It takes two binvox files as input, and produces a single binvox file:
 +<​code>​
 +binvox_merge heart.binvox puppet.binvox -o puppet_with_heart.binvox
 +</​code>​
 +
 +''​binvox_merge''​ simply sets an output voxel to 1 if it is set in the first input file, and to 2 if it is set in the second input file.
 +
 +The output file is in the binvox **version 2** file format, which supports different values for a set voxel (in the range 1-255). ​
 +
 +-----
 +
 +**TODO**: some explanation/​options needed about what happens when a voxel is set in both input files
 +
 +-----
 +
 +==== Visualising the merged binvox file ====
 +
 +''​viewvox''​ (from version 0.51 onwards) supports viewing this new binvox version 2 file format.
 +
 +A useful new feature is the ability to toggle "point rendering"​ of each input component, using the number keys 1 through 9 (so in our example only keys 1 and 2 are useful).
  
  
combining.1711898503.txt.gz ยท Last modified: 2024/03/31 16:21 by badmin