标签: mesh

Python中计算科学的网格生成

我需要一个Python模块/包,它提供了一个网格,我可以在其上做计算科学吗?我不是在做图形,所以我认为搅拌机包不是我想要的.

有谁知道一个好的包裹?

python math mesh computational-geometry

8
推荐指数
2
解决办法
1万
查看次数

使用Meshlab进行纹理映射

使用Meshlab将纹理图像映射到裸3D网格顶部的最简单方法是什么?在哪里尚未指定UV纹理坐标?

graphics mesh meshlab

8
推荐指数
1
解决办法
2万
查看次数

通过OBJMTLLoader加载对象的三个.js多个材质

我有一个模型的".obj"和".mtl"文件,我正在加载它OBJMTLLoader.".mtl"指定要应用于模型的纹理,并且three.js加载模型并使用应用的纹理渲染它就好了.

但这就是事情.

一旦加载了一个对象,我想在其上应用另一个纹理.这是因为第一纹理表示对象的表面材质.第二个纹理是一个绘图,我想定位在模型上的特定位置.

我的问题是:如何将第二个纹理应用到已加载(和纹理化)的对象上

我看到three.js创建了一个实例THREE.Object3D,并且该实例具有带有一个实例的"children"数组THREE.Mesh.

当我尝试将纹理应用于该网格(mesh.material.map = texture)时,我失去了初始纹理.

我查看了关于应用多个纹理和JSONLoader但没有找到答案的问题.

我也尝试过使用new THREE.MeshFaceMaterial( materials )(如本答案所示),但没有成功.

更新:

我试过@WestLangley建议使用多材质对象,但仍然无法在另一个上面渲染一个材质.

我做了这个简单的演示,改编自three.js OBJLoader - http://dl.dropboxusercontent.com/u/822184/webgl_multiple_texture/index.html

THREE.SceneUtils.createMultiMaterialObject按照建议使用它,传递克隆从.obj加载的主网格的几何体.我也给它2个纹理 - 一个用于整个表面,另一个用于模型的前表面.

但这不起作用.我添加了2个复选框,用于切换相应材料的"可见"属性.你可以看到材料存在,但我看不到第二个下面的第一个.

加载/渲染的关键如下:

var texture = THREE.ImageUtils.loadTexture('fabric.jpg');
var texture2 = THREE.ImageUtils.loadTexture('table.jpg');

texture2.offset.set(-0.65, -2.5);
texture2.repeat.set(4, 4);

