我需要一个Python模块/包,它提供了一个网格,我可以在其上做计算科学吗?我不是在做图形,所以我认为搅拌机包不是我想要的.
有谁知道一个好的包裹?
使用Meshlab将纹理图像映射到裸3D网格顶部的最简单方法是什么?在哪里尚未指定UV纹理坐标?
我有一个模型的".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) 我正在创建一个带有THREE.Geometry实例的网格,然后动态填充几何体vertices和faces数组.迭代地细化几何体,在每次迭代时添加额外的顶点和面.如果在将网格物体添加到场景之前优化几何体,则会正确渲染.但是,如果我将网格物体添加到场景并渲染它,然后修改它,则只显示初始N面朝向第一个渲染所包含的几何体.对这些面使用的顶点位置的更改将受到尊重,但只会渲染那些N面.
几何实例被标记dynamic = true了,我设置verticesNeedUpdate,elementsNeedUpdate并buffersNeedUpdate修改几何后各一次.我也试过设置所有其他'脏'标志,虽然我只希望设置这三个(即便如此,我不确定我应该需要buffersNeedUpdate).
据我所知,几何体geometryGroup和geometryGroupList属性是从第一次渲染网格时存在的面构建和填充的,但是没有被重建以包含随后添加的面.
我究竟做错了什么?
我正在尝试使用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) 我试图让网格法线和灯在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) 在过去的几周里,我一直致力于一种算法,该算法可以找到复杂网格的隐藏曲面并将其移除.这些隐藏的表面完全被遮挡,永远不会被看到.由于我正在使用的网格的性质,有大量这些隐藏的三角形.在某些情况下,隐藏表面比可见表面更多.由于手动删除它们对于较大的网格来说是禁止的,我希望用软件自动执行此操作.
我目前的算法包括:
但是,这种算法引起了很多悲痛.这是非常不一致的.虽然算法没有发现一些"遮挡"的面部被遮挡,但我更担心由于当前实现的问题而被移除的非常明显的面部.因此,我想知道两件事,主要是:
注意:这是一个对象空间算法.也就是说,可以从任何角度看 - 而不是固定的相机.
我在3D空间中有一组点(其中100万,可能更多,如10或1亿)形成一个球体(它们填充球体 - 它们不仅仅在表面上)我希望建立将每个球体连接到其第一个邻居的四面体...寻找四面体化,到目前为止,我发现的只有:
我怎样才能做到这一点?
2014-08-09首先,感谢大家的建议!我是 - 现在仍然是 - 在假期,只是路过来检查是否有人回答......我并没有失望!!!! :-)我想我会首先尝试CGAL,并会从那里看到.我在O(n2)的同一组点上进行了其他数据计算,我预计它将持续大约1周,所以几个小时就不会那么糟糕.分钟将是梦想成真!
我正在尝试使用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库中的大量更改,这最近发生了很多).或者也许我忘了什么.事实是顶点似乎是空的..?
提前致谢!
我正在尝试用代表锥束 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 …