030-ThreeJS 服务端(node.js)渲染2-加载obj文件

加载obj文件

关键步骤:

  let pingObj = await readFile("./module/ping.obj")
  let loaderObj = new THREE.OBJLoader()
  // 将字符串转化为数组
  let objStr = Uint8ArrayToString(Uint8Array.from(pingObj))
  let obj = loaderObj.parse(objStr)

完整代码:

const THREE = require("three");
const SoftwareRenderer = require("three-software-renderer");
const PNG = require("pngjs").PNG;
const fs = require("fs");
const MTLLoader = require('three-mtl-loader');
var OBJLoader = require('three-obj-loader');
OBJLoader(THREE);

const width = 1024;
const height = 768;

function readFile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, function (err, data) {
      if (err) {
        console.log(err);
        reject(err)
      } else {
        resolve(data)
        // cb(data)
      }
    })
  })
}


function Uint8ArrayToString(fileData) {
  var dataString = "";
  for (var i = 0; i < fileData.length; i++) {
    dataString += String.fromCharCode(fileData[i]);
  }
  return dataString
}

function generalPicture(scene, camera) {
  const renderer = new SoftwareRenderer({
    antialias: true,
    alpha: true
  });
  renderer.setSize(width, height);
  var imagedata = renderer.render(scene, camera);

  // Create a PNG from the pixels array (RGBA)
  const png = new PNG({
    width: width,
    height: height,
    filterType: -1
  });

  for (var i = 0; i < imagedata.data.length; i++) {
    png.data[i] = imagedata.data[i];
  }
  console.log(png.data);
  if (!fs.existsSync("mergeOver")) {
    fs.mkdirSync("mergeOver");
  }
  png.pack().pipe(fs.createWriteStream("mergeOver/example.png"));
}

function initScene({ pingImg, pingMtl, pingObj }) {
  if (!pingImg || !pingMtl || !pingObj) {
    console.error("文件错误");
    return
  }

  const width = 1024;
  const height = 768;
  const camera = new THREE.PerspectiveCamera(75, width / height, 1, 1000);
  camera.position.z = 15;
  const scene = new THREE.Scene();

  // 环境光
  var ambient = new THREE.AmbientLight(0xffffff, 1);
  ambient.name = "ambient";
  scene.add(ambient);

  console.error(pingImg.width, pingImg.height);

  const tex = new THREE.DataTexture(
    Uint8Array.from(pingImg.data),
    pingImg.width,
    pingImg.height,
    THREE.RGBAFormat,
    THREE.UnsignedByteType,
    THREE.UVMapping
  )
  tex.needsUpdate = true

  let loaderObj = new THREE.OBJLoader()
  let loaderMtl = new MTLLoader()
  let objStr = Uint8ArrayToString(Uint8Array.from(pingObj))
  let mtlStr = Uint8ArrayToString(Uint8Array.from(pingMtl))
  let mtl = loaderMtl.parse(mtlStr)
  loaderObj.setMaterials(mtl);
  let obj = loaderObj.parse(objStr)
  obj.children.forEach(item => {
    const material = new THREE.MeshPhongMaterial({
      color: 0xffffff
    });
    item.material = material;
  });
  obj.children[2].material.map = tex
  obj.children[2].material.needsUpdate = true
  scene.add(obj)

  generalPicture(scene, camera)
}

async function run() {
  let pingObj = null
  try {
    pingObj = await readFile("./module/ping.obj")
  } catch (error) {
    console.error(error);
    console.error("获取 pingObj 文件失败...");
    return
  }
  console.error("read ping.obj ok...");

  let pingMtl = null
  try {
    pingMtl = await readFile("./module/ping.mtl")
  } catch (error) {
    console.error(error);
    console.error("获取 pingMtl 文件失败...");
    return
  }
  console.error("read ping.mtl ok...");

  const pingImg = PNG.sync.read(fs.readFileSync('./module/ping1024.png'))
  console.error("read ping.png ok...");

  initScene({ pingImg, pingMtl, pingObj })
}


run()