var loader = new THREE.OBJLoader();
loader.addEventListener( 'load', function ( event ) {

  var mainMesh = event.content.children[0].children[0];

  multiMaterialObject = THREE.SceneUtils.createMultiMaterialObject( 
    mainMesh.geometry.clone(), [
      new THREE.MeshLambertMaterial({ map: texture2 …
Run Code Online (Sandbox Code Playgroud)

javascript textures mesh three.js

8
推荐指数
1
解决办法
2万
查看次数

渲染后将几何体添加到three.js网格中

我正在创建一个带有THREE.Geometry实例的网格,然后动态填充几何体verticesfaces数组.迭代地细化几何体,在每次迭代时添加额外的顶点和面.如果在将网格物体添加到场景之前优化几何体,则会正确渲染.但是,如果我将网格物体添加到场景并渲染它,然后修改它,则只显示初始N面朝向第一个渲染所包含的几何体.对这些面使用的顶点位置的更改将受到尊重,但只会渲染那些N面.

几何实例被标记dynamic = true了,我设置verticesNeedUpdate,elementsNeedUpdatebuffersNeedUpdate修改几何后各一次.我也试过设置所有其他'脏'标志,虽然我只希望设置这三个(即便如此,我不确定我应该需要buffersNeedUpdate).

据我所知,几何体geometryGroupgeometryGroupList属性是从第一次渲染网格时存在的面构建和填充的,但是没有被重建以包含随后添加的面.

我究竟做错了什么?

geometry mesh dynamic three.js

8
推荐指数
1
解决办法
6602
查看次数

如果网格大于120个三角形,则Matlab会正确停止在网格上插入颜色

我正在尝试使用trimesh函数在Matlab中绘制一个大网格,顶点的z坐标控制颜色.不幸的是,当网格的大小超过120个三角形时,Matlab会停止正确插值颜色.这是一张展示问题的图片,左边是120个三角形,右边是121个三角形.

一张图片展示了这个问题

如您所见,对于大网格,Matlab直接从一个顶点的颜色插值到另一个顶点的颜色.这可能是出于性能原因而做的,但我正在尝试为我的论文生成漂亮的图片,而我并不关心计算它们需要多长时间.有没有办法禁用这种近似值?

这是生成图片的代码:

function test(n)
    %%% Generate a mesh with n triangles.

    oneTriVerts = [0 0 0;
                   1 0 0;
                   1 0 1];

    offset = [0 (1/n) 0;
              0 (1/n) 0;
              0 (1/n) 0];

    verts = zeros(0,3);
    tris  = zeros(0,3);
    for i = 0:(n-1)
        verts = [verts; (oneTriVerts + i * offset)];
        tris = [tris; i*3+1, i*3+2, i*3+3];
    end

    %%% Draw the mesh, with color corresponding to the z coordinate.

    trimesh(tris, verts(:,1), verts(:,2), verts(:,3), verts(:,3));
    title(sprintf('n = %d', …
Run Code Online (Sandbox Code Playgroud)

3d matlab plot mesh

8
推荐指数
1
解决办法
1223
查看次数

LibGDX网格高度图法线和灯光

我试图让网格法线和灯在LibGDX项目中工作.

我已经有从高度贴图纹理像素生成的纹理网格.

问题是我无法正常点亮法线.此外,我不是100%确定我在TerrainChunk类中正确设置了正常顶点.

继承主类代码:

package com.me.terrain;

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix3;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Vector3;

public class Terra extends Game {

private PerspectiveCamera camera;
private CameraInputController camController;

private TerrainChunk chunk;
private Mesh mesh;

private ShaderProgram shader;
private Texture terrainTexture;

private final Matrix3 normalMatrix = new Matrix3();

private static final float[] lightPosition = { 5, 35, 5 …
Run Code Online (Sandbox Code Playgroud)

java shader mesh normals libgdx

8
推荐指数
1
解决办法
4437
查看次数

检测并删除网格的隐藏曲面

在过去的几周里,我一直致力于一种算法,该算法可以找到复杂网格的隐藏曲面并将其移除.这些隐藏的表面完全被遮挡,永远不会被看到.由于我正在使用的网格的性质,有大量这些隐藏的三角形.在某些情况下,隐藏表面比可见表面更多.由于手动删除它们对于较大的网格来说是禁止的,我希望用软件自动执行此操作.

我目前的算法包括:

  1. 在三角形的表面上生成多个点.
  2. 对于每个点,生成与三角形法线对齐的半球采样器.
  3. 将光线投射到半球中.
  4. 如果未被遮挡的光线少于一定数量,我将三角形标记为删除.

但是,这种算法引起了很多悲痛.这是非常不一致的.虽然算法没有发现一些"遮挡"的面部被遮挡,但我更担心由于当前实现的问题而被移除的非常明显的面部.因此,我想知道两件事,主要是:

  1. 有没有比光线追踪更好的方法来查找和删除这些隐藏的表面?
  2. 我应该调查非随机光线生成吗?我目前正在余弦加权半球中生成随机方向,这可能会导致问题.我没有调查过的唯一原因是因为我还没有找到一种算法来在半球中生成均匀间隔的光线.

注意:这是一个对象空间算法.也就是说,可以从任何角度看 - 而不是固定的相机.

c++ algorithm optimization raytracing mesh

8
推荐指数
1
解决办法
1352
查看次数

构建一组随机点的四面体 - 四面体化

我在3D空间中有一组点(其中100万,可能更多,如10或1亿)形成一个球体(它们填充球体 - 它们不仅仅在表面上)我希望建立将每个球体连接到其第一个邻居的四面体...寻找四面体化,到目前为止,我发现的只有:

  • 用于网格化的算法,但据我所知,它们填充空白空间,而我的点是固定的.
  • 用于表面观察的算法,这是非常无关紧要的
  • 用于3D图像观察的算法(在医学领域,大多数情况下):更接近但不完全诀窍.

我怎样才能做到这一点?

2014-08-09首先,感谢大家的建议!我是 - 现在仍然是 - 在假期,只是路过来检查是否有人回答......我并没有失望!!!! :-)我想我会首先尝试CGAL,并会从那里看到.我在O(n2)的同一组点上进行了其他数据计算,我预计它将持续大约1周,所以几个小时就不会那么糟糕.分钟将是梦想成真!

c++ algorithm mesh computational-geometry tetrahedra

8
推荐指数
1
解决办法
1955
查看次数

如何在STL加载的BufferGeometry中平滑网格三角形

我正在尝试使用Three.js加载一些STL文件.模型正确加载,但有太多的三角形我想合并/平滑.

我已经成功地在其他3D格式中应用了平滑的加载地形,但是我无法使用通过使用STLLoader加载STL文件而导致的BufferGeometry.

在此输入图像描述 _

var material = new THREE.MeshLambertMaterial( { ... } );
var path = "./models/budah.stl";
var loader = new THREE.STLLoader();
loader.load( path, function ( object ) {
                object.computeBoundingBox();
                object.computeBoundingSphere();
                object.computeFaceNormals();
                object.computeVertexNormals();
                object.normalizeNormals();
                object.center();

                // Apply smooth
                var modifier = new THREE.SubdivisionModifier( 1);
                var smooth = smooth = object.clone();
                smooth.mergeVertices();
                smooth.computeFaceNormals();
                smooth.computeVertexNormals();
                modifier.modify( smooth );
                scene.add( smooth );
});
Run Code Online (Sandbox Code Playgroud)

这是我试过的,它会抛出一个错误:Uncaught TypeError:smooth.mergeVertices不是一个函数

如果我评论"mergeVertices()"行,我得到的是一个不同的错误:Uncaught TypeError:无法读取 SubdivisionsModifier第156行中未定义的属性'length'.

似乎我尝试的示例代码已经过时(由于Three.JS库中的大量更改,这最近发生了很多).或者也许我忘了什么.事实是顶点似乎是空的..?

提前致谢!

geometry stl smooth mesh three.js

7
推荐指数
1
解决办法
4165
查看次数

努力使用 Python 中的 Open3D 从点云数据创建无懈可击的网格

我正在尝试用代表锥束 CT 图像的器官轮廓数据的点云创建一个防水网格。我的目标是获取两个网格并计算它们两个之间的相交体积。

我尝试过使用此处显示的每种方法

泊松重建

point_cloud = np.genfromtxt('ct_prostate_contour_data.csv', delimiter=',')
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud)
pcd.compute_convex_hull()
pcd.estimate_normals()
pcd.orient_normals_consistent_tangent_plane(10)

mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=10, width=0, scale=20, linear_fit=True)[0]
mesh.compute_vertex_normals()
mesh.paint_uniform_color([0.5, 0.5, 0.5])
mesh.remove_degenerate_triangles()
o3d.visualization.draw_geometries([pcd, mesh], mesh_show_back_face=True)
Run Code Online (Sandbox Code Playgroud)

虽然这个方法在我看来似乎会产生一个水密网格,但 mesh.is_watertight() 的结果是 False,但是对于膀胱数据它返回 True。此外,该算法将网格扩展到数据垂直限制的上方和下方。虽然这并不是一个破坏交易的问题,但如果有一种方法可以最大限度地减少它,那就太好了。

泊松网格图像 泊松网格图像

球旋转

point_cloud = np.genfromtxt('ct_prostate_contour_data.csv', delimiter=',')
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud)
pcd.compute_convex_hull()
pcd.estimate_normals()
pcd.orient_normals_consistent_tangent_plane(30)

distances = pcd.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radii = [0.1*avg_dist, 0.5*avg_dist, 1*avg_dist, 2*avg_dist] 
r = o3d.utility.DoubleVector(radii)
rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, r)
o3d.visualization.draw_geometries([pcd, rec_mesh], mesh_show_back_face=True)
Run Code Online (Sandbox Code Playgroud)

如果我能够填充孔,这将是我的首选方法,因为它只是连接顶点而无需插值。也许如果我能够使其进入仅剩下的孔很大的状态,我可以将该网格转换为 Pyvista 兼容的网格并使用 Pymeshfix …

python mesh point-clouds open3d

7
推荐指数
1
解决办法
3318
查看次数