创建第一个应用

使用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的更多相关文章

  1. threejs创建地球

    上个月底,在朋友圈看到一个号称“这可能是地球上最美的h5”的分享,点进入后发现这个h5还很别致,思考了一会,决定要不高仿一个? 到今天为止,高仿基本完成, 线上地址 github地址 除了手机端的me ...

  2. 高仿QQ Xplan的H5页面

    概述 这个h5的主要玩法很简单:地球自转的时候会播放背景音乐(比如海浪声),为了找到这个声音是从哪个地球上哪个地方传来的,需要长按下方的按钮,这时地球会自动转动到目标地点,然后镜头拉近,穿过云层,最后 ...

  3. 初识webgl--我的webgl学习第一课(基于threeJs)

    一,我为什么要学习webgl 一个偶然的机会,在和朋友的聊天过程中,听说了webgl,也许过去也看到过,但是没有特别在意过.原来,JavaScript也可以很好的渲染并在网页上显示三维动画,不用借助插 ...

  4. gis和threejs的学习资料

    *********************************** 基础知识/名词 瓦片/矢量瓦片GeoJson - 绘制GeoJson看数据, geojson规范, 中文版 ********** ...

  5. threejs和3d各种效果的学习

    写给即将开始threejs学习的自己,各种尝试,各种记忆.不要怕,灰色的年华终会过去. 一个技术学习的快慢,以及你的深刻程度,还有你的以后遇到这个东西的时候的反应速度,很大程度上,取决于你的博客的深刻 ...

  6. ThreeJS学习6_几何体相关(BufferGeometry)

    ThreeJS学习6_几何体相关(BufferGeometry) 使用 BufferGeometry 可以有效减少向 GPU 传输几何体相关数据所需的开销 可以自定义顶点位置, 面片索引, 法向量, ...

  7. # ThreeJS学习7_裁剪平面(clipping)

    ThreeJS学习7_裁剪平面(clipping) 目录 ThreeJS学习7_裁剪平面(clipping) 1. 裁剪平面简介 2. 全局裁剪和局部裁剪 3. 被多个裁剪平面裁剪后 4. 被多个裁剪 ...

  8. Threejs基础学习【修改版】

    一. Three.js官网及使用Three.js必备的三个条件 1.Three.js 官网 https://threejs.org/ 2.使用Three.js必备的三个条件(To actually b ...

  9. WebGL和ThreeJs学习6--射线法确定3D空间中所选物体

    一.在 threejs 中如何确定下图3D空间中鼠标点击位置的 object 对象? 二.射线法确定步骤及代码 //Three.js提供一个射线类Raycaster来拾取场景里面的物体.更方便的使用鼠 ...

  10. WebGL和ThreeJs学习5--ThreeJS基本功能控件

      Threejs 2017年6月6日 15:06 Stats: new Stats();性能监视器,性能测试的方法,引入 Stats.js        http://www.hewebgl.com ...

随机推荐

  1. 双引擎驱动Quick BI十亿数据0.3秒分析,首屏展示时间缩短30%

    ​简介:在规划中,Quick BI制定了产品竞争力建设的三大方向,包括Quick(快)能力.移动端能力和集成能力.针对其中的产品"报表查看打开慢""报表开发数据同步慢&q ...

  2. 外部工具连接SaaS模式云数据仓库MaxCompute实战——商业BI分析工具篇

    简介: MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库,以 Serverless 架构提供快速.全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户 ...

  3. [MongoDB] aggregate 查询的优化思路

    首先从业务角度出发,不必要的筛选条件和粗略的筛选条件会严重影响查询速度,比如 $or 查询和 $in 查询,视情况尽可能去掉. 程序中打印出查询条件的各部分,有 $match.$group.比如 PH ...

  4. 安全机密管理:Asp.Net Core中的本地敏感数据保护技巧

    前言 在我们开发过程中基本上不可或缺的用到一些敏感机密数据,比如SQL服务器的连接串或者是OAuth2的Secret等,这些敏感数据在代码中是不太安全的,我们不应该在源代码中存储密码和其他的敏感数据, ...

  5. 2019-4-12-VisualStudio-好用插件集合

    title author date CreateTime categories VisualStudio 好用插件集合 lindexi 2019-04-12 09:37:47 +0800 2019-0 ...

  6. 开发日志:windows 服务器禁用TLS1.0和TLS1.1协议使网站更安全

    SSL/TLS 的版本 协议 发布时间 状态 SSL 1.0 未公布 未公布 SSL 2.0 1995 年 已于 2011 年弃用 SSL 3.0 1996 年 已于 2015 年弃用 TLS 1.0 ...

  7. k8s核心资源Job&&CronJob调度pod

    一.Job与CronJob概念与与原理解读 Job 控制器用于管理 Pod 对象运行一次性任务,比方说我们对数据库备份,可以直接在 k8s 上启动一个 mysqldump 备份程序,也可以启动一个 p ...

  8. EPAI手绘建模APP常用工具栏_1

    1.常用工具栏 图 1 常用工具栏 (1) 撤销 (2) 重做 (3) 删除 (4) 复制 ① 选中场景中的模型后,复制按钮变成可用状态,否则变成禁用状态.可以选择多个模型一起复制. (5) 变换 图 ...

  9. nginx与location规则

    ========================================================================= 2018年3月28日 记录: location = ...

  10. 🔥🔥🔥httpsok-v1.8.0 SSL证书自动续签就应该这么简单

    httpsok-v1.8.0 SSL证书自动续签就应该这么简单 简介 一行命令,一分钟轻松搞定SSL证书自动续期 httpsok 是一个便捷的 HTTPS 证书自动续签工具,专为 Nginx 服务器设 ...