User Tools

Site Tools


combining

Differences

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

Link to this comparison view

Next revision
Previous revision
combining [2024/03/31 16:21]
badmin created
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.1711898495.txt.gz · Last modified: 2024/03/31 16:21 by badmin