如何解决如何在node.js中使用three.js和3MFLoader?
我已经使用threejs在节点(STL,OBJ)中制作了几个加载器。现在,我正在尝试使用three.js加载3mf文件。我正在使用xmldom-qsa npm包来处理DOMParser和querySelectAll。但是,运行节点脚本时仍然出现以下错误:
TypeError: Cannot use 'in' operator to search for 'nextElementSibling' in undefined
at C:\load3mf\node_modules\nwmatcher\src\nwmatcher-noqsa.js:133:26
at addNwmatcher (C:\load3mf\node_modules\xmldom-qsa\dom.js:1239:9)
at Document.Class.querySelectorAll (C:\load3mf\node_modules\xmldom-qsa\dom.js:1247:10)
at parseRelsXml (C:\load3mf\node_modules\three\examples\js\loaders\3MFLoader.js:201:32)
at loadDocument (C:\load3mf\node_modules\three\examples\js\loaders\3MFLoader.js:120:11)
at THREE.ThreeMFLoader.parse (C:\load3mf\node_modules\three\examples\js\loaders\3MFLoader.js:1402:17)
at load3mf (C:\load3mf\load3mf.js:72:19)
at Object.<anonymous> (C:\load3mf\load3mf.js:81:1)
at Module._compile (internal/modules/cjs/loader.js:702:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)
这是我正在使用的代码:
const fs = require("fs")
var DOMParser = require('xmldom-qsa').DOMParser;
const atob = require("atob")
const { Blob,FileReader } = require("vblob")
const { Image } = require("image-js")
const THREE = require("three")
// Patch global scope to imitate browser environment.
global.atob = atob
global.window = global
global.Blob = Blob
global.FileReader = FileReader
global.THREE = THREE
global.DOMParser = DOMParser
// Do we enable canvas?
// const Canvas = require("canvas")
const Canvas = false
global.document = {
createElementNS: (namespaceURI,qualifiedName) => {
if (qualifiedName == "img") {
const img = new Image()
img.removeEventListener = (name,fn) => {
// console.log(`img.removeEventListener(${name},${fn})`)
}
img.addEventListener = (name,fn) => {
// console.log(`img.addEventListener(${name},${fn})`)
setTimeout(fn,10)
}
return img
}
throw new Error(`Cannot create node ${qualifiedName}`)
},createElement: nodeName => {
if (!Canvas || nodeName !== "canvas")
throw new Error(`Cannot create node ${nodeName}`)
const canvas = new Canvas(256,256)
// This isn't working — currently need to avoid toBlob(),so export to embedded .gltf not .glb.
// canvas.toBlob = function () {
// return new Blob([this.toBuffer()]);
// };
return canvas
}
}
/**
* The Node.js filesystem API ('fs') returns a Buffer instance,which may be a
* view into a larger buffer. Because GLTFLoader parsing expects a raw
* ArrayBuffer,we make a trimmed copy of the original here.
*
* @param {Buffer} buffer
* @return {ArrayBuffer}
*/
const JSZip = require("three/examples/js/libs/jszip.min.js")
global.JSZip = JSZip
require("three/examples/js/loaders/3MFLoader")
const load3mf = async input_path => {
let input_mesh = null
let loader = null
var mesh = null
var geometry = null
console.log("loading mesh from ",input_path)
let bin = fs.readFileSync(input_path,"binary")
loader = new THREE.ThreeMFLoader()
mesh = loader.parse(bin)
return mesh
}
input_path = "./tmp/box_prod.3mf";
console.log(`loading ${input_path}`)
load3mf(input_path)
.then(input_mesh => {
console.log("3mf load success")
})
.catch(e => {
console.log("caught error",e)
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。