C++ OpenVDB中网格上的转换和CSG操作
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
- 只有一个网格的vdb输入文件,表示从三角形网格开始创建的标高集
- 存储操作结果的vdb输出
#包括
#包括“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
),在新转换的网格中重新插入初始网格中的数据-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
),在新转换的网格中重新插入初始网格中的数据-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;
}