标签: mesh

关于 BSpline 的问题

这是一个包含 3D 点簇的数据文件。现在我们可以从中形成一个BSpline表面。

dat=Import["C:\\Users\\Andy\\Desktop\\Foil.mat"];
surface=BSplineFunction[dat];
ParametricPlot3D[surface[x,y], {x, 0, 1}, {y, 0, 1},
                MaxRecursion->4,Axes->None,Mesh->All,Boxed->False]
Run Code Online (Sandbox Code Playgroud)

现在我们可以看到结构了。但问题是我想制作一个 3D 实体,而这个结构实际上有两个可见的孔。

在此处输入图片说明

在下一张图片中,我们可以看到两个角落都是开放的,结构不是实心的而是空心的。

在此处输入图片说明

所以我想出了一个解决方案,我确信它可以在视觉上工作,但不会返回一个坚实的结构。

pic=Show[Graphics3D[
       {Polygon[Table[surface[0,y],{y,0,1,0.005}]],
        Polygon[Table[surface[1,y],{y,0,1,.005}]]}],
        ParametricPlot3D[surface[x,y],{x,0,1},{y,0,1},
           MaxRecursion-> 4,PlotPoints-> 20,
           Mesh-> All],Boxed->False,Axes-> None];
Run Code Online (Sandbox Code Playgroud)

GraphicsGrid[ {{ParametricPlot3D[surface[x,y],{x,0,1},{y,0,1}, PlotPoints-> 20,Mesh-> All,Boxed->False,Axes-> None], Graphics3D[{Polygon[Table[surface[0,y],{y,0,1,0.005}]],Polygon[Table[surface[1,y],{y,0,1,.005}]]} ], 图片}}]

这是输出。 在此处输入图片说明

现在我们将孔在视觉上闭合的第三张图片导出为 *.obj 文件。我们可以在任何基于 CAD 的网格编辑器(如Meshlab )中导入该文件。在那里可以看到要检测的孔。

在此处输入图片说明

现在有一种简单的方法可以让我们在 Mathematica 中使用Foil.mat文件中的给定数据点形成实体结构。我希望BSpline函数中可能有一些选项可以实现这一点。正如人们所料,我想要一个没有孔的封闭表面。

希望我已经能够足够明确地解释我的问题。将等待您的回复。

BR

geometry wolfram-mathematica mesh cad

5
推荐指数
1
解决办法
368
查看次数

在python中创建二维网格

我对编程真的很陌生......

但这是我的问题:

