这是一个包含 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
我对编程真的很陌生......
但这是我的问题:
我不能发布图像,但我希望有一个“皇冠”(两个同心圆,半径为 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) 我认为 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) 我有一个.obj存储三角形网格的文件。我希望记录每个三角形面的颜色。有没有办法将这些信息保存到.obj文件中,以便像 MeshLab 这样的软件可以识别和可视化它?
给定一个顶点数组: {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) 我正在使用 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) 我有一个vector<vector<int>>,其中包含我的地图(使用随机生成器创建的二维数组):

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

(来源:cjoint.com)
所以...我知道如何在 C++ 中创建/写入/解析文件,现在我的问题是:我不太了解 3D 透视和 .obj 对象...
我正在通过维基百科和其他文档学习 OBJ 格式。
我想知道是否有比更改实时 .obj 对象更简单的解决方案...如果没有...我需要一些帮助来构思我的 obj...
是否有任何体面的 Pythonic 方法可以在三角形网格中进行插值,还是我需要自己实现?也就是说,给定一个我们称之为 P 的 (X,Y) 点和一个网格(在 (X,Y) 处的顶点,其值为 Z,形成三角面),估计 P 处的值。所以这意味着首先找到包含点的面,然后进行插值 - 理想情况下是更高阶的插值,而不仅仅是“在面的顶点之间线性”(即,考虑到相邻的面)?
我可以自己实现它,但是如果 Python 中已经有可用的东西......
(我检查了 scipy.interpolate,但它的“网格”似乎只是常规点网格。这不是网格,它是真正的 2D 网格;顶点可以位于任何地方。)
当谈到 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) 我目前正在 Godot 中开发一个游戏,该游戏涉及渲染地球上的国家/地区。我之前对 Godot 的经验很少,但过去曾尝试过。
我将来自 Natural Earth 的这些数据用于国家边界,并成功地使用线网格将其显示在地球上。数据最初是 shapefile 格式,但我使用mapshaper.org将其转换为 GeoJSON 。
数据基本上归结为以纬度和经度给出的点列表,然后我将其转换为 3d 点并使用 SurfaceTool 创建网格。
但是,我无法为网格生成实际表面。首先,我无法找到一个内置函数来根据这些数据生成三角形网格。我研究了许多解决方案,包括使用内置的 Mesh.PRIMITIVE_TRIANGLE_FAN 格式,该格式不适用于凹面形状。
我研究了三角剖分算法,例如 delaunay 三角剖分,但在实现它们方面收效甚微。
我目前的计划是使用二维数据(x,y = 经度,纬度)生成一个三角形网格,并将其投影到球体表面。为了产生曲面,我将在网格中包含球体本身的顶点(示例)。
我想知道如何根据这些数据构建三角形网格。本质上,我需要一个可以做以下事情的算法:
这是我正在寻找的结果示例。
再说一次,我对戈多很陌生,我可能把事情复杂化了。如果有更简单的方法来渲染地球上的国家/地区,请告诉我。
这是我当前的代码:
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)