问题标签 [mesh]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1090 浏览

c++ - 如何在 DirectX9 中暂停/停止网格动画?

DirectX 9 是否具有停止或暂停当前正在运行的网格动画的功能?我需要一个关于该功能如何工作的示例。

0 投票
1 回答
154 浏览

performance - 科学计算中网格数据的内存布局

我正在开发一个有限元系统。像往常一样,模拟由一组网格节点组成,每个节点都有一组属性(浮点),例如随时间演变的几个材料属性、坐标或物理量。

您可以采用两种极端方法:

  • 属性方面:为每个属性维护一个数组:

    double* x, *y, *z, *e_field, *b_field, *conductivity;

  • 入口方式:维护一个数组,其中每个数组都是 struct

    struct { double x, y, z, e_field, b_field, conductivity; } *meshnodedata;

在这些之间,可以混合使用,例如仅对坐标 x、y、z 应用第二种方法,而对其余属性使用第一种方法。您的模拟为每个网格节点维护的属性越多,混合的可能性就越大。

一方面,我有一个经典问题,就程序性能和代码可维护性而言,这些方法(及其组合)中的哪一种最适合科学计算。另一方面,我想知道如何以使不同方法之间的迁移变得容易的方式来实现代码。此外,它甚至可能是在程序不同部分的不同内存布局之间迁移的解决方案。

言归正传:

  • 您对这些不同的方法有何经验?
  • 这些差异有多大?
  • 您是否获得了在这两种布局之间迁移的经验?
0 投票
1 回答
491 浏览

graphics - 如何从一组面中检测边缘循环

给定一组来自​​单个网格的选定面(仅限三角形),我们如何检测以下内容:a)选定面创建的边缘循环。b) 基于它们所在的边缘循环对面进行快速分组。

This method is required for doing face extrusion when more than one face is selected and you want to extrude multiple regions but using average normals as direction instead of extruding individual faces.

0 投票
5 回答
30211 浏览

3d - 程序生成球体网格

我正在寻找一种生成球体网格的 3d 坐标的算法(在伪代码中),如下所示:

替代文字

水平和横向切片的数量应该是可配置的

0 投票
3 回答
380 浏览

graphics - 在浏览器中显示 Maya Mesh XML

我在 Maya 中创建了一个网格文件(XML 格式)。我想在浏览器中显示它,并为用户提供一些额外的选项,比如旋转放大和缩小。

最好和最简单的方法应该是什么?(SilverLight、HTML5/JS/Canvas、Flesh)

我真的很想尝试 HTML5/Canvas - 有没有知道如何做的库?

谢谢。

0 投票
2 回答
1737 浏览

algorithm - 标记三角形网格边缘的算法

介绍

作为较大程序(与渲染体积图形相关)的一部分,我有一个小但棘手的子问题,其中需要以特定方式标记任意(但有限)三角形 2D 网格。不久前,我写了一个解决方案(见下文),这对于我当时的测试网格来说已经足够好了,尽管我意识到这种方法可能不适用于人们能想到的每一个可能的网格。现在我终于遇到了一个网格,目前的解决方案根本不能很好地执行它——看起来我应该想出一种完全不同的方法。不幸的是,我似乎无法重新调整我的思路,这就是为什么我想在这里问的原因。

问题

考虑下面的图片。(颜色不是问题的一部分;我只是添加它们以改善(?)可视化。此外,变化的边缘宽度是完全不相关的伪影。)

对于每个三角形(例如,橙色 ABC 和绿色 ABD),三个边中的每一个都需要被赋予两个标签之一,例如“0”或“1”。只有两个要求:

  1. 并非三角形的所有边都可以具有相同的标签。换句话说,对于每个三角形,必须有两个“0”和一个“1”,或者两个“1”和一个“0”。
  2. 如果一条边由两个三角形共享,则两者的标签必须相同。换句话说,如果图片中的边 AB 为三角形 ABC 标记为“0”,那么它也必须为 ABD 标记为“0”。

网格是真正的 2D 网格,它是有限的:即,它不包裹,并且具有明确定义的外边界。显然,在边界上满足要求很容易——但在内部就变得更加困难。

