简体   繁体   English

Three.js删除后选择对象

[英]Three.js pick object after remove

Picking and objects code is one of the most popular: 拾取和对象代码是最受欢迎的代码之一:

function Picking(event) {
var raycaster = new THREE.Raycaster();
event.preventDefault();
mouse.x = (event.clientX / renderer.domElement.clientWidth) * 2 - 1;
mouse.y = -(event.clientY / renderer.domElement.clientHeight) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(objects);
if (intersects.length > 0) {
    if (INTERSECTED != intersects[0].object) {

    }
} else {
     INTERSECTED = null;
}
}

The description: in scene are two objects - cube and sphere. 描述:场景中有两个对象-立方体和球体。 Sphere is first to camera and cube is second. 球面是第一位的,相机是第二位的。 The Sphere has ID1 and cube ID2. 球体具有ID1和多维数据集ID2。 Picking is working. 采摘工作。

The problem: after deleting the sphere (scene.remove(sphere)); 问题:删除球体后(scene.remove(sphere)); Picking is giving the ID1, so, it seems like sphere is invisible. 拾取为ID1提供了空间,因此似乎看不见球体。 What is the problam? 什么是problam? The picture of the example: Picture 示例图片图片

This code is not giving the result: 这段代码没有给出结果:

for (i = sphere.children.length - 1; i >= 0 ; i--) {
       object = sphere.children[i];
       object.geometry.remove;
       object.material.remove;
       object.geometry.dispose();
       object.material.dispose();
       scene.remove(object);
       sphere.remove(object);
   }

or 要么

recur(sphere);
    for (var i in objects) {
        objects[i].geometry.remove;
        objects[i].material.remove;
        objects[i].geometry.dispose();
        objects[i].material.dispose();
        scene.remove(objects[i]);
        sphere.remove(objects[i]);
    }

function recur(obj) {
  if (obj instanceof THREE.Mesh) {
    objects.push(obj);
  }

  for (var i in obj.children) {
    recur(obj.children[i]);
  }
}

The code that add objects: 添加对象的代码:

var ObjLoader = new THREE.ObjectLoader();
var ii;
var group = new THREE.Object3D();
var oldModel = scene.getObjectByName('group');
if (oldModel !== undefined) { scene.remove(oldModel); }

      ObjLoader.load("path/model.json", addModelToScene);
      group.name = "group";
      scene.add(group);


function addModelToScene(model) {
     recur(model);
    for (var i in objects) {
        objects[i].castShadow = true;
        objects[i].receiveShadow = true;
    }
    model.name = "ModelName";
    group.add(model)
 }

So, The .json model consists of some objects (1..n); 因此,.json模型由一些对象(1..n)组成; This .json model is added into group. 该.json模型已添加到组中。 With picking the side of the cube (may be material) is selectable, but not removable. 通过拾取,可以选择立方体的侧面(可能是材料),但不能移动。 but the position can be changed. 但是位置可以更改。

Thank you. 谢谢。

Change your picking logic a little, store all your objects into array when creating them: 稍微更改选择逻辑,在创建对象时将所有对象存储到数组中:

 /*var objects = [];
  var  group = new THREE.Object3D();
 create your mesh add to array*/
 objects.push(MyMesh);
 /*now we have a reference all the time in objects[0] , objects[1]*/
 objects[0].displose();   check syntax been a while*/

customMaterial = new THREE.ShaderMaterial( 
{
    uniforms: customUniforms,
    vertexShader: document.getElementById( 'vertexShader' ).textContent,
    fragmentShader: document.getElementById( 'fragmentShader' ).textContent,
    //wireframe: true,
    side: THREE.FrontSide 

}   );


function ground (){

var map = new THREE.PlaneGeometry(1024,1024, 128, 128);//Use planebufferGeo

map.dynamic = true;

_terrain = new THREE.Mesh(  map, customMaterial );

_terrain.material.needsUpdate = true;

_terrain.geometry.dynamic = true;

_terrain.geometry.vertexColors = true; 

_terrain.material.uvsNeedUpdate = true;

_terrain.geometry.normalsNeedUpdate = true;

_terrain.rotation.x = -Math.PI / 2;

objects.push(_terrain);

scene.add(_terrain );
}

So I used this in a situation where it was a picking game type, I used an array to store the mesh and i could manipulate the vertices / faces etc edit the array to make changes. 因此,在用于挑选游戏类型的情况下使用了此方法,我使用了一个数组来存储网格,并且可以操纵顶点/面等编辑该数组进行更改。 It was an easier way to compare things and check data. 这是比较事物和检查数据的简便方法。

function animate() {

var raycaster = new THREE.Raycaster();

raycaster.setFromCamera(mouse, camera);

var intersects = raycaster.intersectObjects(objects);

if ( intersects.length > 0 ) {
    var faceIndex = intersects[0].faceIndex;
    var obj = intersects[0].object;
    var geom = obj.geometry;
     //etc      

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM