我正在寻找一种算法(或实现)来从封闭(即没有孔)3D 三角形网格创建四面体网格。
\n\n最好的解决方案是一个开源应用程序,它可以导入网格文件(例如 OBJ、STL 和 VTK)、显示它们并提供四面体化网格的选项。但我也很喜欢命令行工具,或者只是算法的概述。
\n\n一些背景 \xe2\x80\x94 我正在 Linux 系统上使用 Blender 来设计表面网格。最终我计划在 Python 或 MATLAB 中实现四面体化算法。
\n\n我在寻找好的网格划分器时已经偶然发现了一些应用程序名称,但到目前为止我还没有任何具体的结果。因此,非常欢迎任何有关相关论文、算法或实现的信息!
\n\n到目前为止发现的应用程序:
\n\n一些相关术语:
\n\n首先让我澄清一下..我不是在问 2D 网格,要确定 2D 网格的缠绕顺序,使用法向 z 方向非常容易。
其次,我不要求任何优化算法,我不担心时间或速度,我只想用我的网格来做。
当我使用贪婪投影三角剖分算法对 3D 对象进行三角剖分时,会发生此问题。检查所附图片。
如果我使用“计算有符号面积”或“三角形的 AB 和 BC 向量的交叉产生”对该模型应用 2D 方法,它只能求解 2D 网格,但 3D 网格又如何呢?
首先我们需要检查哪些三角形在 3D 网格中缠绕方向错误,然后我们只考虑这些三角形,那么问题是,我们如何检查哪些三角形在 3D 中缠绕方向错误?我们不能只用 2D 方法来做我已经测试过但没有成功。
例如,对于球体,我们不能对球体应用 2D 方法。那么有没有办法解决这个问题呢?
谢谢。