直觉上,看起来至少应该存在一种解决方案,即使我无法证明这一点。(通常有几个——任何一个都足够了。)

当前解决方案

我目前的解决方案是一个非常强力的解决方案(此处提供只是为了完整性——请随意跳过本节):

  • 维护四组三角形——每个可能计数 (0..3) 的剩余边要标记一组。一开始,每个三角形都在其中三个边需要标记的集合中。
  • 只要存在带有未标记边的三角形:
    找到仍然存在三角形的最小非零数量的未分配边。换句话说:在任何给定时间,我们都尽量减少已部分完成标记的三角形的数量。剩余的边数将在 1 到 3 之间。然后,只需选择一个这样的三角形,其中剩余的特定边数要分配。对于此三角形,请执行以下操作:
    • 看看是否有任何剩余边的标签已经被其他三角形的标签强加了。如果是这样,请按照上述要求 #2 所暗示的方式分配标签。
    • 如果这导致了死胡同(即,对于当前三角形,要求#1 不能再满足),那么从头开始整个过程​​。
    • 按如下方式分配任何剩余边:
      • 如果到目前为止还没有标记边缘,则随机分配第一个。
      • 当一个边缘已经分配时,分配第二个边缘,使其具有相反的标签。
      • 当分配两条边时:如果它们具有相同的标签,则分配第三条具有相反的标签(显然);如果两者有不同的标签,则随机分配第三个。
    • 为不同数量的未分配边更新三角形集。
  • 如果我们到达这里,那么我们有一个解决方案——万岁!

通常这种方法只需要几次迭代就可以找到解决方案,但最近我遇到了一个网格,该算法仅在重试一两千次后才会终止......这显然表明可能存在它永远不会终止的网格.


现在,我希望有一个确定性算法,可以保证总能找到解决方案。计算复杂度不是那么大的问题,因为网格不是很大,并且标记基本上只需要在加载新网格时完成,这不会一直发生 - 所以具有(例如)指数的算法复杂性应该没问题,只要它有效。(当然:效率越高越好。)

谢谢你读到这里。现在,任何帮助将不胜感激!



编辑:基于建议解决方案的结果

不幸的是,我无法让Dialecticus 建议的方法起作用。也许我没弄对……不管怎样,考虑下面的网格,起点用绿点表示: 让我们放大一点…… 现在,让我们开始算法。第一步之后,标签看起来像这样(红色=“星号路径”,蓝色=“环形路径”): 到目前为止一切都很好。第二步之后: 第三 步: ……第四 步: 但是现在我们有问题了!让我们再做一轮 - 但请注意以洋红色绘制的三角形: 根据我目前的实现,洋红色三角形的所有边都在环形路径上,所以它们应该是蓝色的——这实际上是一个反例。现在也许我弄错了……但无论如何,最接近起始节点的两条边显然不能是红色的;如果第三个被标记为红色,那么该解决方案似乎不再适合这个想法。

顺便说一句,这是使用的数据。每行代表一条边,列解释如下:

  1. 第一个节点的索引
  2. 第二个节点的索引
  3. 第一个节点的x坐标
  4. 第一个节点的y坐标
  5. 第二个节点的x坐标
  6. 第二个节点的y坐标

起始节点是索引为 1 的节点。


我想接下来我应该尝试Rafał Dowgird 建议的方法......但也许我应该在一段时间内做一些完全不同的事情:)

0 投票
3 回答
2696 浏览

graphics - 解析 .ply 文件而不发生内存泄漏

我在斯坦福 3D 扫描存储库中下载了 .ply 文件,并使用该页面中的斯坦福代码(ply.h、plyfile.c)来解析它们。但是,查看这段代码,我发现其中充斥着从未释放的 malloc。我可以闭上眼睛看另一边,但它让我的牙齿发痒。

我可以想到两种解决方法:

一种是使用 Hans Boehm 的垃圾收集器或类似的东西,它重新定义了“malloc”,以便它在垃圾收集器中这样做。我从来没有使用过这个库,但也许有一种方法可以让它只在斯坦福代码中的 malloc 上运行,而不是在其他任何地方。

