一、全屏/局部渲染
- 通过
three.ts
发开Web3D
应用的时候,渲染窗口可能是全屏效果占满web
页面整个body
区域, 也可能是web
页面上一个特定位置特定区域,比如渲染区域是一个特定位置、特定宽高的div
元素所在区域。
1. 全屏渲染
- 直接通过
three.ts
的WebGL
渲染器WebGLRenderer
的.setSize()
方法设置渲染尺寸为浏览器body
区域宽高度。
javascript
const width = window.innerWidth; //浏览器窗口宽度
const height = window.innerHeight; //浏览器窗口高度
// 相机参数设置
const k = width / height;
const s = 150;
//正投影相机设置
const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
//透视投影相机设置
// var camera = new THREE.PerspectiveCamera(60, width / height, 1, 1000);
const renderer = new THREE.WebGLRenderer();
//设置渲染区域尺寸
renderer.setSize(width, height);
// body元素中插入Threejs渲染结果:canvas对象
document.body.appendChild(renderer.domElement);
2. 局部渲染
- 下面代码实现的功能是
three.ts
渲染区域尺寸是300x300px
,渲染结果.domElement(Canvas元素)
插入到一个div
元素中。
vue
<!-- 把Three.js渲染结果一个canvas元素插入到div中 -->
<div id="pos"></div>
<script>
// 注意相机参数设置
const width = 300; //窗口宽度
const height = 300; //窗口高度
const k = width / height; //窗口宽高比
const s = 150; //三维场景显示范围控制系数,系数越大,显示的范围越大
//正投影相机设置
const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
//透视投影相机设置
// const camera = new THREE.PerspectiveCamera(60, width / height, 1, 1000);
const renderer = new THREE.WebGLRenderer();
// 设置渲染区域尺寸,本质就是设置输出canvas的尺寸
renderer.setSize(300, 300);
// 把渲染器的渲染结果canvas对象插入到'pos'对应的div元素中
document.getElementById('pos').appendChild(renderer.domElement);
</script>
- 可以通过渲染结果
.domElement(Canvas元素)
的父元素div
来控制渲染区域在浏览器上的位置。
html
<!-- 控制div位置 绝对定位 距离上方100px 距离左侧30px -->
<div id="pos" style="position: absolute;left: 30px;top: 100px;"></div>
3. .domElement
属性
three.ts
渲染器WebGLRenderer
的.domElement
属性是three.ts
执行渲染方法.render()
的渲染结果, 本质上就是一个HTML
元素Canvas
,如果对WebGL
稍微有些了解的话,更容易理解.domElement
属性,如果通过原生WebGL
渲染一个场景, 需要手动创建一个Canvas
画布获得WebGL
上下文,如果使用three.ts
框架,three.ts
系统会自动创建一个canvas
对象, 然后把渲染结果呈现在该canvas
画布上。.domElement
属性值是一个HTML
元素canvas
,那么如何使用.domElement
属性,就变成前端问题, 可以把.domElement
表示的canvas
画布插入到Web
页面中任何一个HTML
元素中。
4. .setSize()
方法
three.ts
渲染器的.setSize()
方法简单解释就是设置渲染结果的尺寸范围,本质上就是设置.domElement
表示的canvas
画布的宽高尺寸。
5. 相机控件OrbitControls
作用范围
- 如果渲染区域变化了,不仅仅要改变
WebGL
渲染器相关参数,如果使用的其它扩展库与three.ts
渲染范围有关, 比如OrbitControls.js
,也需要设置该控件的鼠标作用范围。通过OrbitControls
创建一个相机控件对象的时候, 默认情况下,在浏览器的窗口整个内容区域body
发生鼠标事件都会旋转、平移或缩放三维场景,如果局部渲染, 注意设置构造函数THREE.OrbitControls
的参数2。
html
// 局部渲染设置OrbitControls空间作用范围
const controls = new THREE.OrbitControls(camera, renderer.domElement);