批量 obj文件转gltf文件

189 阅读1分钟

工作需要(将模型为obj多文件批量转为gltf文件)

原模型文件夹目录结构

|-- objFiles
    |-- 1#
    |   |-- 1F.mtl
    |   |-- 1F.obj
    |-- 2#
    |   |-- 1F.mtl
    |   |-- 1F.obj
    |-- 3#
    |   |-- 1F.mtl
    |   |-- 1F.obj

前提

将脚本文件和模型文件夹放在一同文件夹下

在同一文件夹下建立gltfFiles文件夹

|-- name
    |-- changeToGltf.js
    |-- gltfFiles
    |-- objFiles
npm i obj2gltf

注意点:

  1. 多层文件夹可以先在对应文件夹gltfFiles内建立对应楼层的文件夹(或者用mkdir()方法在遍历到文件夹时建立对应的文件夹目录
  2. 代码引用: 递归实现遍历文件夹中所有文件 代码引用

具体脚本代码

//导入
const obj2gltf = require("obj2gltf");
const fs = require("fs");

//获取当前目录路径
var path = require("path");

// 将obj转gltf 方法
function covert(path) {
  obj2gltf(path).then(function (gltf) {
    //console.log(path);
      
    //获取对应objFiles相同文件名
    let arr = path.split("\\");   // 输出 ['objFiles', '1#', '1F.obj']
    const data = Buffer.from(JSON.stringify(gltf));
    //因为是多层文件夹 取对应文件夹和文件名
    let name = `./gltfFiles/${arr[1]}/${arr[2].split('.')[0]}.gltf`;
    fs.writeFileSync(name, data);
  });
}

fileDisplay("./objFiles");

/**
 * 文件遍历方法
 * @param filePath 需要遍历的文件路径
 */
function fileDisplay(filePath) {
  //根据文件路径读取文件,返回文件列表
  fs.readdir(filePath, function (err, files) {
    if (err) {
      console.warn(err);
    } else {
      //遍历读取到的文件列表
      files.forEach(function (filename) {
        //获取当前文件的绝对路径
        var filedir = path.join(filePath, filename);
        //根据文件路径获取文件信息,返回一个fs.Stats对象
        fs.stat(filedir, function (eror, stats) {
          if (eror) {
            console.warn("获取文件stats失败");
          } else {
            var isFile = stats.isFile(); //是文件
            var isDir = stats.isDirectory(); //是文件夹
            if (isFile) {
              let arr = filedir.split(".");
              // 因为文件里包含了obj和mtl两种文件 所以进行判断
              if (arr[1] === "obj") {
                //调用方法
                covert(filedir);
              }
            }
            if (isDir) {
              fileDisplay(filedir); //递归,如果是文件夹,就继续遍历该文件夹下面的文件
            }
          }
        });
      });
    }
  });
}