Three.js將渲染結(jié)果保存為圖片

將three.js渲染結(jié)果保存下來,本質(zhì)上就是保存three.js對應(yīng)canvas畫布上的內(nèi)容。所以這個(gè)問題其實(shí)就是將canvas畫布保存為一個(gè)圖片。而獲取canvas畫布上的內(nèi)容可以通過toDataURL()去獲取。不過three.js是對webgl進(jìn)行封裝的,獲取canvas上的webgl內(nèi)容,除了執(zhí)行toDataURL()外,還要在獲取webgl上下文的時(shí)候配置preserveDrawingBuffer參數(shù)。

1、Cavnas方法.toDataURL()

Canvas畫布通過.toDataURL()方法可以獲取畫布上的像素信息。canvas.toDataURL("image/png");表示以png格式獲取像素?cái)?shù)據(jù),可以直接賦值給超鏈接元素a的.herf屬性下載到本地

var canvas = renderer.domElement;//獲取canvas對象
link.href = canvas.toDataURL("image/png");
1.1、以不同的格式獲取像素信息
canvas.toDataURL("image/png");
canvas.toDataURL("image/jpeg");
canvas.toDataURL("image/bmp");
2、WebGL渲染器設(shè)置
var renderer = new THREE.WebGLRenderer({
   // 如果想保存three.js canvas畫布上的信息,注意設(shè)置preserveDrawingBuffer
   preserveDrawingBuffer: true,
});
3、 超鏈接元素a下載文件

瀏覽器通過超鏈接元素a可以把數(shù)據(jù)保存到文件中并下載到本地。

   <button type="button" name="button" onclick="saveFile()">下載</button>
   <script>
     //保存webgl內(nèi)容
       function saveFile() {
           // 創(chuàng)建一個(gè)超鏈接元素,用來下載保存數(shù)據(jù)的文件
           var link = document.createElement('a');
           // 通過超鏈接herf屬性,設(shè)置要保存到文件中的數(shù)據(jù)
           var canvas = renderer.domElement;//獲取canvas對象
           link.href = canvas.toDataURL("image/png");
           link.download = 'threejs.png'; //下載文件名
           link.click(); //js代碼觸發(fā)超鏈接元素a的鼠標(biāo)點(diǎn)擊事件,開始下載文件到本地
       }
   </script>
4、完整源代碼
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Three.js中文網(wǎng):http://www.webgl3d.cn/</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            /* 隱藏body窗口區(qū)域滾動(dòng)條 */
        }
    </style>
    <!--引入three.js三維引擎-->
    <script src="http://www.yanhuangxueyuan.com/threejs/build/three.js"></script>
    <!-- 引入threejs擴(kuò)展控件OrbitControls.js -->
    <script src="http://www.yanhuangxueyuan.com/threejs/examples/js/controls/OrbitControls.js"></script>

</head>

<body>
    <div style="position: absolute;top:0px;left:0px;">
        <button type="button" name="button" onclick="saveFile()">下載</button>
    </div>    
    <script>
        /**
         * 創(chuàng)建場景對象Scene
         */
        var scene = new THREE.Scene();
        /**
         * 創(chuàng)建網(wǎng)格模型
         */
        var geometry = new THREE.BoxGeometry(100, 100, 100); //創(chuàng)建一個(gè)立方體幾何對象Geometry
        var material = new THREE.MeshLambertMaterial({
            color: 0x0000ff
        }); //材質(zhì)對象Material
        var mesh = new THREE.Mesh(geometry, material); //網(wǎng)格模型對象Mesh
        scene.add(mesh); //網(wǎng)格模型添加到場景中
        /**
         * 光源設(shè)置
         */
        //點(diǎn)光源
        var point = new THREE.PointLight(0xffffff);
        point.position.set(400, 200, 300); //點(diǎn)光源位置
        scene.add(point); //點(diǎn)光源添加到場景中
        //環(huán)境光
        var ambient = new THREE.AmbientLight(0x444444);
        scene.add(ambient);
        /**
         * 相機(jī)設(shè)置
         */
        var width = window.innerWidth; //窗口寬度
        var height = window.innerHeight; //窗口高度
        var k = width / height; //窗口寬高比
        var s = 150; //三維場景顯示范圍控制系數(shù),系數(shù)越大,顯示的范圍越大
        //創(chuàng)建相機(jī)對象
        var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
        camera.position.set(200, 300, 200); //設(shè)置相機(jī)位置
        camera.lookAt(scene.position); //設(shè)置相機(jī)方向(指向的場景對象)
        /**
         * 創(chuàng)建渲染器對象
         */
        var renderer = new THREE.WebGLRenderer({
            // 如果想保存three.js canvas畫布上的信息,注意設(shè)置preserveDrawingBuffer
            preserveDrawingBuffer: true,
        });
        renderer.setSize(width, height); //設(shè)置渲染區(qū)域尺寸
        renderer.setClearColor(0xb9d3ff, 1); //設(shè)置背景顏色
        document.body.appendChild(renderer.domElement); //body元素中插入canvas對象

        // 渲染函數(shù)
        function render() {
            renderer.render(scene, camera); //執(zhí)行渲染操作
            requestAnimationFrame(render); //請求再次執(zhí)行渲染函數(shù)render,渲染下一幀
        }
        render();
        //創(chuàng)建控件對象  相機(jī)對象camera作為參數(shù)   控件可以監(jiān)聽鼠標(biāo)的變化,改變相機(jī)對象的屬性
        var controls = new THREE.OrbitControls(camera, renderer.domElement);

        
        //保存webgl內(nèi)容
        function saveFile() {
            // 創(chuàng)建一個(gè)超鏈接元素,用來下載保存數(shù)據(jù)的文件
            var link = document.createElement('a');
            // 通過超鏈接herf屬性,設(shè)置要保存到文件中的數(shù)據(jù)
            var canvas = renderer.domElement;//獲取canvas對象
            link.href = canvas.toDataURL("image/png");
            link.download = 'threejs.png'; //下載文件名
            link.click(); //js代碼觸發(fā)超鏈接元素a的鼠標(biāo)點(diǎn)擊事件,開始下載文件到本地
        }
    </script>
</body>

</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容