Python OpenGL中的面上水平曲线

Python OpenGL中的面上水平曲线,python,opengl,graphics,3d,pyopengl,Python,Opengl,Graphics,3d,Pyopengl,我在三角形网格上定义了一个函数f,也就是说,对于每个顶点,我都有一个关联的数字。例如,f可以是网格上的测地距离,即f(x)=d(a,x),从特定的固定点a计算网格中的每个点。 显然,很容易在曲面上“绘制”此函数,只需规范化f的值并将其映射到网格节点上的颜色即可 但是如果我想在曲面上绘制等值线(也称为等值线)怎么办? 我该怎么办?这似乎不容易通过简单地如上所述着色网格来实现。特别是由于网格可能具有具有少量顶点的稀疏区域(即大面)。这建议(也许)我应该直接计算网格上的三维曲线,并使用例如GL线。但计

我在三角形网格上定义了一个函数f,也就是说,对于每个顶点,我都有一个关联的数字。例如,f可以是网格上的测地距离,即f(x)=d(a,x),从特定的固定点a计算网格中的每个点。 显然,很容易在曲面上“绘制”此函数,只需规范化f的值并将其映射到网格节点上的颜色即可

但是如果我想在曲面上绘制等值线(也称为等值线)怎么办?

我该怎么办?这似乎不容易通过简单地如上所述着色网格来实现。特别是由于网格可能具有具有少量顶点的稀疏区域(即大面)。这建议(也许)我应该直接计算网格上的三维曲线,并使用例如GL线。但计算等线曲线并不明显,因为简单的方法是固定一组目标值,然后我必须检查每个三角形是否通过插值在三角形上的某个点达到目标,这似乎并不理想。有人能告诉我解决这个问题的资源吗


作为参考,我使用的是python OpenGL。

如果值是
float
,并且您知道它的范围,您可以尝试使用上面的片段着色器所描述的颜色,该着色器只渲染非常接近渲染值的片段

最简单的方法是使用单个渲染过程,在片段中使用类似以下内容:

float x;
x = (value/10.0)+0.5; // 10 is distance of value you want the lines to render
x = x-floor(x);   // x = value mod distance
if (abs(x-0.5)>0.001) discard; // do not render fragments too far from your line
代码只是决定您是否非常接近每一个距离=值的10,并丢弃任何不接近的片段。但是,直线/曲线的厚度可能会因值密度和三角形大小分布而异。必须正确设置常量(
distance=10,threshold=0.001
)才能执行此操作

这是使用非常类似的技术,除了丢弃,因为那里的东西是连续的

更精确的选择是在2遍渲染中使用相同的原则。在第一个过程中将值作为颜色渲染到某个纹理中。然后在第二秒内,对每个片段扫描周围的纹理,找到可渲染值的最近位置,然后根据到它的距离进行渲染或不渲染。这提供了准确的线厚度,无论什么。但为此,该值必须包含特定的可渲染值。这可能会有所帮助,因为它还可以从各个方向扫描纹理(但目的不同)


如果以上这些都不适合您,那么我想到的唯一其他选择是几何方法,即根据与网格的值交点(如横截面与平面)从网格创建多段线.

如果该值为
float
,并且您知道其范围,则可以尝试使用上面的片段着色器所述的颜色,该着色只会渲染非常接近渲染值的片段

最简单的方法是使用单个渲染过程,在片段中使用类似以下内容:

float x;
x = (value/10.0)+0.5; // 10 is distance of value you want the lines to render
x = x-floor(x);   // x = value mod distance
if (abs(x-0.5)>0.001) discard; // do not render fragments too far from your line
代码只是决定您是否非常接近每一个距离=值的10,并丢弃任何不接近的片段。但是,直线/曲线的厚度可能会因值密度和三角形大小分布而异。必须正确设置常量(
distance=10,threshold=0.001
)才能执行此操作

这是使用非常类似的技术,除了丢弃,因为那里的东西是连续的

更精确的选择是在2遍渲染中使用相同的原则。在第一个过程中将值作为颜色渲染到某个纹理中。然后在第二秒内,对每个片段扫描周围的纹理,找到可渲染值的最近位置,然后根据到它的距离进行渲染或不渲染。这提供了准确的线厚度,无论什么。但为此,该值必须包含特定的可渲染值。这可能会有所帮助,因为它还可以从各个方向扫描纹理(但目的不同)


如果以上这些都不适合您,那么我想到的唯一其他选择是几何方法,即根据与网格的值相交(如与平面的横截面)从网格创建多段线。

假设您要绘制Z坐标为ci倍数的等高线(等值线)。
(对于“轮廓间隔”)。例如,对于
ci=5
有效值为25、30、35等。
一个三角形可以没有、一个或多个轮廓与之相交。我不需要线。我使用点,在片段着色器中检查每个片段

第一个目标是在片段着色器中获取片段的世界坐标。
片段着色器接收
gl_FragCoord
,该着色器在屏幕坐标中具有
{x,y,z}
。或者在顶点着色器中,可以通过
z
传递一个变量。阅读以了解如何进行此转换

现在,在世界坐标中有一个
z
,是时候判断它是否属于轮廓了:

float maxErr = 0.0001;
float dif = abs(z - (ci * floor(z/ci)));
if ( dif > maxErr )
    color = triangleColor;
else
    color = contourColor;

因为片段与像素不同,所以可能会得到一条非等宽线。

假设您要绘制Z坐标为ci的倍数的等高线(等值线)(用于“等高线间隔”)。例如,
ci=5
的有效值为25、30、35等。
一个三角形可以没有、一个或多个轮廓与之相交。我不需要线。我使用点,在片段着色器中检查每个片段

第一个目标是在片段着色器中获取片段的世界坐标。
片段着色器接收
gl_FragCoord
,该着色器在屏幕坐标中具有
{x,y,z}
。或者在顶点着色器中,可以通过
z
传递一个变量。阅读以了解如何进行此转换

现在,在世界坐标中有一个
z
,是时候判断它是否属于轮廓了:

float maxErr = 0.0001;
float dif = abs(z - (ci * floor(z/ci)));
if ( dif > maxErr )
    color = triangleColor;
else
    color = contourColor;
因为一个片段和你看到的像素不一样