【问题标题】:raycaster in threejs only selects a single part of my gltf model at a timethreejs 中的 raycaster 一次只选择我的 gltf 模型的一个部分
【发布时间】:2020-09-18 06:19:10
【问题描述】:

您好,我对 three.js 完全陌生,因此感谢您提供任何帮助。

我有一个 gltf 模型,其中许多部件构成一个模型。我想选择整个模型,但是当我使用 raycaster 选择模型时,我选择的是那些单独的部分。

示例:假设我有一个立方体,当我将鼠标悬停在它上面时,一次只能选择一个面。

以下是我的代码...感谢任何帮助

    var raycaster = new Raycaster();

    loader.load("Purplelogo/Purplelogo.gltf", ( gltf ) => {

    scene.add( gltf.scene );

    gltf.scene.position.set(2,-0.9,1);
    gltf.scene.scale.set(0.9,0.9,0.9);
    gltf.scene.rotation.set(2,2,5);

  });

  raycaster.setFromCamera( mouse, camera );

  var intersects2 = raycaster.intersectObjects( scene2.children, true );

  for ( var i = 0; i < intersects2.length; i++ ) {

    intersects2[ i ].object.rotateX(3)

  }

【问题讨论】:

    标签: javascript three.js raycasting


    【解决方案1】:

    您需要以某种方式找到文件的根目录。您可以通过 1000 种不同的方式做到这一点。

    这是一个

    let obj = intersects2[ i ].object;
    
    // walk up until you get to the root of the gltf file
    while (obj !== gltf.scene && obj.parent) {
      obj = obj.parent;
    }
    
    if (obj === gltf.scene) {
      // it's the root of the scene
    

    还有一个

    // at load time
    const allMeshesInGLTF = new Set();
    gltf.scene.traverse(node => {
      if (node.isMesh) {
        allMeshesInGLTF.add(node);
      }
    });
    
    
    // then at pick time
    let obj = intersects2[ i ].object;
    if (allMeshesInGLTF.has(obj)) {
      // an object in the scene picked, use gltf.scene
    

    还有一个

    // at load time
    gltf.scene.traverse(node => {
      if (node.isMesh) {
        node.gltf = gltf;
      }
    });
    
    // at pick time
    let obj = intersects2[ i ].object;
    if (obj.gltf) {
      // use obj.gltf.scene
    
    

    等等……

    【讨论】:

      猜你喜欢
      • 2020-01-08
      • 2019-11-19
      • 2015-04-24
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 2017-06-19
      相关资源
      最近更新 更多