阅读 1203

threejs-CSS3DRenderer-入门

示例效果

GIF.gif

原理

通过threejs的插件CSS3DRenderer,实现dom元素的3d效果,本质是把原来三维场景场景中的视图矩阵、模型矩阵、投影矩阵的变换,通过css中的translateZ、matrix3d、perspective等属性模拟出来在,作用在dom上

CSS3DRenderer中暴露出的三个对象

1.CSS3DObject

类似threejs中的网格模型

2.CSS3DSprite

类似threejs中精灵模型

3.CSS3DRenderer

css3d的渲染器,主要不同是在渲染器层面,渲染器来处理原理中提到的变换过程,调整dom的style

使用

引入

import { CSS3DRenderer, CSS3DObject, CSS3DSprite } from 'three/examples/jsm/renderers/CSS3DRenderer.js' 复制代码

初始化渲染器

初始化场景时把WebGLRenderer换成了CSS3DRenderer,其他的Scene,OrbitControls,camera等同threejs中用法

this.CSS3Renderer = new CSS3DRenderer() this.CSS3Renderer.setSize(宽, 高) // 设置渲染区域尺寸 document.getElementById(被挂载的domId).appendChild(this.CSS3Renderer.domElement) // 挂载dom 复制代码

生成页面元素

// 五只猫跟地板的dom <div class="cat cat1"> </div> <div class="cat cat2"> </div> <div class="cat cat3"> </div> <div class="cat cat4"> </div> <div class="cat cat5"> </div> <div class="plane"> </div> // 样式 .cat {   width: 80px;   height: 80px;   position: absolute;   background-size: 100% 100%; } .cat1 {   background-image: url("~@/assets/img/buoumao-xiyouse.png"); } .cat2 {   background-image: url("~@/assets/img/buoumao-zhongdianse.png"); } .cat3 {   background-image: url("~@/assets/img/dajumao.png"); } .cat4 {   background-image: url("~@/assets/img/lanbaimao.png"); } .cat5 {   background-image: url("~@/assets/img/xianluomao.png"); } .plane {   width: 200px;   height: 200px;   position: absolute;   background-image: url("~@/assets/img/plane.png");   background-size: 100% 100%; } 复制代码

包装元素

// 获取页面元素用相应方法包装 const domArr = document.getElementsByClassName('cat') renderCsss3d(domArr) const dom = document.getElementsByClassName('plane') addCss3dPlane(dom) 复制代码

渲染猫图标的函数 renderCsss3d

renderCsss3d(domArr) {   const r = 100   // 计算出半径为r的圆上等分的五个点的x,y坐标   const pointArry = this.computePosition(new THREE.Vector2(0, 0), new THREE.Vector2(r, 0), 5)   // 循环设置五个dom   for (let i = 0; i < domArr.length; i++) {     // 需要时刻面向镜头,所以采用精灵对象     const obj = new CSS3DSprite(domArr[i])     // 根据计算的坐标,设置每个猫图标的位置,高度为50(50设置给y因为相机up为y)     obj.position.set(pointArry[i].x, 50, pointArry[i].y)     // 加到组中,为了后续一起旋转     this.css3dGroup.add(obj)   } } 复制代码

工具函数 computePosition

/**  *  计算出半径为r的圆上等分的cnt个点的x,y坐标  * @param center 圆的中点 vec2  * @param first  第一个点的坐标 vec2  * @param cnt  等分个数  * @returns {[vec2]}  */ computePosition(center, first, cnt) {   const pointList = [first]   for (let i = 1; i < cnt; i++) {     const p = first.clone()     p.rotateAround(center, Math.PI * 2 / cnt * i)     pointList.push(p)   }   return pointList } 复制代码

渲染地板的函数 addCss3dPlane

addCss3dPlane(dom) {    // 不需要时刻面向镜头所以采用常规模型对象   const obj = new CSS3DObject(dom[0])   // 平面默认是竖着的,需要放倒   obj.rotateX(Math.PI / 2)   // 添加到场景中   this.scene.add(obj) } 复制代码

渲染

// 渲染 _animate() {   requestAnimationFrame(this._animate.bind(this))   this.CSS3Renderer.render(this.scene, this.camera)   // 绕y轴旋转   this.css3dGroup.rotation.y += 0.005 }


作者:乘风转舵
链接:https://juejin.cn/post/7045185104871686157

玩站网免费分享SEO网站优化 技术及文章 伪原创工具 https://www.237it.com/ 


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