更新#1:
下面是检查哪条边具有相同缠绕的算法。效果不太好,我不知道为什么。理论上它应该纠正所有三角形,但它没有纠正。例如,在附图中检查球体的情况下。有问题。
void GLReversedEdge(int i, int j, GLFace *temp)
{
//i'th triangle
int V1 = temp[i].v1;
int V2 = temp[i].v2;
int V3 = temp[i].v3;
//i'th triangle edges
int E1[] ={V1, V2};
int E2[] ={V2, V3};
int E3[] ={V3, V1};
//adjacent triangle
int jV1 = temp[j].v1;
int jV2 …Run Code Online (Sandbox Code Playgroud) 我有一个.obj存储三角形网格的文件。我希望记录每个三角形面的颜色。有没有办法将这些信息保存到.obj文件中,以便像 MeshLab 这样的软件可以识别和可视化它?
我想用平面切割网格。尝试这个代码,但只得到切割网格的一部分。
public void SliceIt()
{
Vector3[] vertices = mesh.vertices;
Transform clone = clone = ((Transform)Instantiate(transform, transform.position + new Vector3(0, 0.25f, 0), transform.rotation));
Mesh meshSlice = clone.GetComponent<MeshFilter>().sharedMesh;
Vector3[] verticesSlice = meshSlice.vertices;
List<Vector3> verticesSlice2 = new List<Vector3>();
Mesh cutplanemesh = cutplane.GetComponent<MeshFilter>().sharedMesh;
Vector3[] cutplanevertices = cutplanemesh.vertices;
p1 = cutplane.TransformPoint(cutplanevertices[40]);
p2 = cutplane.TransformPoint(cutplanevertices[20]);
p3 = cutplane.TransformPoint(cutplanevertices[0]);
var myplane = new Plane(p1, p2, p3);
for (var i = 0; i < vertices.Length; i++)
{
var tmpverts = transform.TransformPoint(vertices[i]); // original object vertices
if …Run Code Online (Sandbox Code Playgroud) 我有一个vector<vector<int>>,其中包含我的地图(使用随机生成器创建的二维数组):

(来源:cjoint.com)
我想以 3D 方式显示这张地图(使用 Irrlicht 图形 3D 库)。大问题:我的地图太大(1920x1080),所以我无法在屏幕上显示 2073600 个小立方体。(我希望能够更改我的地图并使用良好的网格重新加载屏幕)
所以我的解决方案是创建一个立方体,并在上面写下我想要的所有像素(这是我的小油漆向您展示......)

(来源:cjoint.com)
所以...我知道如何在 C++ 中创建/写入/解析文件,现在我的问题是:我不太了解 3D 透视和 .obj 对象...
我正在通过维基百科和其他文档学习 OBJ 格式。
我想知道是否有比更改实时 .obj 对象更简单的解决方案...如果没有...我需要一些帮助来构思我的 obj...
我有一个 .ply 文件,其中包含彩色点云:
我需要将其转换为纹理网格。我可以创建一个空白网格:
过滤器 -> 点集 -> 曲面重建:泊松
但结果是白色的网格
似乎所有有关颜色的信息都丢失了。有什么建议吗?谢谢
当谈到 3D 动画时,有很多我不熟悉的术语和概念(也许附加到这个问题的第二个问题:有哪些好书可以熟悉这些概念?)。我不知道“UV”是什么(在 3D 渲染的上下文中),也不熟悉用于将图像上的像素映射到网格上的点的工具。
我有一个 360 度相机生成的以下图像(它实际上是 HTMLvideo元素的输出):
我希望该图像的中心是球体的“顶部”,并且该图像中圆的任何半径都是沿着球体从上到下的弧。
这是我的起点(直接从 Three.JS 文档复制代码行):
var video = document.getElementById( "texture-video" );
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
var texture = new THREE.VideoTexture( video );
texture.minFilter = THREE.LinearFilter;
texture.magFilter = THREE.LinearFilter;
texture.format = THREE.RGBFormat;
var material = new THREE.MeshBasicMaterial( { map: texture } );
var geometry …Run Code Online (Sandbox Code Playgroud) 我正在使用泊松曲面重建算法从点重建三角网格曲面。然而,泊松总是会生成一个无懈可击的表面,它通过插值填充所有孔。
对于一些由于数据丢失而导致的小孔,这种孔填充是可取的。但对于一些大孔,我不想填充孔,只希望表面保持开放。
上图展示了我的想法,左边是法线的点集,右边是重建的曲面。我希望该表面的顶部保持开放,而不是当前的水密结果。
谁能给我一些建议,如何在泊松曲面重建中保留这些大洞?或者有其他算法可以解决这个问题吗?
PS 根据这个问题的公认答案,我理解表面重建算法可以分为显式重建算法和隐式重建算法。泊松是隐式的,显式的自然可以处理大洞问题。但由于我拥有的点数据大多稀疏且嘈杂,因此我更喜欢像泊松这样的隐式数据。
我了解如何在 2d 点中使用 delaunay 三角剖分?
但是如何在 3d 点中使用 delaunay 三角剖分呢?
我的意思是我想生成表面三角形网格而不是四面体网格,那么如何使用 delaunay 三角剖分来生成 3d 表面网格?
请给我一些提示。
我正在尝试评估 TOSCA 数据集上的测地距离矩阵。例如以下 3d 网格 -

我尝试过使用两个 python 实现。
另一个是gdist包,不幸的是,它适用于他们提供的玩具示例,但不适用于我的网格,该网格只有 10,000 个面和 5000 个顶点。
使用 gdist 库时出现以下错误:
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
--------CODE SNIPPET----------
c = sio.loadmat('raw_data/TOSCA/cat0.mat')
c = c['surface'][0][0]
X = c[0]
Y = c[1]
Z = c[2]
TRIV = c[3].astype(np.int32)
vertices = np.array(zip(X, Y, Z)).astype(np.float64)
vertices = np.reshape(vertices, (vertices.shape[0], 3))
src = np.array([1], dtype=np.int32)
trg = np.array([2], dtype=np.int32)
np.random.shuffle(TRIV)
a = gdist.compute_gdist(vertices,TRIV[:5000], source_indices = src, …Run Code Online (Sandbox Code Playgroud)