学习ThreeJS
创建第一个应用
使用Three JS进行编程的时候,都是在调用new Three().XXX 来实现方法,让我们先根据官方文档创建一个demo
https://threejs.org/docs/index.html#manual/zh/introduction/Creating-a-scene
那我们需要什么东西才能让这个场景build起来呢?
- 一个相机(camera),一般是使用PerspectiveCamera,因为最接近人的眼睛成像效果,还有正交相机等
- 75, // fov 垂直方向上视角的大小 field of view
- window.innerWidth / window.innerHeight, // aspect 纵宽比
- 0.1, // near
- 1000 // far
- 一个场景(scene)
- 一个渲染器 (renderer)
- 需要渲染的东西:使用哪种几何图形,使用什么材质? 这里演示使用基础材质(MeshBasicMaterial)和立方体(BoxGeometry)
拿到了所有的实例,接下来可以开始逻辑部分
然后将创建的实例(cube)加入(add)到场景(scene)中,如下代码:
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 })
const cube = new THREE.Mesh(geometry, material)
scene.add(cube)
接着把渲染器加入到浏览器的body中:
document.body.appendChild(renderer.domElement)
创建的渲染器其实就相当于appen了一个canvas到dom里,我们可以调整canvas的大小,这并不是实时resize,如果用户修改窗体可视大小会留白
留个悬念:可以实时监听addListener resize?
renderer.setSize(window.innerWidth, window.innerHeight)
由于创建的相机和cube几何体都默认出现在(0,0,0)的位置,需要对相机在z轴上进行平移
camera.position.z = 5
设置一下地面
// 网格地面
const gridHelper = new THREE.GridHelper(10, 10)
scene.add(gridHelper)
最后把场景和照相机作为参数传到renderer的render函数里
renderer.render(scene, camera)
如果想做出一个动画效果,就像下面代码块一样加上一个animate函数,这段代码每帧都会执行(正常情况下是60次/秒)
function animate() {
requestAnimationFrame(animate) // 不能写死循环,需要调用dom提供的这个动画帧函数
// mdn:https://developer.mozilla.org/zh-TW/docs/Web/API/window/requestAnimationFrame
cube.rotation.x += 0.01
cube.rotation.y += 0.01
renderer.render(scene, camera) // 将renderer渲染的时机放到每一帧的函数调用里
}
animate() //调用一下
点击查看代码
<script>
import * as THREE from 'three'
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(
75, // fov 垂直方向上视角的大小 field of view
window.innerWidth / window.innerHeight, // aspect 纵宽比
0.1, // near
1000 // far
)
camera.position.z = 5
camera.position.y = 2
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 })
const cube = new THREE.Mesh(geometry, material)
scene.add(cube)
// 网格地面
const gridHelper = new THREE.GridHelper(10, 10)
cube.position.set(0, 3, 0)
scene.add(gridHelper)
function animate() {
requestAnimationFrame(animate)
cube.rotation.x += 0.01
cube.rotation.y += 0.01
renderer.render(scene, camera)
}
animate()
</script>
学习ThreeJS的更多相关文章
- threejs创建地球
上个月底,在朋友圈看到一个号称“这可能是地球上最美的h5”的分享,点进入后发现这个h5还很别致,思考了一会,决定要不高仿一个? 到今天为止,高仿基本完成, 线上地址 github地址 除了手机端的me ...
- 高仿QQ Xplan的H5页面
概述 这个h5的主要玩法很简单:地球自转的时候会播放背景音乐(比如海浪声),为了找到这个声音是从哪个地球上哪个地方传来的,需要长按下方的按钮,这时地球会自动转动到目标地点,然后镜头拉近,穿过云层,最后 ...
- 初识webgl--我的webgl学习第一课(基于threeJs)
一,我为什么要学习webgl 一个偶然的机会,在和朋友的聊天过程中,听说了webgl,也许过去也看到过,但是没有特别在意过.原来,JavaScript也可以很好的渲染并在网页上显示三维动画,不用借助插 ...
- gis和threejs的学习资料
*********************************** 基础知识/名词 瓦片/矢量瓦片GeoJson - 绘制GeoJson看数据, geojson规范, 中文版 ********** ...
- threejs和3d各种效果的学习
写给即将开始threejs学习的自己,各种尝试,各种记忆.不要怕,灰色的年华终会过去. 一个技术学习的快慢,以及你的深刻程度,还有你的以后遇到这个东西的时候的反应速度,很大程度上,取决于你的博客的深刻 ...
- ThreeJS学习6_几何体相关(BufferGeometry)
ThreeJS学习6_几何体相关(BufferGeometry) 使用 BufferGeometry 可以有效减少向 GPU 传输几何体相关数据所需的开销 可以自定义顶点位置, 面片索引, 法向量, ...
- # ThreeJS学习7_裁剪平面(clipping)
ThreeJS学习7_裁剪平面(clipping) 目录 ThreeJS学习7_裁剪平面(clipping) 1. 裁剪平面简介 2. 全局裁剪和局部裁剪 3. 被多个裁剪平面裁剪后 4. 被多个裁剪 ...
- Threejs基础学习【修改版】
一. Three.js官网及使用Three.js必备的三个条件 1.Three.js 官网 https://threejs.org/ 2.使用Three.js必备的三个条件(To actually b ...
- WebGL和ThreeJs学习6--射线法确定3D空间中所选物体
一.在 threejs 中如何确定下图3D空间中鼠标点击位置的 object 对象? 二.射线法确定步骤及代码 //Three.js提供一个射线类Raycaster来拾取场景里面的物体.更方便的使用鼠 ...
- WebGL和ThreeJs学习5--ThreeJS基本功能控件
Threejs 2017年6月6日 15:06 Stats: new Stats();性能监视器,性能测试的方法,引入 Stats.js http://www.hewebgl.com ...
随机推荐
- 一文详解 | 开放搜索兼容Elasticsearch做召回引擎
简介:开放搜索发布开源兼容版,支持阿里云Elasticsearch做搜索召回引擎,本文详细介绍阿里云ES用户如何通过接入开放搜索兼容版丰富行业分词库,提升查询语义理解能力,无需开发.算法投入,即可获 ...
- [FE] uni-app 安装 uview-ui 的两种方式
一. 下载的方式安装 就是把源码放到项目根目录中,然后引入 scss.js,并配置 easycom 模式. https://www.uviewui.com/components/install.htm ...
- ABAP 7.58 中支持任意精度算术的新类
1. 引言 通常,有两种对编程语言的改进.第一种是让困难的事情变得简单,第二种是让不可能的事情变为可能.本文介绍的是任意精度算术,它属于第二类:使在ABAP中原本不可能的事情成为可能. 过去已经可以在 ...
- python3使用dpkt生成PCMA格式rtp流
操作系统 :CentOS 7.6_x64 Python版本:3.9.12 dpkt版本:1.9.8 PCMA编码是VoIP通信中常见的格式,今天整理下CentOS7环境下,python3如何使用dpk ...
- 应急响应--linux入侵排查
- docker-compose 安装 mysql:5.7.31
目录 一.新建一个启动服务的目录 二.新建文件docker-compose.yml 三.新建角本文件 init-mysql.sh 四.实使化目录和配置文件 启动服务 登陆mysql 其它操作 参考文档 ...
- fastposter v2.8.2 发布 电商海报生成器
fastposter v2.8.2 发布 电商海报生成器 fastposter海报生成器,电商海报编辑器,电商海报设计器,fast快速生成海报 海报制作 海报开发.二维码海报,图片海报,分享海报,二维 ...
- C 语言编程 — 指令行参数
目录 文章目录 目录 前文列表 命令行参数 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> < ...
- 5GC 关键技术之网络切片
目录 文章目录 目录 前文列表 网络切片的需求来自于业务对网络提出的差异化要求 基于 3 大业务场景的切片 基于切片资源访问对象的切片 网络切片的商业价值 网络切片的底层技术支撑 网络切片的粒度 网络 ...
- vue-router单页面应用的多标签页使用问题
正常的思维 做多vue页面应用,我们的第一反应是配置多个入口点,多个vue应用,编译成多个HTML文件,由服务器来决定路由.这是正常的思维. 但谁知道单页面应用也能做到类似的效果呢.单页面不过是服务器 ...