Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 0.学前说明

  • 1.Three.js快速入门

  • 2.几何体BufferGeometry

  • 3.模型对象、材质

  • 4.层级模型

  • 5.顶点UV坐标、纹理贴图

  • 6.加载外部三维模型(gltf)

  • 7.PBR材质与纹理贴图

  • 8.渲染器和前端UI界面

    • 1. three.js Canvas画布布局
      • 2. UI交互界面与Canvas画布叠加
      • 3. UI交互按钮与3D场景交互
      • 4. Three.js背景透明度
      • 5. Three.js渲染结果保存为图片
      • 6. 深度冲突(模型闪烁)
      • 7. 模型加载进度条
    • 9.生成曲线、几何体

    • 10.相机基础

    • 11.光源和阴影

    • 12.精灵模型Sprite

    • 13.后处理EffectComposer

    • 14.射线拾取模型

    • 15.场景标注标签信息

    • 16.关键帧动画

    • 17.动画库tween.js

    • Three.js教程
    • 8.渲染器和前端UI界面
    郭隆邦
    2023-01-27
    目录

    1. three.js Canvas画布布局

    # three.js Canvas画布布局

    学习本节课之前,可以先回顾下第一章节入门部分的6和12两小节关于threejs Canvas画布布局的讲解。

    • 网页上局部特定尺寸:1.6 第一个3D案例—渲染器 (opens new window)

    • 全屏,随窗口变化:1.12 Canvas画布布局和全屏 (opens new window)

    • 局部,尺寸随窗口变化:在线案例 (opens new window)

    # Canvas元素

    Canvas是HTML的元素之一,Canvas元素的CSS布局规律和div、img等其它HTML元素相似,webgl就是依赖于canvas实现,threejs是基于webgl封装的,自然也要依赖canvas,具体说就是把三场场景渲染到canvas画布上。

    <!-- canvas元素默认是行内块元素 -->
    <canvas style="background-color: #ff0000;" width="300" height="180"></canvas>
    

    # threejs渲染结果CSS布局

    浏览器控制台通过元素选项查看threejs输出的cnavas画布,你可以看到threejs默认把canvas设置为块元素display: block;。

    既然three.js渲染输出的Canvas画布本质上就是一个HTML元素,那么你布局的时候,直接使用你的前端CSS知识即可。

    # 案例源码“CSS布局案例.html”

    案例源码“CSS布局案例.html”提供了一个CSS的布局案例,你可以把threejs画布插入右下角的div元素中,并完全填充。

    案例源码“CSS布局案例.html”的布局效果,你也可以用CSS其它方式实现,不一定和课程中一样,CSS布局是前端知识,这里不展开讲解,咱们把重点放在threejs上面。

    <head>
        <style>
            body {
                overflow: hidden;
                margin: 0px;
            }
        </style>
    </head>
    <body style="background: #555555;">
        <div style="height: 55px;background-color: #444444;">上面布局</div>
        <!-- 下 -->
        <div>
            <div id="left" style="position: absolute;top: 60px;background-color: #444444;width: 195px;">下面左侧布局</div>
            <div id="webgl" style="position: absolute;top: 60px;left: 200px;background-color: #444444;">下面右侧布局</div>
        </div>
        <script>
            const width = window.innerWidth - 200;
            const height = window.innerHeight - 60;
            document.getElementById('left').style.height = height + 'px';
            document.getElementById('webgl').style.width = width + 'px';
            document.getElementById('webgl').style.height = height + 'px';
        </script>
    </body>
    

    # threejs Canvas画布尺寸设置

    设置canvas画布的尺寸,注意在浏览器窗口文档区域整体宽高基础上,减掉其他顶部和左侧div元素和布局间隙的尺寸。

    • canvas画布的宽度: window.innerWidth减掉左侧div元素宽度195px和布局间距5px
    • canvas画布的高度: window.innerHeight减掉顶部div元素高度55px和布局间距5px
    // 200表示左侧div元素宽度195px+间距5px
    const width = window.innerWidth - 200; //canvas画布高度
    //60表示顶部div元素高度55px+间距5px
    const height = window.innerHeight - 60; //canvas画布宽度
    ...
    const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
    renderer.setSize(width, height);
    
    // 200表示左侧div元素宽度195+间距5px
    const width = window.innerWidth - 200; //canvas画布高度
    //60表示顶部div元素高度55px+间距5px
    const height = window.innerHeight - 60; //canvas画布宽度
    ...
    const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
    renderer.setSize(width, height);
    

    # Canvas随着窗口变化

    // 画布跟随窗口变化
    window.onresize = function () {
        const width = window.innerWidth - 200; //canvas画布高度
        const height = window.innerHeight - 60; //canvas画布宽度
        renderer.setSize(width, height);
        camera.aspect = width / height;
        camera.updateProjectionMatrix();
    };
    
    7. 三维软件导出PBR材质属性
    2. UI交互界面与Canvas画布叠加

    ← 7. 三维软件导出PBR材质属性 2. UI交互界面与Canvas画布叠加→

    Theme by Vdoing | Copyright © 2016-2025 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式