You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenVDB levelSetRebuild()生成空网格,转换后无激活体素求助

问题分析

你遇到的问题根源在于**sdfToFogVolume转换后的雾体积数值特性和levelSetRebuild的预期输入不匹配**:

  1. sdfToFogVolume会将原始Level Set的符号距离场(SDF)值转换为雾密度值,转换公式为 fog = 1 / (1 + exp(-sigma * sdf))(默认sigma=1),最终数值范围落在[0,1]之间,原立方体内部(SDF负区域)密度接近1,外部(SDF正区域)密度接近0。
  2. levelSetRebuild默认以0.5作为等值面阈值重建SDF,但转换后的雾体积中,原立方体内外的密度值没有形成足够的0.5等值面区域,导致重建出的Level Set无活跃体素。
修复方案

调用levelSetRebuild时,需指定匹配雾体积数值的等值面阈值,同时可调整重建带宽保证生成的Level Set有足够活跃体素,另外注意补充OpenVDB初始化步骤:

#include <iostream>
#include <openvdb/openvdb.h>
#include <openvdb/tools/LevelSetPlatonic.h>
#include <openvdb/tools/LevelSetRebuild.h>
#include <openvdb/tools/LevelSetUtil.h>

int main()
{
    openvdb::initialize(); // OpenVDB操作必须先初始化

    auto obj1 = openvdb::tools::createLevelSetCube<openvdb::FloatGrid>(50.f, {});
    openvdb::tools::sdfToFogVolume<openvdb::FloatGrid>(*obj1);
    
    // 配置重建参数:指定等值面阈值为0.5,调整带宽为5
    openvdb::tools::LevelSetRebuildOptions opts;
    opts.isoValue = 0.5f;
    opts.bandWidth = 5.0f;
    auto obj2 = openvdb::tools::levelSetRebuild<openvdb::FloatGrid>(*obj1, opts);

    std::cout << "Active voxels: " << obj2->activeVoxelCount() << std::endl;
}
关键注意点
  • OpenVDB初始化:所有OpenVDB操作前必须调用openvdb::initialize(),否则会触发未定义行为。
  • 等值面阈值匹配:雾体积的过渡区域对应0.5密度值,这是重建SDF的核心等值面,必须显式指定。
  • 带宽参数调整:增大带宽可拓宽Level Set的活跃体素范围,避免出现空结果。

内容的提问来源于stack exchange,提问作者PeteUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:22:41