J'Blog

threejs实现载入模型

threejs实现载入模型

加载器

‌Three.js‌提供了多种加载器,这些加载器可以帮助开发者加载不同类型的3D资源。以下是一些常用的Three.js加载器:

‌TextureLoader‌:用于加载图片,可以返回一个纹理对象Texture。通过TextureLoader的.load()方法加载一张图片,可以创建一个纹理对象,该对象可以用于设置材质的颜色贴图属性,从而实现纹理贴图的应用‌。

‌CubeTextureLoader‌:用于加载立方体纹理,即环境贴图。通过加载6张图片(每个面一张),返回一个立方体纹理对象CubeTexture。这种纹理通常用于模拟真实世界中的环境光照射效果‌。

‌GLTFLoader‌:用于加载glTF格式的3D模型。glTF是一种流行的3D场景和模型格式,被广泛用于现代Web和移动应用中。GLTFLoader支持加载.glb和.gltf格式的文件‌。

‌DRACoLoader‌:用于加载压缩的3D模型数据,特别是针对Draco压缩算法的数据。Draco是一种高效的几何压缩算法,用于减少3D模型的数据大小,同时保持高质量的几何信息‌。

‌FBXLoader‌、‌OBJLoader‌、‌TDSLoader‌、‌ThreeMFLoader‌、‌AMFLoader‌、‌GCodeLoader‌、‌KMZLoader‌、‌PCDLoader‌、‌PLYLoader‌等:这些加载器用于加载不同格式的3D模型文件,如FBX、OBJ、TDS、ThreeMF、AMF、GCode、KMZ、PCD和PLY等。这些加载器提供了对各种3D模型格式的支持,使得开发者能够轻松地将不同的3D模型集成到Three.js项目中‌。

获取模型对应的结构

加载器返回的对象树中存在children字段,包含物体各个结构,可以通过getObjectByName获取到对应结构对象。

核心代码

function onProgress(xhr) {
    if (xhr.lengthComputable) {
        const percentComplete = xhr.loaded / xhr.total * 100;
        console.log(Math.round(percentComplete, 2) + '% downloaded');
    }
}

const loader = new MMDLoader();
const modelFile = '/assets/mmd.pmd';

let mmdMesh;
loader.load(modelFile, function (object) {
    mmdMesh = object;
    scene.add(mmdMesh);

    // 获取头部
    const head = mmdMesh.getObjectByName("首");

    // 创建一个Timeline对象,用于管理动画序列
    const tl = gsap.timeline({ repeat: -1, yoyo: true }); // 设置动画无限循环且往返播放

    // 设置动画从0到1
    tl.to(mmdMesh.morphTargetInfluences, { duration: 1, 8: 1, 15: 1, delay: 1 }); // 针对对象修改属性值。

    // 设置动画从1回到0
    tl.to(mmdMesh.morphTargetInfluences, { duration: 1, 8: 0, 15: 0 }); 

    window.addEventListener("mousemove", (e) => {
        let x = (e.clientX / window.innerWidth) * 2 - 1;
        let y = (e.clientY / window.innerHeight) * 2 - 1;
	// x,y保证在-1至1的区间

        let timeline = gsap.timeline()
        timeline.to(head.rotation, 0.5, {
            duration: 0.5,
            x: y,
            y: x,
            duration: 1
        })
    })
}, onProgress, null);