Lju*_*Lju 5 javascript geometry mesh three.js
我有一个THREE.Geometry在我的场景,其中包含超过5000个顶点。我想要做的是仅将包含几何体的网格的3个顶点添加THREE.Points到场景中。我想实现以下目标:
我将现有几何图形的第一个面的3个顶点添加到我的新几何图形的顶点中,该新几何图形应包含3个顶点。我用THREE.Points和THREE.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 );
mesh.geometry.dispose();
mesh.material.dispose();
scene.remove( mesh);
Run Code Online (Sandbox Code Playgroud)
我的初始几何是全局定义的,是加载的STL对象的几何,类型是THREE.Geometry。具有此几何形状的网格将在init函数中添加到场景中。几何对象如下所示:
__directGeometry: Object { vertices: (30006) […], normals: (30006) […],
colors: (30006) […], … }
__bufferGeometry: Object { uuid: "10EE834D-B19E-4C27-B831-F484D908DB06",
name: "", type: "BufferGeometry", … }
_listeners: Object { dispose: (1) […] }
boundingBox: Object { min: {…}, max: {…} }
boundingSphere: Object { center: {…}, radius: 135.73491999459804 }
colors: Array []
colorsNeedUpdate: false
elementsNeedUpdate: false
faceVertexUvs: Array [ [] ]
faces: Array(10002) [ {…}, {…}, {…}, … ]
groupsNeedUpdate: false
id: 2
lineDistances: Array []
lineDistancesNeedUpdate: false
morphNormals: Array []
morphTargets: Array []
name: ""
normalsNeedUpdate: false
skinIndices: Array []
skinWeights: Array []
type: "Geometry"
uuid: "0EB01FF3-E9BF-4CAD-AA97-5EC2933F0D9C"
uvsNeedUpdate: false
vertices: Array(5003) [ {…}, {…}, {…}, … ]
verticesNeedUpdate: false
Run Code Online (Sandbox Code Playgroud)
将plane_mesh具有新几何的新网格添加到场景后,将显示几何的所有点(在每个顶点上)(超过5,000个点)。但是,如果从场景中放置初始网格,则只能看到3个点。当打印出plane_mesh所有内容似乎正常并且网格仅包含3个顶点时...经过反复试验,我意识到所有操作都是在初始网格上执行的。仅在处置网格之后,才plane_mesh添加到场景。
任何帮助将不胜感激!
您可以为三角形创建一次几何图形,然后通过从原始几何图形复制它们来更改其顶点的值。这只是一个概念(r108):
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(0, 0, 10);
var renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var geom = new THREE.PlaneBufferGeometry(10, 10, 4, 4);
var mat = new THREE.MeshBasicMaterial({
color: "aqua",
wireframe: true
});
var mesh = new THREE.Mesh(geom, mat);
scene.add(mesh);
var pointsGeom = new THREE.BufferGeometry().setFromPoints([
new THREE.Vector3(),
new THREE.Vector3(),
new THREE.Vector3()
]);
var pointsMat = new THREE.PointsMaterial({
size: 1,
color: "red"
});
var points = new THREE.Points(pointsGeom, pointsMat);
scene.add(points);
setInterval(() => {
let faces = geom.index.count / 3;
let face = THREE.Math.randInt(0, faces - 1);
setTriangle(face);
}, 1000);
var v3 = new THREE.Vector3(); // temp vector
function setTriangle(face) {
for (let i = 0; i < 3; i++) {
v3.fromBufferAttribute(geom.attributes.position, geom.index.getX(face * 3 + i));
pointsGeom.attributes.position.setXYZ(i, v3.x, v3.y, v3.z);
}
pointsGeom.attributes.position.needsUpdate = true;
}
renderer.setAnimationLoop(() => {
renderer.render(scene, camera)
});Run Code Online (Sandbox Code Playgroud)
body {
overflow: hidden;
margin: 0;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://threejs.org/build/three.min.js"></script>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |