Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Raycast未检测到GlTF文件/Three.js_Javascript_Three.js - Fatal编程技术网

Javascript Raycast未检测到GlTF文件/Three.js

Javascript Raycast未检测到GlTF文件/Three.js,javascript,three.js,Javascript,Three.js,我的二进制gltf文件(在blender中建模,并使用mixamo设置动画)在raycast上未检测到。 我阅读了大量关于它的教程和问题,试图修复它,但它从来都不起作用:( 它没有错误,如果我将console.log scene.children放在'if(intersects){}'之外并单击窗口,它将工作并包含它应该包含的所有内容,但是如果我将它放在'if'内并单击3d对象,它将是空数组 我也尝试了。将网格推到新数组中并检测,但没有成功 请提供帮助!问题是您正在对蒙皮网格执行光线投射。而th

我的二进制gltf文件(在blender中建模,并使用mixamo设置动画)在raycast上未检测到。 我阅读了大量关于它的教程和问题,试图修复它,但它从来都不起作用:(

它没有错误,如果我将console.log scene.children放在'if(intersects){}'之外并单击窗口,它将工作并包含它应该包含的所有内容,但是如果我将它放在'if'内并单击3d对象,它将是空数组

我也尝试了。将网格推到新数组中并检测,但没有成功


请提供帮助!

问题是您正在对蒙皮网格执行光线投射。而
three.js
当前(
r128
)无法为此类3D对象计算适当的边界体积。但是,边界体积对于光线投射非常重要,因为它们用于检测早期出射

此问题的解决方法是手动定义边界体积,以便它们正确包围蒙皮网格。我建议您遍历
gltf.scene
,并设置蒙皮网格几何体的
boundingSphere
boundingBox
属性


更多信息请访问GitHub:

您在哪里添加
model=gltf.scene;
到您的scenemixer=new THREE.AnimationMixer(model);let idleAnim=THREE.AnimationClip.findByName(fileAnimations,“idle”);idleAnim.tracks.splice(3,3);idleAnim.tracks.splice(9,3);let idle=mixer.clipacation(idleAnim);idle.play();model.position.y=-4.5;model.scale.set(2.1,2.1,2.1);scene.add(model);});我在签名动画后添加到场景中你能将raycaster和鼠标的
const
更改为
let
,然后再试一次吗,只是一个疯狂的想法不起作用:()但是谢谢你
const loader = new GLTFLoader();
let modelLoader = "/models/c2.glb";
let model, mixer, neck, waist;

loader.load(modelLoader, (gltf) => {
  model = gltf.scene;
  let fileAnimations = gltf.animations;
  model.traverse((o) => {
    // console.log(o);
    if (o.isBone && o.name === "mixamorigNeck") {
      neck = o;
    }
    if (o.isBone && o.name === "mixamorigSpine") {
      waist = o;
    }
    if (o.isMesh) {
      o.material.reflectivity = 1;
    }
  });

 document.addEventListener("click", (e) => raycast(e));
  document.addEventListener("touchend", (e) => raycast(e, true));

  function raycast(e, touch = false) {
    const raycaster = new THREE.Raycaster();
    const mouse = new THREE.Vector2();
    e.preventDefault();

    if (touch) {
      mouse.x = 2 * (e.changedTouches[0].clientX / window.innerWidth) - 1;
      mouse.y = 1 - 2 * (e.changedTouches[0].clientY / window.innerHeight);
    } else {
      mouse.x = (e.clientX / window.innerWidth) * 2 - 1;
      mouse.y = -(e.clientY / window.innerHeight) * 2 + 1;
    }

    raycaster.setFromCamera(mouse, camera);

    const intersects = raycaster.intersectObjects(scene.children, true);
    console.log(scene.children);
    if (intersects.length > 0) {
      console.log("hi");}}