另一种解决方法是使用不同的解析器,最好是具有良好 RAII 化内存管理的 C++ 解析器。我在上面的链接中看到了一些替代的解析器和转换器,但我不想花一两天时间尝试所有这些,而是​​希望在这里得到推荐。

任何人都可以推荐一种在没有内存泄漏的情况下解析 .ply 文件的方法,或者通过在斯坦福解析器中包含内存泄漏,或者使用不同的解析器,或者通过我没有想到的第三种方法?

0 投票
3 回答
1188 浏览

java - 从 3d 数组中获取边界信息

嘿,我目前正在尝试从 3d 数组中提取信息,其中每个条目代表一个坐标,以便从中绘制一些东西。问题是数组非常大(并且有几个),这意味着我实际上无法绘制所有这些。

我想要完成的只是绘制外部坐标的表示,如果您愿意,可以绘制数组的外壳。该数组不完整,可能有大的空白空间,只设置了几个像素,或者有大的像素数据簇组合在一起。我不知道期待什么样的形状(可能是一个简单的立方体,或者一个复杂的凹面网格),并且正在努力想出一种算法来有效地提取边界。该数组有效地将一组点存储在 3d 空间中。

我想创建 6 个 2d 网格(3d 阵列的每一侧一个),并为每个位置获取他们可以找到的最浅点,然后分别绘制它们。然而,正如我所说,这个 3d 形状可能是凹形的,这会给这种方法带来问题。想象一个顶部有一个圆圈的圆锥体(所说的圆圈比圆锥体的底部大)。虽然顶部和侧面的网格会从形状中获得正确的深度信息,但底部的网格会通过垂直线将底座连接到圆形,让我有效地松开圆锥形。

然后我想逐个切片分析数组,并从切片数据创建 2 个网格。我相信这应该适用于任何类型的形状,但是我正在努力寻找一种算法,它可以准确地为我提供每个切片的边界信息。再一次,如果你只是尝试从切片创建高度图,如果它们有任何凹面,你会遇到问题。我也通过了某种边缘跟踪算法,但是数组不提供连续的数据,而且几乎可以肯定每个切片都没有连续的边缘。

我尝试研究用于医学成像等的体积渲染,因为它处理与我所拥有的类似的问题,但实际上找不到任何我可以使用的东西。

如果有人对此类问题有任何经验或任何有价值的意见,请您指出正确的方向。

PS 我更喜欢得到一个封闭的外壳表示,因此我早期的 2d 网格方法。然而,一种简单地给我外壳点的方法,它们之间没有任何联系,这仍然会非常有帮助。

谢谢你,泽

0 投票
2 回答
679 浏览

c++ - Ogre3D 自定义地图

我不知道该怎么做,但我需要一些帮助。我想为游戏(建筑物、地面、桥梁等)制作自定义“地图”,然后将其加载到 Ogre3D 中。最好的方法是什么?

0 投票
1 回答
174 浏览

3d - 建模由曲面交叉点定义的 3d 单元格

我正在尝试创建由任意曲面的交集定义的单元格的交互式 3d 表示。我很难弄清楚如何从中创建网格(或者有什么比我应该瞄准的网格更好的东西来表示 3d 体积?)。每个表面 s 由平面、球体、圆柱体、圆锥体等的解析表达式给出,因为 s = f(x,y,z) = 0,例如这里的那些:

在此处输入图像描述

对于每个单元格,我都有一个表面列表和每个表面的 +/- 意义。有了这个,很容易确定一个 x,y,z 点是否位于单元格内,方法是将该点插入每个边界表面的方程中,如果结果是所有 + 表面的 + 和 - 所有 - 表面的点位于里面。显然,如果任何表面的结果为零,则该点位于该表面上。

我可以测试数千个网格点,为每个单元格记下位于该单元格内的那些点,然后使用这些点的最外层为该单元格创建一个网格。但是,我有数千个细胞,这根本不够快。与其他单元格相比,许多单元格非常小或纵横比低,所以如果我要这样做,我需要一个非常精细的点网格。

任何人都可以提出一种有效的方法将这种方式定义的单元格放入静态 3d 模型中吗?是否有任何类型的库可以与这种几何规范一起使用,可以为我构建 3d 网格?我错过了一些明显的东西吗?

谢谢,尼克