我的二进制gltf文件(在blender中建模,并使用mixamo制作动画)在raycast上检测不到。我读了一大堆关于它的教程和问题,试图解决它,但它根本不起作用:(
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");}}
它没有错误,如果我在‘if ( console.log ){}’之外相交并点击窗口,它就能正常工作并包含它应该包含的所有东西,但如果我把它放在‘if’里面并点击3d对象,它就是一个空数组。
我也试着检测新数组中的网格,但.push不起作用。
请帮帮我!
发布于 2021-05-11 09:11:02
问题是您正在对蒙皮网格执行光线投射。并且three.js
当前(r128
)不能为这种类型的3D对象计算适当的包围体。然而,边界体积对于光线投射很重要,因为它们用于检测早期输出。
此问题的解决方法是手动定义边界体积,以便它们正确地封闭蒙皮网格。我建议您遍历gltf.scene
并设置蒙皮网格几何体的boundingSphere
和boundingBox
属性。
有关GitHub的更多信息,请访问此处:https://github.com/mrdoob/three.js/pull/19178
https://stackoverflow.com/questions/67481120
复制