4

Stack Overflow で見つけた次のコードを使用して、Three.js シーンのジオメトリから OBJ をエクスポートしようとしました。ジオメトリは GLSL シェーダーによって置き換えられているため、頂点の置き換えがジオメトリと共にエクスポートされていないようです。OBJ を Blender にインポートすると、変位していない平面のみが得られます。http://kineticvideo.coで変位の動作バージョンを調べることができます。

GLSL シェーダを使用してジオメトリを置き換えているときに OBJ をエクスポートするにはどうすればよいですか? 助けてください。Three.jsジオメトリで頂点の変位が実際にリアルタイムで更新されるという印象を受けましたが、代わりに、geometry.verticesNeedUpdate = true; ディスプレイスメントは、ジオメトリではなくメッシュで実際に発生しています。

その場合、ジオメトリではなくメッシュを使用して OBJ をエクスポートするにはどうすればよいですか?

ジオメトリと頂点シェーダーを宣言する Three.js のコード スニペット:

videoMaterial = new THREE.ShaderMaterial( {
    uniforms: {
        "tDiffuse": { type: "t", value: texture },
        "multiplier":  { type: "f", value: 66.6 },
        "displace":  { type: "f", value: 33.3 },
        "opacity":  { type: "f", value: 1.0 },
        "originX":  { type: "f", value: 0.0 },
        "originY":  { type: "f", value: 0.0 },
        "originZ":  { type: "f", value: -2000.0 }
    },

    vertexShader: RuttEtraShader.vertexShader,
    fragmentShader: RuttEtraShader.fragmentShader,
    depthWrite: true,
    depthTest: true,
    wireframe: false, 
    transparent: true,
    overdraw: false

});
videoMaterial.renderToScreen = true;
videoMaterial.wireframe = true;
geometry = new THREE.PlaneGeometry(720, 360, 720, 360);
geometry.overdraw = false;
geometry.dynamic = true;
geometry.verticesNeedUpdate = true;

mesh = new THREE.Mesh( geometry, videoMaterial );

これは私が使用した関数で、ジオメトリをエクスポートしますが、変位はエクスポートしません:

THREE.saveGeometryToObj = function (geometry) {
var s = '';
for (i = 0; i < geometry.vertices.length; i++) {
    s+= 'v '+(geometry.vertices[i].x) + ' ' +
    geometry.vertices[i].y + ' '+
    geometry.vertices[i].z + '\n';
}

for (i = 0; i < geometry.faces.length; i++) {

    s+= 'f '+ (geometry.faces[i].a+1) + ' ' +
    (geometry.faces[i].b+1) + ' '+
    (geometry.faces[i].c+1);

    if (geometry.faces[i].d !== undefined) {
        s+= ' '+ (geometry.faces[i].d+1);
    }
    s+= '\n';
}

return s;
console.log(s);
}
4

2 に答える 2

2

頂点シェーダーで行うのと同じ方法で、これらの頂点を変更する必要があります。どのアトリビュートが頂点にアタッチされているかを追跡する必要があるため、これは難しいかもしれませんが、基本的にシェーダーから同じ計算を適用します。

于 2014-06-09T20:35:35.537 に答える
2

私の間違いは、Three.js リポジトリで grep を実行するのではなく、これをグーグルで検索したことです。そこにはあらゆる種類の関数があり、そのうちの 2 つは THREE.STLExporter と THREE.OBJExporter です。

THREE.STLExporter は 2 つの中でより堅牢なようで、シーンをトラバースしてシーン内のメッシュをエクスポートできます。単一のメッシュをエクスポートすることもできます。OBJ は得られませんが、私の目的には STL で問題ありません。

var exportSTL = new THREE.STLExporter;
exportSTL.exportMesh(mesh);

しかし、これは元の質問への部分的な回答にすぎません。これは、ディスプレイスメントされたメッシュがまだエクスポートされていないためです。私が得るのは元の飛行機だけです。

于 2013-11-13T18:55:09.677 に答える