Chai 3D之体积对象
推荐:将 NSDT场景编辑器 加入你的3D开发工具链
介绍
体积渲染对于需要可视化三维数据集的科学和工程应用至关重要。示例包括由医学成像设备获取的数据或计算流体动力学模拟产生的数据的可视化。交互式体积渲染应用程序的用户依靠现代图形加速器的性能来实现高效的数据探索和功能发现。
![](https://www.mvrlink.com/content/images/2023/03/image-13.png)
体素数据
体素表示三维空间中规则网格上的值。体素是“体积”和“像素”的组合,其中像素是“图片”和“元素”的组合。与位图中的像素一样,体素本身通常不会将其位置(坐标)与其值一起显式编码。相反,体素的位置是根据其相对于其他体素的位置(即它在构成单个体积图像的数据结构中的位置)推断的。与像素和体素相反,点和面通常由其顶点的坐标显式表示。这种差异的直接结果是,多边形能够有效地表示具有大量空空间或均匀填充空间的简单 3D 结构,而体素擅长表示非均匀填充的常规采样空间。
体素经常用于医学和科学数据的可视化和分析。某些体积显示器使用体素来描述其分辨率。例如,显示器可能能够显示 512x512x512 体素。
体素对象
体积对象在 CHAI3D 中使用名为 cVoxelObject 的类实现,其中体积数据作为 3D 纹理 (cTexture3D) 存储到内存中。在下面的代码中,我们演示了如何设置此类对象并对各个体素进行编程。
using namespace chai3d;
//--------------------------------------------------------------------------
// CREATE VOLUME MODEL
//--------------------------------------------------------------------------
// create a volumetric model
cVoxelObject* object = new cVoxelObject();
// add object to world
world->addChild(object);
// set the dimensions by assigning the position of the min and max corners
object->m_minCorner.set(-0.5,-0.5,-0.5);
object->m_maxCorner.set( 0.5, 0.5, 0.5);
// set the texture coordinate at each corner.
object->m_minTextureCoord.set(0.0, 0.0, 0.0);
object->m_maxTextureCoord.set(1.0, 1.0, 1.0);
// set general material color
object->m_material->setOrangeCoral();
// set stiffness property
object->setStiffness(0.2 * maxStiffness);
// show/hide boundary box
object->setShowBoundaryBox(false);
//--------------------------------------------------------------------------
// CREATE VOXEL DATA
//--------------------------------------------------------------------------
// create multi image data structure
cMultiImagePtr image = cMultiImage::create();
// allocate 3D image data
image->allocate(512, 512, 512, GL_RGBA);
// create texture
texture = cTexture3d::create();
// assign volumetric image to texture
texture->setImage(image);
// assign texture to voxel object
object->setTexture(texture);
// set default rendering mode
object->setRenderingModeIsosurfaceMaterial();
// set quality of graphic rendering
object->setQuality(0.5);
// draw some 3D volumetric object
buildVoxelShape(0.5, 0.2);
![](https://www.mvrlink.com/content/images/2023/03/image-14.png)
要编辑体素数据的内容,可以使用以下方法:
using namespace chai3d;
// assign a value to a voxel
image->setVoxelColor(x, y, z, color);
修改数据(一个或多个体素)后,请确保始终标记纹理以从 CPU 更新到 GPU 内存。
using namespace chai3d;
// update voxel data from CPU to GPU memory
texture->markForUpdate();
文件支持
也可以通过将一堆 2D 图像加载到内存中来构建体积模型。
using namespace chai3d;
// create multi image
cMultiImagePtr image = cMultiImage::create();
// load voxel data from images
int numImages = image->loadFromFiles("myModel0"), "png", 256);
![](https://www.mvrlink.com/content/images/2023/03/image-15.png)
如果您的体积图像处于灰度级别(CT、MRI 数据),则可以使用传递函数对数据进行着色。传递函数的作用是通过将值和其他数据度量映射到光学属性来强调数据中的特征。最简单和最广泛使用的传递函数是一维的,它们将数据值的范围映射到颜色和不透明度。通常,这些传递函数是使用一维纹理查找表实现的。
using namespace chai3d;
// create colormap image
cImagePtr colorMap = cImage::create();
// load colormap file
colorMap->loadFromFile("myColorMap.png");
// assign colormap to object
object->m_colorMap->setImage(colorMap);
3D建模学习工作室翻译整理,转载请标明出处!