C++ OpenVDB中网格上的转换和CSG操作

C++ OpenVDB中网格上的转换和CSG操作,c++,tree,csg,openvdb,C++,Tree,Csg,Openvdb,OpenVDB看起来非常神奇,节点的寻址也非常智能。有些操作我不了解,特别是CSG操作。这是一个示例代码。它接受两个参数作为输入: 只有一个网格的vdb输入文件,表示从三角形网格开始创建的标高集 存储操作结果的vdb输出 算法应该接受输入 在gridA中创建一个deepCopy 在gridB中创建一个deepCopy 沿M_PI/4.0f的Y轴旋转网格B 在gridA和gridB之间执行csgUnion 将所有栅格保存在vdb输出文件中 我正在尝试使用VDB网格作为数据容器来代替classi

OpenVDB看起来非常神奇,节点的寻址也非常智能。有些操作我不了解,特别是CSG操作。这是一个示例代码。它接受两个参数作为输入:

  • 只有一个网格的vdb输入文件,表示从三角形网格开始创建的标高集
  • 存储操作结果的vdb输出
算法应该接受输入

  • 在gridA中创建一个deepCopy
  • 在gridB中创建一个deepCopy
  • 沿M_PI/4.0f的Y轴旋转网格B
  • 在gridA和gridB之间执行csgUnion
  • 将所有栅格保存在vdb输出文件中
  • 我正在尝试使用VDB网格作为数据容器来代替classicaloctree算法,用于物理模拟,这需要碰撞中的高水平细节

    我理解世界坐标和栅格坐标之间转换的概念,但我无法理解的是如何执行树内数据的转换,如平移或旋转标高集,如刚性对象。在这个例子中,我认为我只是在改变世界和晶格之间的转换

    这是结果(与标高集和体积相同):初始网格变形网格,似乎执行了旋转…没有最终结果

    你有什么建议吗

    附件:一个示例和指向我正在使用的链接的链接已删除(抱歉,它是133MB…)

    #包括
    #包括“openvdb/openvdb.h”
    #包括“openvdb/util/util.h”
    #包括“openvdb/io/Stream.h”
    #包括“openvdb/tools/Composite.h”
    使用名称空间openvdb;
    int main(int argc,字符**argv){
    openvdb::initialize();
    openvdb::io::File文件(argv[1]);
    file.open();
    GridBase::Ptr baseGrid;
    for(openvdb::io::File::NameIterator nameIter=File.beginName();
    nameIter!=file.endName();++nameIter)
    {baseGrid=file.readGrid(namiter.gridName());}
    file.close();
    FloatGrid::Ptr gridA=gridptrcat(baseGrid);
    FloatGrid::Ptr gridB=gridA->deepCopy();
    FloatGrid::Ptr result=gridA->deepCopy();
    gridB->transform().postRotate(M_PI/4.0f,数学::Y_轴);
    工具::csgUnion(*结果,*gridB);
    openvdb::io::File out(argv[2]);
    GridPtrVec网格;
    网格。推回(网格);
    网格。向后推_(gridB);
    网格。推回(结果);
    文件输出。写入(网格);
    file_out.close();
    返回0;
    }
    
    多亏了OpenVDB论坛中的VDB支持,我的答案是:

  • 执行初始网格的简单元数据副本
  • 执行转换(如代码中的旋转)
  • 使用
    tools::resampleToMatch
    ,选择一个可用的插值器(在我的例子中是
    tools::BoxSample
    ),在新转换的网格中重新插入初始网格中的数据
  • 继续csg运营
  • 仅供参考,执行时间存在极大差异 使用优化标志
    -O3
    (时间减少400%)

    #包括“openvdb/io/Stream.h”
    #包括“openvdb/openvdb.h”
    #包括“openvdb/tools/Composite.h”
    #包括“openvdb/tools/GridTransformer.h”
    #包括“openvdb/tools/Interpolation.h”
    #包括“openvdb/util/util.h”
    #包括
    使用名称空间openvdb;
    int main(int argc,字符**argv){
    openvdb::initialize();
    openvdb::io::File文件(argv[1]);
    file.open();
    GridBase::Ptr baseGrid;
    for(openvdb::io::File::NameIterator nameIter=File.beginName();
    nameIter!=file.endName();++nameIter){
    baseGrid=file.readGrid(namiter.gridName());
    }
    file.close();
    FloatGrid::Ptr gridA=gridptrcat(baseGrid);
    FloatGrid::Ptr gridB=gridA->copy(CP\u NEW);
    gridB->setTransform(gridA->transform().copy());
    gridB->transform().postRotate(M_PI/4.0f,数学::Y_轴);
    工具::重采样匹配(*gridA,*gridB);
    FloatGrid::Ptr result=gridA->deepCopy();
    FloatGrid::Ptr gridB2=gridB->deepCopy();
    工具::csgUnion(*结果,*gridB);
    openvdb::io::File out(argv[2]);
    GridPtrVec网格;
    网格。推回(网格);
    网格。向后推_(网格B2);
    网格。推回(结果);
    文件输出。写入(网格);
    file_out.close();
    返回0;
    }
    

    参考资料:

    由于OpenVDB论坛对VDB的支持,我的答案是:

  • 执行初始网格的简单元数据副本
  • 执行转换(如代码中的旋转)
  • 使用
    tools::resampleToMatch
    ,选择一个可用的插值器(在我的例子中是
    tools::BoxSample
    ),在新转换的网格中重新插入初始网格中的数据
  • 继续csg运营
  • 仅供参考,执行时间存在极大差异 使用优化标志
    -O3
    (时间减少400%)

    #包括“openvdb/io/Stream.h”
    #包括“openvdb/openvdb.h”
    #包括“openvdb/tools/Composite.h”
    #包括“openvdb/tools/GridTransformer.h”
    #包括“openvdb/tools/Interpolation.h”
    #包括“openvdb/util/util.h”
    #包括
    使用名称空间openvdb;
    int main(int argc,字符**argv){
    openvdb::initialize();
    openvdb::io::File文件(argv[1]);
    file.open();
    GridBase::Ptr baseGrid;
    for(openvdb::io::File::NameIterator nameIter=File.beginName();
    nameIter!=file.endName();++nameIter){
    baseGrid=file.readGrid(namiter.gridName());
    }
    file.close();
    FloatGrid::Ptr gridA=gridptrcat(baseGrid);
    FloatGrid::Ptr gridB=gridA->copy(CP\u NEW);
    gridB->setTransform(gridA->transform().copy());
    gridB->transform().postRotate(M_PI/4.0f,数学::Y_轴);
    工具::重采样匹配(*gridA,*gridB);
    FloatGrid::Ptr result=gridA->deepCopy();
    FloatGrid::Ptr gridB2=gridB->deepCopy();
    工具::csgUnion(*结果,*gridB);
    openvdb::io::File out(argv[2]);
    GridPtrVec网格;
    网格。推回(网格);
    网格。向后推_(网格B2);
    网格。推回(结果);
    文件输出。写入(网格);
    file_out.close();
    ret
    
    #include <cmath>
    #include "openvdb/openvdb.h"
    #include "openvdb/util/Util.h"
    #include "openvdb/io/Stream.h"
    #include "openvdb/tools/Composite.h"
    
    using namespace openvdb;
    int main(int argc, char** argv) {
      openvdb::initialize();
    
      openvdb::io::File file(argv[1]);
      file.open();
    
      GridBase::Ptr baseGrid;
      for (openvdb::io::File::NameIterator nameIter = file.beginName(); 
           nameIter != file.endName(); ++nameIter) 
           { baseGrid = file.readGrid(nameIter.gridName()); }
    
      file.close();
      FloatGrid::Ptr gridA = gridPtrCast<FloatGrid>(baseGrid);
      FloatGrid::Ptr gridB = gridA->deepCopy();
      FloatGrid::Ptr result = gridA ->deepCopy();
    
      gridB->transform().postRotate(M_PI/4.0f, math::Y_AXIS);
    
      tools::csgUnion(*result, *gridB);
    
      openvdb::io::File file_out(argv[2]);
      GridPtrVec grids;
    
      grids.push_back(gridA);
      grids.push_back(gridB);
      grids.push_back(result);
    
      file_out.write(grids);
      file_out.close();
    
      return 0;
    }
    
    #include "openvdb/io/Stream.h"
    #include "openvdb/openvdb.h"
    #include "openvdb/tools/Composite.h"
    #include "openvdb/tools/GridTransformer.h"
    #include "openvdb/tools/Interpolation.h"
    #include "openvdb/util/Util.h"
    
    #include <cmath>
    
    using namespace openvdb;
    int main(int argc, char **argv) {
      openvdb::initialize();
    
      openvdb::io::File file(argv[1]);
      file.open();
    
      GridBase::Ptr baseGrid;
      for (openvdb::io::File::NameIterator nameIter = file.beginName();
           nameIter != file.endName(); ++nameIter) {
        baseGrid = file.readGrid(nameIter.gridName());
      }
    
      file.close();
      FloatGrid::Ptr gridA = gridPtrCast<FloatGrid>(baseGrid);
      FloatGrid::Ptr gridB = gridA->copy(CP_NEW);
      gridB->setTransform(gridA->transform().copy());
      gridB->transform().postRotate(M_PI / 4.0f, math::Y_AXIS);
    
      tools::resampleToMatch<tools::BoxSampler>(*gridA, *gridB);
    
      FloatGrid::Ptr result = gridA->deepCopy();
      FloatGrid::Ptr gridB2 = gridB->deepCopy();
    
      tools::csgUnion(*result, *gridB);
    
      openvdb::io::File file_out(argv[2]);
      GridPtrVec grids;
    
      grids.push_back(gridA);
      grids.push_back(gridB2);
      grids.push_back(result);
    
      file_out.write(grids);
      file_out.close();
    
      return 0;
    }