<全文结束>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 在使用three.js加载.obj和.mtl文件之前,您需要先确保您已经正确地导入了three.js库,并且已经创建了一个WebGL渲染器和一个场景。 加载.obj和.mtl文件的过程分为两个步骤: 第一步是加载.obj文件。您可以使用THREE.OBJLoader()来加载.obj文件。首先,创建一个OBJLoader的实例,并且使用load()方法来加载.obj文件。例如: var objLoader = new THREE.OBJLoader(); objLoader.load('model.obj', function(object) { // 加载成功后的回调函数 scene.add(object); // 将加载的模型添加到场景中 }); 在上述代码中,我们使用.load()方法来加载.obj文件,并且在加载成功之后使用回调函数来添加到场景中。 第二步是加载.mtl文件。.mtl文件是指定.obj文件材质的文件。您还需要使用MTLLoader来加载.mtl文件,并且与OBJLoader一起使用。首先,创建一个MTLLoader的实例,并且使用load()方法来加载.mtl文件。然后,在OBJLoader的回调函数中,使用setMaterials()方法来设置材质。例如: var mtlLoader = new THREE.MTLLoader(); mtlLoader.load('model.mtl', function(materials) { materials.preload(); // 进行预加载 objLoader.setMaterials(materials); // 设置材质 objLoader.load('model.obj', function(object) { // 加载成功后的回调函数 scene.add(object); // 将加载的模型添加到场景中 }); }); 在上述代码中,我们首先加载.mtl文件使用加载和设置材质,然后在加载.obj文件使用OBJLoader,并将加载结果添加到场景中。 以上就是使用three.js加载.obj和.mtl文件的基本过程。您可以根据实际场景和需求进行进一步的调整和扩展。 ### 回答2: 要加载OBJ和MTL文件,你首先需要在Three.js中导入OBJLoader和MTLLoader模块。你可以通过在HTML文件中包含相关的脚本来实现。一旦你导入了这些模块,你可以使用这些模块来加载并显示OBJ和MTL文件。 首先,你需要创建一个场景和渲染器。创建一个用于显示模型的渲染器实例,并将其添加到页面中的某个元素上。然后,创建一个相机并设置其位置和方向。 接下来,你需要使用OBJLoader来加载OBJ文件使用OBJLoader的load方法来加载OBJ文件,并指定加载完成后的回调函数。在回调函数中,你可以获取到加载的几何体数据。将几何体添加到场景中,并根据需要设置其位置、旋转和缩放。 然后,使用MTLLoader来加载对应的MTL文件使用MTLLoader的load方法来加载MTL文件,并指定加载完成后的回调函数。在回调函数中,你可以获取到加载的材质数据。将材质应用到之前加载的几何体上。 最后,将场景渲染到页面中。在渲染循环中使用渲染器的render方法来将场景与相机进行渲染。 总结来说,使用Three.js加载OBJ和MTL文件需要导入OBJLoader和MTLLoader模块,创建场景和渲染器,加载OBJ文件并添加到场景中,加载MTL文件并应用到OBJ几何体上,最后渲染场景到页面中。 ### 回答3: 要加载.obj和.mtl文件,我们可以使用Three.js库中的OBJLoader和MTLLoader。 首先,我们需要在HTML文件中引入Three.js库: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.js"></script> ``` 接下来,我们创建一个场景、相机和渲染器: ```javascript var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); ``` 然后,我们使用MTLLoader加载.mtl文件OBJLoader加载.obj文件: ```javascript var mtlLoader = new THREE.MTLLoader(); mtlLoader.load('path/to/file.mtl', function(materials) { materials.preload(); var objLoader = new THREE.OBJLoader(); objLoader.setMaterials(materials); objLoader.load('path/to/file.obj', function(object) { scene.add(object); }); }); ``` 在上面的代码中,我们需要将'path/to/file.mtl'和'path/to/file.obj'替换为实际的文件路径。 最后,我们可以添加灯光和动画,并在渲染循环中更新场景: ```javascript var light = new THREE.PointLight(0xFFFFFF, 1, 100); light.position.set(0, 0, 5); scene.add(light); function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } animate(); ``` 这样,我们就可以成功加载并显示.obj和.mtl文件了。 请注意,由于加载外部文件需要进行网络请求,所以在本地开发时需要确保跨域访问控制(CORS)设置正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值