导出 Wonderland Engine 网格为 OBJ 文件

在运行时生成网格时,使用其他应用程序检查结果是非常有用的。这在生成的网格完全不渲染时尤其有帮助。

Wavefront OBJ 是一种非常简单的基于文本的格式,可以从你的 Wonderland Engine JavaScript 组件中导出。

代码片段 

以下代码片段接收一个 Mesh,为其写出包含位置和索引的 OBJ 文件,最后通过程序实现自动下载该文件。

import {MeshAttribute} from '@wonderlandengine/api';

export function wleMeshToOBJ(wleMesh) {
    /* 获取位置的属性访问器。
     * 你可以轻松地扩展此脚本以导出法线和纹理属性。 */
    const positions = wleMesh.attribute(MeshAttribute.Position);

    const lines = [];
    for(let i = 0; i < positions.length; ++i) {
        const [x, y, z] = positions.get(i);
        lines.push(`v ${x} ${y} ${z}`);
    }

    const indexCount = wleMesh.indexData.length;
    for (let i = 0; i < indexCount;) {
        /* .obj 的索引从 1 开始,而不是 0 */
        lines.push(`f ${wleMesh.indexData[i++] + 1} ${wleMesh.indexData[i++] + 1} ${wleMesh.indexData[i++] + 1}`);
    }

    /* 将所有行连接并生成一个用于下载的二进制 blob */
    const blob = new Blob([lines.join('\n')], {type: 'text/plain'});
    const url = URL.createObjectURL(blob);

    /* 通过程序自动下载该 blob 为文件 'mesh.obj' */
    const link = document.createElement('a');
    link.href = url;
    link.download = 'mesh.obj';

    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}