Three.jsキャンバスから画像を保存するにはどうすればよいですか?
Canvas2Imageを使用しようとしていますが、Threejsで遊ぶのは好きではありません。キャンバスは、キャンバスオブジェクトをアタッチするdivを持つまで定義されないため。
http://ajaxian.com/archives/canvas2image-save-out-your-canvas-data-to-images
ToDataURLはキャンバスhtml要素のメソッドであるため、3Dコンテキストでも機能します。ただし、いくつかの点に注意する必要があります。
3Dコンテキストが初期化されたら、次のようにpreserveDrawingBuffer
フラグをtrueに設定してください。
_var context = canvas.getContext("experimental-webgl", {preserveDrawingBuffer: true});
_
次に、ユーザーcanvas.toDataURL()
が画像を取得します
Threejsでは、レンダラーがインスタンス化されるときに以下を実行する必要があります。
_new THREE.WebGLRenderer({
preserveDrawingBuffer: true
});
_
また、これはパフォーマンスに影響する可能性があることに注意してください。 (読む: https://github.com/mrdoob/three.js/pull/421#issuecomment-1792008 )
これはwebglレンダラーのみです。ただし、threejs canvasRendererの場合は、renderer.domElement.toDataURL();
を直接実行するだけで、初期化パラメーターは不要です。
私のwebgl実験: http://jsfiddle.net/TxcTr/3/ スクリーンショットに「p」を押します。
gaitat の小道具、私は彼のコメントのリンクをたどってこの答えを見つけました。
Dineshが投稿した会話を読みました( https://github.com/mrdoob/three.js/pull/421#issuecomment-1792008 )。応用。
function render() {
requestAnimationFrame(render);
renderer.render(scene, camera);
if(getImageData == true){
imgData = renderer.domElement.toDataURL();
getImageData = false;
}
}
これにより、preserveDrawingBuffer-Flagをfalseのままにして、THREE.jsから画像を取得できます。 getImageDataをtrueに設定し、render()を呼び出すだけで準備完了です。
getImageData = true;
render();
console.debug(imgData);
これが私のような高fpsを必要とする人々に役立つことを願っています:)