C++ 移动立方体地形/山脊效果

C++ 移动立方体地形/山脊效果,c++,ogre3d,marching-cubes,C++,Ogre3d,Marching Cubes,我正在实现一个marching cubes算法,该算法通常基于的实现,并进行了一些重大调整: scalarfield的预计算(浮点值) 使用std::map避免最终列表中重复的顶点 顶点存储以在Ogre3D中可视化最终网格 基本上我修改了他80%的代码。我的网格有一些丑陋的地形,我不知道如何避免它们。我假设对标量字段使用浮点可以完成这项工作。这是一种常见的效果吗?你怎么能避免呢 计算边上的顶点位置。(cell.val[p1]包含给定顶点的标量值): //如果此边上有交点 如果(cell.i

我正在实现一个marching cubes算法,该算法通常基于的实现,并进行了一些重大调整:

  • scalarfield的预计算(浮点值)
  • 使用std::map避免最终列表中重复的顶点
  • 顶点存储以在Ogre3D中可视化最终网格
基本上我修改了他80%的代码。我的网格有一些丑陋的地形,我不知道如何避免它们。我假设对标量字段使用浮点可以完成这项工作。这是一种常见的效果吗?你怎么能避免呢

计算边上的顶点位置。(cell.val[p1]包含给定顶点的标量值):

//如果此边上有交点

如果(cell.iEdgeFlags&(1如Andy Newmann所说,魔鬼在于线性插值。正确的是:

float offset;
float delta = cell.val[p2] - cell.val[p1];

if (delta == 0) offset = 0.5;
else offset = (mTargetValue - cell.val[p1]) / delta;

asEdgeVertex[iEdge] = cell.p[p1] + offset* (cell.p[p2] - cell.p[p1]);

正如Andy Newmann所说,魔鬼在于线性插值。正确的是:

float offset;
float delta = cell.val[p2] - cell.val[p1];

if (delta == 0) offset = 0.5;
else offset = (mTargetValue - cell.val[p1]) / delta;

asEdgeVertex[iEdge] = cell.p[p1] + offset* (cell.p[p2] - cell.p[p1]);

它当然可以变得平滑,但是你能不能把它缩小到几行代码,让你得到一个你不同意的像素位置,而不是一个屏幕截图?要帮你调试一个屏幕截图真的很难…我编辑了这个问题。因为不需要任何额外的平滑算法就可以使它平滑,所以我想我有一个bug顶点位置的计算。是否在上下文中使用原始比较来渲染相同的场景进行比较?如果是,请发布屏幕截图。我猜缓存的顶点位置选择错误,或者沿立方体边缘的插值基于错误的值。您的方法看起来是合理的。请检查是否正确你的线性插值实际上工作正常,并检查它所插值的值是否与你期望的值相符。这是真的吗?我假设它是场强的等值面,但场的方程是什么?长度是否应该=v[p1]/(v[p2]-v[p1])?不是+?它当然可以变得平滑,但你能把它缩小到几行代码,让你得到一个你不同意的像素位置,而不是一个屏幕截图吗?要帮你调试一个屏幕截图真的很难……我编辑了这个问题。因为不需要任何额外的平滑算法就可以使它平滑,我想我已经做到了计算顶点位置时出现错误。是否在上下文中使用原始比较来渲染同一场景进行比较?如果是,请发布屏幕截图。我猜缓存的顶点位置选择错误,或者沿立方体边缘的插值基于错误的值。您的方法看起来正常。Ch检查你的线性插值是否工作正常,并检查它所插值的值是否符合你的预期。这是真的吗?我假设它是场强的等值面,但场强的方程是什么?长度是否应该=v[p1]/(v[p2]-v[p1])?不是+?它当然可以变得平滑,但你能把它缩小到几行代码,让你得到一个你不同意的像素位置,而不是一个屏幕截图吗?要帮你调试一个屏幕截图真的很难……我编辑了这个问题。因为不需要任何额外的平滑算法就可以使它平滑,我想我已经做到了计算顶点位置时出现错误。是否在上下文中使用原始比较来渲染同一场景进行比较?如果是,请发布屏幕截图。我猜缓存的顶点位置选择错误,或者沿立方体边缘的插值基于错误的值。您的方法看起来正常。Ch检查你的线性插值是否工作正常,并检查它所插值的值是否符合你的预期。这是真的吗?我假设它是场强的等值面,但场的方程是什么?长度是否应该=v[p1]/(v[p2]-v[p1])?而不是+?