我不能发布图像,但我希望有一个“皇冠”(两个同心圆,半径为 a 我的意思是,从数学上讲真的很容易定义,但我怎样才能用 python 程序做到这一点?

我想到了这样的事情:

def Fm1(X, Y):
    r =r = sqrt(1.*X**2+1.*Y**2)
    cos = 1.*X/r
    sin = 1.*Y/r
    teta = where( sin >= 0. , arccos(cos) , -arccos(cos) )
    teta = where(r == 0. , 0., teta)
    return r, teta


def F(r,teta):                                                                  
    X = r*cos(teta)                                                             
    Y = r*sin(teta)                                                             
    return X,Y
Run Code Online (Sandbox Code Playgroud)

这些只是让您从笛卡尔坐标传递到极坐标的函数,然后:

r=sy.linspace(a,b,N+1) # radius division
t=sy.linspace(0,2.*pi,2**NN) #angle (theta) division
R,T=meshgrid(r,t) #creating a mesh

X,Y = F(R,T)#transform from polar to cartesian

#Plotting :
fig=plt.figure()
ax=fig.add_subplot(111)                                 
ax.plot(X, Y)
plt.show() …
Run Code Online (Sandbox Code Playgroud)

python grid mesh matplotlib

5
推荐指数
1
解决办法
8410
查看次数

OpenMesh 随机访问

我认为 OpenMesh 将支持随机访问面边缘顶点。我能找到的只有迭代器和循环器:

for( auto v : mesh->vertices() ) 
    mesh->point(v).data();
Run Code Online (Sandbox Code Playgroud)

我怎么能做这样的事情:

mesh->vertices(42);
Run Code Online (Sandbox Code Playgroud)

mesh vertex indices openmesh

5
推荐指数
1
解决办法
916
查看次数

网格:“排序/重新排序”数组引用另一个的共享条目以提高缓存效率

给定一个顶点数组: {v1, v2, v3, v4, v5, ..., vN}

和 K 个多边形用块来索引它,对于示例 4 边多边形*: {v7, v2, v51, v16}

请注意,两个或多个多边形可能共享同一个顶点。事实上,大多数顶点将由 4-6 个多边形共享(四边形网格的价数为 4,三角形网格的价数为 6)。

...我们如何有效地重新排序/排序顶点数据,例如在读取给定多边形的顶点时减少缓存未命中?我对一种在合理时间内完成的算法感兴趣,而不仅仅是提供最佳结果的算法。在这里,即使是一些粗略的启发式方法也比完全任意的顺序要好。

理想的情况是将 {v1052, v507213, v63252, v3} 之类的东西变成更像:{v70, v71, v72, v73} 的东西。由于顶点共享的数量,如果没有一些异常值,这个理想通常是无法实现的。

成熟的解决方案当然是受欢迎的,但我更感兴趣的是算法系列的名称,这些算法涉及这种在运行时重新组织用户数据以提高缓存效率的事情。我想这样的算法一定存在,尤其是在网格的有效 VBO 表示领域,但我未能提出适当的搜索标准。这还会被称为“排序”吗?

我可以看到可能有两类方法可以解决这个问题:一种实际上处理遍历网格邻居,这将非常特定于网格表示,另一种简单地查看一组数组索引或指向的一般访问模式到另一个条目。后者作为一种更通用的解决方案对我更有吸引力,即使它可能不那么有效。

更新:

正如建议的那样,我尝试只编写一些建议的启发式方法,而不是在算法上对它们进行过多推测。它为我提供了一些粗略的基础,并帮助我更好地了解问题的性质,但不幸的是结果不佳。我将这个问题标记为 C 和 C++,因为我对算法研究建议和这些语言中可能的片段更感兴趣,而不是提供我自己的实现,但这里是我在 C++ 中的比较:

#define _SECURE_SCL 0
#include <iostream>
#include <vector>
#include <cmath>
#include <cassert>
#include <algorithm>
#include <deque>

using namespace std;

static const float pi_f = 3.14159265358979323846f;
enum {poly_size = 3};

class Alloc
{
public:
    Alloc(): head(0)
    {
    } …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm performance mesh

5
推荐指数
1
解决办法
191
查看次数

Libgdx meshbuilder手动创建3d对象

我正在使用 Libgdx (Java) 并尝试构建 3D 模型。目前,我可以使用已定义的方法(例如modelBuilder.createBox()或 )创建模型modelBuilder.createSphere()。但是,我想使用自定义网格(根据一些基本数学计算顶点)构建自己的球体,然后细分以增加面数。例如,从二十面体开始,然后进一步细分以增加面数。我必须手动执行此操作,因为似乎没有任何更简单的方法可以执行此操作。我想这样做是因为以后想分别针对这些人脸来为所说的人脸应用独特的颜色/纹理。

在此处输入图片说明

我想如果有人帮我制作一个自定义/手动立方体,我可能会解决其余的问题。

我的环境已经设置好了,我目前可以使用预定义的方法构建一个球体:

public class ManagerSphere {

    //Settings
    public String ASSET_TEXTURE_BOX = "data/libgdx.png";
    public float SPHERE_RADIUS = 2f;

    //init
    private GameScreen _gameRef;
    private ModelBuilder modelBuilder = new ModelBuilder();
    private Texture tex;
    private Material mat;
    private ModelInstance boxInstance;
    public AssetManager assets;

    public ManagerSphere(GameScreen gameRef) {
        this._gameRef = gameRef;
        createSphere();
    }


    public void createSphere() {
        this.tex = new Texture("spheretexture02.jpg"); 
        this.mat = new Material(TextureAttribute.createDiffuse(this.tex));

        Model tempSphere;
        tempSphere = modelBuilder.createSphere(SPHERE_RADIUS*2, …
Run Code Online (Sandbox Code Playgroud)

java 3d mesh libgdx

5
推荐指数
0
解决办法
3258
查看次数

Python:在三角形网格中插值

是否有任何体面的 Pythonic 方法可以在三角形网格中进行插值,还是我需要自己实现?也就是说,给定一个我们称之为 P 的 (X,Y) 点和一个网格(在 (X,Y) 处的顶点,其值为 Z,形成三角面),估计 P 处的值。所以这意味着首先找到包含点的面,然后进行插值 - 理想情况下是更高阶的插值,而不仅仅是“在面的顶点之间线性”(即,考虑到相邻的面)?

我可以自己实现它,但是如果 Python 中已经有可用的东西......

(我检查了 scipy.interpolate,但它的“网格”似乎只是常规点网格。这不是网格,它是真正的 2D 网格;顶点可以位于任何地方。)

python interpolation mesh

5
推荐指数
1
解决办法
2857
查看次数

了解 Qt3D 创建的网格

我创建了一个像这样的 Qt3D 网格:

Qt3DCore::QEntity *newEntity = new Qt3DCore::QEntity();
Qt3DExtras::QConeMesh *mesh =new Qt3DExtras::QConeMesh();
mesh->setTopRadius(0.2);
mesh->setBottomRadius(1.0);
mesh->setLength(2.0);
for(int i = 0; i < mesh->geometry()->attributes().size(); ++i) {
    mesh->geometry()->attributes().at(i)->buffer()->setSyncData(true); // To have access to data
}
newEntity->addComponent(mesh);
Run Code Online (Sandbox Code Playgroud)

创建的网格如下所示:

锥网 锥形网格,另一种观点


在代码的后面,我尝试以STL 二进制格式导出上述网。为此,我提取了实体的几何变换组件:

Qt3DCore::QComponent *compoMesh = nullptr; // place holder for mesh geometry of entity
Qt3DCore::QComponent *compoTran = nullptr; // place holder for mesh transformation of entity
QVector<Qt3DCore::QComponent *> compos = newEntity->components();
for(int i = 0; i < compos.size(); …
Run Code Online (Sandbox Code Playgroud)

qt mesh qt3d stl-format

5
推荐指数
1
解决办法
1564
查看次数

基于距离的顶点加点(网格几何)

我有一个THREE.Geometry在我的场景,其中包含超过5000个顶点。我想要做的是将包含几何体的网格的3个顶点添加THREE.Points到场景中。我想实现以下目标:

在此处输入图片说明

我将现有几何图形的第一个面的3个顶点添加到我的新几何图形的顶点中,该新几何图形应包含3个顶点。我用THREE.PointsTHREE.PointsMaterial,但我已经尝试了同样的事情THREE.LineSegments,并THREE.LineBasicMaterial和结果是一样的。(除了不是点,而是有线)。

var vertices = [
  mesh.geometry.faces[0].a,
  mesh.geometry.faces[0].b,
  mesh.geometry.faces[0].c
];


vertices.forEach( function(vId,i){
  vertices[i].index = i;
  vertices[i] = mesh.geometry.vertices[vId].clone();
  vertices[i].l2w = mesh.localToWorld(vertices[i].clone());
  vertices[i].id = vId;
  vertices[i].distance = vertices[i].l2w.distanceTo(camera.position);

})


var plane_geom = new THREE.Geometry();
plane_geom.vertices.push(vertices[0]);
plane_geom.vertices.push(vertices[1]);
plane_geom.vertices.push(vertices[2]);


plane_geom.verticesNeedUpdate = true;
plane_geom.elementsNeedUpdate = true;
plane_geom.computeVertexNormals();


var pointsMaterial2 = new THREE.PointsMaterial({
  size: 2,
  color: "red"
});

var plane_mesh =  new THREE.Points( plane_geom, pointsMaterial2 );
 scene.add( plane_mesh ); …
Run Code Online (Sandbox Code Playgroud)

javascript geometry mesh three.js

5
推荐指数
1
解决办法
155
查看次数

在 Godot 中的球体表面生成国家形状的几何图形

我目前正在 Godot 中开发一个游戏,该游戏涉及渲染地球上的国家/地区。我之前对 Godot 的经验很少,但过去曾尝试过。

我将来自 Natural Earth 的这些数据用于国家边界,并成功地使用线网格将其显示在地球上。数据最初是 shapefile 格式,但我使用mapshaper.org将其转换为 GeoJSON 。

图片

数据基本上归结为以纬度和经度给出的点列表,然后我将其转换为 3d 点并使用 SurfaceTool 创建网格。

但是,我无法为网格生成实际表面。首先,我无法找到一个内置函数来根据这些数据生成三角形网格。我研究了许多解决方案,包括使用内置的 Mesh.PRIMITIVE_TRIANGLE_FAN 格式,该格式不适用于凹面形状。

我研究了三角剖分算法,例如 delaunay 三角剖分,但在实现它们方面收效甚微。

我目前的计划是使用二维数据(x,y = 经度,纬度)生成一个三角形网格,并将其投影到球体表面。为了产生曲面,我将在网格中包含球体本身的顶点(示例)。

我想知道如何根据这些数据构建三角形网格。本质上,我需要一个可以做以下事情的算法:

  1. 从凹多边形(国家边界)创建三角形网格
  2. 将网格连接到此多边形内的一系列点
  3. 允许多边形内的孔(用于湖泊等)

是我正在寻找的结果示例。

再说一次,我对戈多很陌生,我可能把事情复杂化了。如果有更简单的方法来渲染地球上的国家/地区,请告诉我。

这是我当前的代码:

extends Node

export var radius = 1
export var path = "res://data/countries.json"

func coords(uv):
    return (uv - Vector2(0.5, 0.5)) * 360

func uv(coords):
    return (coords / 360) + Vector2(0.5, 0.5)

func sphere(coords, r):
    var angles = coords / …
Run Code Online (Sandbox Code Playgroud)

geography mesh triangulation godot

5
推荐指数
1
解决办法
395
查看次数

计算三角形 3D 网格的质心

我正在尝试计算 3D 三角形网格的质心。

编辑:事实证明我不是,我试图计算重心,这是不一样的

我的代码由点点滴滴组成,主要是:

我将我的结果与 Rhino 提供的结果进行了比较。我计算质心和体积:

  • 使用 Rhino 7 的参考 NURBS 体积
  • 使用 Rhino 7 的 27k 三角形网格
  • 使用 Rhino 7 的简化 1k 三角形网格
  • 与我的代码相同的 1k 三角形网格。

在此处输入图片说明

如您所见,计算体积效果很好,但不适用于质心,我似乎不知道为什么。我需要误差小于 0.01。我检查了好几次,但肯定有一些明显的东西。

我不太擅长数值不稳定:

  • 我应该以毫米而不是米为单位工作吗?
  • 我是否应该按照第二个参考文献中 galinette 的建议,用另一个点而不是原点来计算四面体有符号体积?我试过了,并没有太大改善。

我的代码

在计算任何东西之前,我检查我的网格是否正确(未提供代码):

  • 封闭的网格,没有裸露的边缘或任何孔洞;
  • 所有三角形的顶点都是一致的,即三角形正确地朝向网格的外部。
using HelixToolkit.Wpf;
using System.Collections.Generic;
using System.Windows.Media.Media3D;

internal static class CentroidHelper
{
    public static Point3D Centroid(this List<MeshGeometry3D> meshes, out double volume)
    {
        Vector3D centroid = new Vector3D();
        volume = 0;

        foreach (var mesh in …
Run Code Online (Sandbox Code Playgroud)

c# math 3d mesh

5
推荐指数
1
解决办法
586
查看次数