前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Three.js的入门案例(上)

Three.js的入门案例(上)

作者头像
前端达人
发布2021-03-16 16:09:05
5.9K0
发布2021-03-16 16:09:05
举报
文章被收录于专栏:前端达人

关注初识Threejs与小编一起学习成长

在Three.js的赋能下,WEB网页效果逐渐丰富起来,今天我们就来运用之前学习的Three.js基础知识,实现一个旋转的几何体-球体。

知识点

1、透视投影照相机、基本材质;

2、球体几何模型、全景贴图;

3、渲染器;

01

创建DOM

代码语言:javascript
复制
<div class="canvas" id="canvasObj">
</div>

为div容器定义样式:

代码语言:javascript
复制
html,body,.canvas{
    width:100%;
    height: 100%;
    padding:0px;
    margin:0px;
}
.canvas{
    background:url(../libs/threejs/img/bg.jpg) no-repeat;
    background-size:100% 100%;
}

02

引入依赖

这里使用import导入依赖,OrbitControls.js是轴道控制器控件,用它可以实现场景与鼠标交互,让场景动起来,控制场景的旋转、缩放、平移;CSS2DRenderer.js是CSS 2D渲染器,使用CSS2DObject和CSS2DRenderer可以绘制一个2D效果的标签,将三维物体和基于HTML的标签相结合。

代码语言:javascript
复制
import * as THREE from '../libs/threeJs/three.module.js';
import { OrbitControls } from '../libs/threeJs/controls/OrbitControls.js';//轴道控制器控件
import { CSS2DRenderer, CSS2DObject } from '../libs/threeJs/renderers/CSS2DRenderer.js';//css 2D渲染器

03

核心代码

1、初始化场景:

代码语言:javascript
复制
_this.scene=function(){
    scene = new THREE.Scene();
}

2、初始化照相机:

代码语言:javascript
复制
_this.camera=function(){
    /**
     * 构造函数总共有四个参数,分别是fov,aspect,near,far 
     * fov:照相机视锥体垂直视野角度,实际项目中一般都定义45,因为45最接近人正常睁眼角度
     * aspect:照相机视锥体长宽比
     * near:照相机视锥体近端面   far:照相机视锥体远端面
     * */
    camera = new THREE.PerspectiveCamera(45, canvasWidth / canvasHeight, 1, 1000);//远景投影的相机
    camera.position.set(10, 2, 20);//position用来指定相机在三维坐标中的位置
}

3、在场景里面创建球体:

代码语言:javascript
复制
_this.addSphere=function(){
    /**
     * 初始化球体几何模型
     * SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength)
     * radius:球体半径
     * widthSegments:水平分割面的数量
     * heightSegments:垂直分割面的数量
     * */
    var earthGeometry = new THREE.SphereGeometry(_this.EARTH_RADIUS, 60, 60);
    
    var textureLoader = new THREE.TextureLoader();//纹理加载器,用于加载球体的纹理
    //基础网孔材料
    var earthMaterial = new THREE.MeshBasicMaterial({
        color:0xffffff,//线条的十六进制颜色
        map: textureLoader.load(_this.sphereBg),//设置纹理贴图
        wireframe: false,//渲染模型为线框
        wireframeLinewidth: 3,//线框线宽
        skinning: false,//定义材料是否使用皮肤
    });
    
    //threeJs 的世界中,材质(Material)+几何体(Geometry)就是一个 mesh
    //创建网格对象
    earth = new THREE.Mesh(earthGeometry, earthMaterial);
    
    //设置球体标题
    var h2html=$("<div class='title'><span>Three.js球体<br/>旋转案例</span></div>").get(0);
    var earthLabel = new CSS2DObject(h2html);
    earthLabel.position.set(0, 2, 0);
    earth.add(earthLabel);//DOM元素实例添加到网格中
    
    scene.add(earth);//将球体添加到场景中
}

4、初始化渲染器:

代码语言:javascript
复制
_this.renderer=function(){
    renderer = new THREE.WebGLRenderer({
      alpha: true,//背景是否透明
      antialias: true//抗锯齿属性
    });
    //window.devicePixelRatio返回当前显示设备的物理像素分辨率与CSS像素分辨率之比
    //设置设备像素比。通常用于HiDPI设备防止模糊输出canvas
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(canvasWidth, canvasHeight);//调整输出canvas尺寸
    canvasObj.append(renderer.domElement);//把canvas添加Dom中
    
    /**
     * 初始化CSS 2D渲染器
     * 可以将三维物体和基于HTML的标签相结合
    */
    labelRenderer = new CSS2DRenderer();
    labelRenderer.setSize(canvasWidth, canvasHeight);
    labelRenderer.domElement.style.position = 'absolute';
    labelRenderer.domElement.style.top = 0;
    canvasObj.append(labelRenderer.domElement);
}

5、周期性渲染场景:

代码语言:javascript
复制
_this.renderFun=function(){
    requestAnimationFrame(_this.renderFun);
    
    var now = new Date();
    var delay = now - lastDate;
    lastDate = now;
    var intc = 3;  // 每秒转3度

    earth.rotation.y += Math.PI / 180 / delay * intc;
    labelRenderer.render(scene, camera);
    renderer.render(scene, camera);
}

6、调用函数:

代码语言:javascript
复制
//初始化
_this.init=function(){
    _this.scene();
    _this.camera();
    _this.addSphere();
    _this.renderer();
    
    //轴道控制器。相机对象作为参数,控件可以监听鼠标的变化,改变相机对象属性
    var controls = new OrbitControls(camera);
    controls.enabled = true;//鼠标控制是否可用
    
    //滚轮是否可控制zoom,zoom速度默认1
    controls.enableZoom = false;
    controls.zoomSpeed = 1.0;
    // controls.minDistance = 20;// 最小距离
    // controls.maxDistance = 25; //最大距离
    controls.noPan = true; // 禁用右键拖动
    controls.minPolarAngle = Math.PI / 180; // 视角不能低于水平面
    controls.maxPolarAngle = Math.PI / 2; // 视角不能低于水平面
    _this.renderFun();//渲染    
}

04

写在最后

以上就是此次案例的核心代码,大家可以动手尝试一下修改构造函数的参数值,如:基础材质的纹理贴图、网格模型的旋转方向等,通过它们的巧妙组合,可以让场景更加绚丽多彩,快去动手实践吧~

如果你对本文内容有任何建议,欢迎与小编沟通交流,一起学习成长!关注公众号回复three.js,获取完整案例代码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档