首页 > 解决方案 > 使用对象 ID 的光线投射不起作用:threeJS

问题描述

我正在尝试通过光线投射为模型的不同部分分配不同的标准材质,并使用其对象 ID 作为参考。但是,当我尝试为同一模型的不同 id 应用多个材质时,所有对象都显示相同的材质。无法区分ID。

相同的代码如下。

var intersects = raycaster.intersectObjects(scene.children, true);
if (intersects.length > 0) {

  for (var i = 0; i < intersects.length; i++) {
    if (intersects[i].object.id) {

      intersects[i].object.material = material1; /* standrad material */
      intersects[i].object.material.needsUpdate = true;
    }
  }

    /* I'm using the buttons to change the materials */

    $('.btn1').click(function() {
      for (var i = 0; i < intersects.length; i++) {
        intersects[i].object.material = material2;
        intersects[i].object.material.needsUpdate = true;
      }
    });

    $('.btn2').click(function() {
      for (var i = 0; i < intersects.length; i++) {
        intersects[i].object.material = material3;
        intersects[i].object.material.needsUpdate = true;
      }
    });
  }

标签: javascriptthree.jsraycasting

解决方案


这是构造这样的东西的一种方法:

function materialSwitchingTest(renderer,camera){

    var mouseVec = new THREE.Vector3();
    var mouse2D = new THREE.Vector3();
    var rawMouse2D = new THREE.Vector3();
    var intersections = []

    /* I'm using the buttons to change the materials */
    $('.btn1').click(function() {
        if(intersections.length>0) intersections[0].object.material = material1
    });

    $('.btn2').click(function() {
        if(intersections.length>0) intersections[0].object.material = material2
    });

    window.onmousedown=(e)=>{
        if(event.target !== renderer.domElement.parentElement)return
        var mx = event.layerX;
        var my = event.layerY;
        rawMouse2D.set(mx, my, 0);
        mouse2D.x = (mx / renderer.domElement.width) * 2 - 1;
        mouse2D.y = -(my / renderer.domElement.height) * 2 + 1;
        raycaster.setFromCamera(mouse2D,camera)
intersects = raycaster.intersectObjects(scene.children, true);
    }
}


materialSwitchingTest( yourRenderer, yourCamera )


推荐阅读