Three.js的入门案例(上)
前端达人
共 4478字,需浏览 9分钟
· 2021-02-28
关注初识Threejs与小编一起学习成长
在Three.js的赋能下,WEB网页效果逐渐丰富起来,今天我们就来运用之前学习的Three.js基础知识,实现一个旋转的几何体-球体。
知识点
1、透视投影照相机、基本材质;
2、球体几何模型、全景贴图;
3、渲染器;
创建DOM
<div class="canvas" id="canvasObj">
</div>
为div容器定义样式:
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%;
}
引入依赖
这里使用import导入依赖,OrbitControls.js是轴道控制器控件,用它可以实现场景与鼠标交互,让场景动起来,控制场景的旋转、缩放、平移;CSS2DRenderer.js是CSS 2D渲染器,使用CSS2DObject和CSS2DRenderer可以绘制一个2D效果的标签,将三维物体和基于HTML的标签相结合。
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渲染器
核心代码
1、初始化场景:
_this.scene=function(){
scene = new THREE.Scene();
}
2、初始化照相机:
_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、在场景里面创建球体:
_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、初始化渲染器:
_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、周期性渲染场景:
_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、调用函数:
//初始化
_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();//渲染
}
写在最后
以上就是此次案例的核心代码,大家可以动手尝试一下修改构造函数的参数值,如:基础材质的纹理贴图、网格模型的旋转方向等,通过它们的巧妙组合,可以让场景更加绚丽多彩,快去动手实践吧~
如果你对本文内容有任何建议,欢迎与小编沟通交流,一起学习成长!关注公众号回复three.js,获取完整案例代码。 |
你“在看”我吗?
评论
真高!比亚迪员工爆料比亚迪在越南的薪资水平:基本工资480万,全勤奖35万,交通补助20万,餐补110万,每周6天,每天10小时
上一篇:某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...对此,你怎么看?--完--PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。全文完,感谢你的耐心阅读。如果你还想看到我的文章,请一定给本
开发者全社区
0
太敢穿了!透视纱裙!性感火辣的身材
绝了呀今天的厂花:吴宣仪1995年1月26日,吴宣仪出生于海南省海口市,中国内地流行乐女歌手、影视演员。2016年2月,吴宣仪随宇宙少女发行首张迷你专辑正式出道。2018年4月,她参加《创造101》综艺选秀,获得第二名,成功加入火箭少女101组合。吴宣仪的颜值一直备受称赞,她的五官立体精致,皮肤白皙
逆锋起笔
0
某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...
上一篇:字节的跳动职级与薪资(2024年)我们与公司间的合作,宛如两艘船只在茫茫大海上相互依靠,共同抵御风浪,携手驶向成功的彼岸。然而,当航向开始产生分歧,或是波涛汹涌的风浪改变了我们的初衷,我们或许应当冷静地选择和平分手,而非在风雨中硬撑。最近,一位网友的遭遇引起了广大职场人的关注和热议。这位网友
开发者全社区
0
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
我看阿里的年终奖总算发了!
到4月底了,这两天看朋友圈,发现阿里的年终奖终于发了,问了问老同学,也从网上检索了不少信息,基本搞清楚了阿里今年的年终奖情况。近来来阿里一些集团对绩效等级做了较大的调整,以前的旧绩效系统中,绩效分为3.25、3.5、3.75、4和5五个等级,其中4和5是较高绩效等级,较少见。而且之前3.5绩效内部划
公子龙
0
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
字节的跳动职级与薪资(2024年)
上一篇:阿里公布年终奖,P7, 3.5+,22W年终奖,还有35W长期现金激励,真香字节跳动自2012年3月成立以来,已经迅速成长为一个全球性的科技公司。其产品和服务已经遍布全球150多个国家与地区,并且支持超过75种不同的语言。在字节跳动的官方网站上,列出了一系列引人注目的产品和服务,包括但不限于
开发者全社区
0