OpenVDB看起来真的很棒,节点的寻址非常聪明。有一些我不理解的操作,特别是CSG操作。这是一个示例代码。它需要输入两个参数:
算法应该接受输入,
我正在尝试使用VDB网格作为数据容器来代替经典树种算法,用于在碰撞中需要高水平细节的物理模拟。
我理解世界坐标和网格坐标之间的转换概念,我无法理解的是如何在树内执行数据转换,例如转换或旋转关卡集,如刚性对象。在这个例子中,我认为我只是在改变世界与格子之间的转换。
这是结果(水平集和音量相同):初始网格格式化网格,似乎执行了旋转... 没有最终导致?
你有什么建议吗?
附:我正在使用的 LINK REMOVED 的一个示例和链接(抱歉,它是133MB ......)
#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;
}
答案 0 :(得分:0)
由于OpenVDB论坛中的VDB支持,我的答案解决方案是:
quotes.data.frequency_counts[i].negative = Math.round(negative * -1)+'%';
quotes.data.frequency_counts[i].positive = Math.round(positive)+'%';
从新转换的网格中的初始网格重新插入数据,选择其中一个插值器(在我的情况下为tools::resampleToMatch
)。仅供参考,执行时间存在极端差异
使用优化标志tools::BoxSample
(减少400%的时间)。
-O3