three-stdlib
Version:
stand-alone library of threejs examples
133 lines (132 loc) • 4.37 kB
JavaScript
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const THREE = require("three");
const mmdparser = require("../libs/mmdparser.cjs");
class MMDExporter {
constructor() {
// Unicode to Shift_JIS table
__publicField(this, "u2sTable");
}
/* TODO: implement
// mesh -> pmd
this.parsePmd = function ( object ) {
};
*/
/* TODO: implement
// mesh -> pmx
this.parsePmx = function ( object ) {
};
*/
/* TODO: implement
// animation + skeleton -> vmd
this.parseVmd = function ( object ) {
};
*/
/*
* skeleton -> vpd
* Returns Shift_JIS encoded Uint8Array. Otherwise return strings.
*/
parseVpd(skin, outputShiftJis, useOriginalBones) {
if (skin.isSkinnedMesh !== true) {
console.warn("THREE.MMDExporter: parseVpd() requires SkinnedMesh instance.");
return null;
}
function toStringsFromNumber(num) {
if (Math.abs(num) < 1e-6)
num = 0;
let a = num.toString();
if (a.indexOf(".") === -1) {
a += ".";
}
a += "000000";
const index = a.indexOf(".");
const d = a.slice(0, index);
const p = a.slice(index + 1, index + 7);
return d + "." + p;
}
function toStringsFromArray(array2) {
const a = [];
for (let i = 0, il = array2.length; i < il; i++) {
a.push(toStringsFromNumber(array2[i]));
}
return a.join(",");
}
skin.updateMatrixWorld(true);
const bones = skin.skeleton.bones;
const bones2 = this.getBindBones(skin);
const position = new THREE.Vector3();
const quaternion = new THREE.Quaternion();
const quaternion2 = new THREE.Quaternion();
const matrix = new THREE.Matrix4();
const array = [];
array.push("Vocaloid Pose Data file");
array.push("");
array.push((skin.name !== "" ? skin.name.replace(/\s/g, "_") : "skin") + ".osm;");
array.push(bones.length + ";");
array.push("");
for (let i = 0, il = bones.length; i < il; i++) {
const bone = bones[i];
const bone2 = bones2[i];
if (useOriginalBones === true && bone.userData.ik !== void 0 && bone.userData.ik.originalMatrix !== void 0) {
matrix.fromArray(bone.userData.ik.originalMatrix);
} else {
matrix.copy(bone.matrix);
}
position.setFromMatrixPosition(matrix);
quaternion.setFromRotationMatrix(matrix);
const pArray = position.sub(bone2.position).toArray();
const qArray = quaternion2.copy(bone2.quaternion).conjugate().multiply(quaternion).toArray();
pArray[2] = -pArray[2];
qArray[0] = -qArray[0];
qArray[1] = -qArray[1];
array.push("Bone" + i + "{" + bone.name);
array.push(" " + toStringsFromArray(pArray) + ";");
array.push(" " + toStringsFromArray(qArray) + ";");
array.push("}");
array.push("");
}
array.push("");
const lines = array.join("\n");
return outputShiftJis === true ? this.unicodeToShiftjis(lines) : lines;
}
unicodeToShiftjis(str) {
if (this.u2sTable === void 0) {
const encoder = new mmdparser.CharsetEncoder();
const table = encoder.s2uTable;
this.u2sTable = {};
const keys = Object.keys(table);
for (let i = 0, il = keys.length; i < il; i++) {
let key = keys[i];
const value = table[key];
this.u2sTable[value] = parseInt(key);
}
}
const array = [];
for (let i = 0, il = str.length; i < il; i++) {
const code = str.charCodeAt(i);
const value = this.u2sTable[code];
if (value === void 0) {
throw "cannot convert charcode 0x" + code.toString(16);
} else if (value > 255) {
array.push(value >> 8 & 255);
array.push(value & 255);
} else {
array.push(value & 255);
}
}
return new Uint8Array(array);
}
getBindBones(skin) {
const poseSkin = skin.clone();
poseSkin.pose();
return poseSkin.skeleton.bones;
}
}
exports.MMDExporter = MMDExporter;
//# sourceMappingURL=MMDExporter.cjs.map
;