Three.js 入门
Demo代码地址:
https://gitee.com/s0611163/three.js-demo
Three.js
Three.js下载
从GitHub上下载一个Release版本,https://github.com/mrdoob/three.js,本Demo使用的是r112版本,下载地址:three.js-r112
解压,复制build文件夹到Demo的threejs/build文件夹,examples/jsm文件夹到threejs/js文件夹,examples/textures/equirectangular/venice_sunset_1k.hdr文件复制到threejs/assets文件夹
threejs/js文件夹中的文件,引用three.module.js的路径需要修改
修改threejs/js/OrbitControls.js,交换841和864行、843和866行即可,修改前鼠标右键控制旋转、中键控制放大缩小,修改后鼠标中键控制旋转,鼠标右键控制放大缩小
修改threejs/js/OrbitControls.js,分别在文件开头和607行代码前添加如下代码
import { Euler } from "../../build/three.module.js";
var euler = new Euler(0, 0, 0, 'YXZ');
function getTarget(length) {
var position = scope.object.position.clone();
var length = length || (spherical.radius > 700 ? spherical.radius : 700);
euler.setFromQuaternion(scope.object.quaternion);
position.set(position.x - length * Math.sin(euler.y), position.y + length * Math.sin(euler.x), position.z - length * Math.cos(euler.y));
return position;
}
this.getTarget = getTarget;
场景(Scene)
import * as THREE from '../build/three.module.js';
let scene = new THREE.Scene();
相机(Camera)
let near = 1;
let far = 20000;
let el = document.querySelector("#threeContainer");
/*
创建相机对象
PerspectiveCamera透视投影相机
OrthographicCamera正交投影相机
*/
let camera = new THREE.PerspectiveCamera(60, el.clientWidth / el.clientHeight, near, far);
scene.add(camera);

渲染器(Renderer)
let renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.domElement.id = 'threeCanvas';
renderer.physicallyCorrectLights = true;
renderer.outputEncoding = THREE.sRGBEncoding;
renderer.setClearColor(0x002b4b);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(el.clientWidth, el.clientHeight);
el.appendChild(renderer.domElement);
灯光
//环境光
let ambientLight = new THREE.AmbientLight(0xFFFFFF, 0.5);
camera.add(ambientLight);
//平行光
let directionalLight = new THREE.DirectionalLight(0xFFFFFF, 1);
directionalLight.position.set(0.5, 0, 0.866); // ~60º
camera.add(directionalLight);
相机控制
import { MapControls } from '../js/controls/OrbitControls.js';
//创建场景控制对象
let controls = new MapControls(this.camera, this.renderer.domElement);
controls.autoRotate = false;
controls.autoRotateSpeed = -10;
//设置相机位置和焦点
camera.position.set(-12.34, 120.88, -48.14);
controls.target.set(-12.52, 3.72, -12.54);
controls.update();
加载模型
以GLTF格式的模型为例
import { GLTFLoader } from '../js/loaders/GLTFLoader.js';
let onProgress = function (xhr) { }; //加载进度
let onError = function (xhr) { }; //加载出错
let url = '"./GLTF/four/hefeiqizhong/hfqz_yc.glb"';
let loader = new GLTFLoader();
loader.load(url, gltf => {
const model = gltf.scene || gltf.scenes[0];
scene.add(model);
}, onProgress, onError);
几何体、材质、网格
圆柱几何体的构造函数:
CylinderGeometry(radiusTop : Float, radiusBottom : Float, height : Float, radialSegments : Integer, heightSegments : Integer, openEnded : Boolean, thetaStart : Float, thetaLength : Float)
radiusTop — 圆柱的顶部半径,默认值是1。
radiusBottom — 圆柱的底部半径,默认值是1。
height — 圆柱的高度,默认值是1。
radialSegments — 圆柱侧面周围的分段数,默认为8。
heightSegments — 圆柱侧面沿着其高度的分段数,默认值为1。
openEnded — 一个Boolean值,指明该圆锥的底面是开放的还是封顶的。默认值为false,即其底面默认是封顶的。
thetaStart — 第一个分段的起始角度,默认为0。(three o'clock position)
thetaLength — 圆柱底面圆扇区的中心角,通常被称为“θ”(西塔)。默认值是2*Pi,这使其成为一个完整的圆柱。
//圆柱几何体
let cylinder = new THREE.CylinderGeometry(0, 100, 300, 32); //参数分别表示 圆柱的顶部半径、圆柱的底部半径、圆柱的高度、圆柱侧面周围的分段数
//几何体旋转
cylinder.rotateX(Math.PI / 2); //绕x轴旋转90度
//基础网格材质
let material = new THREE.MeshBasicMaterial({ color: 0xff0000, opacity: 0.5, transparent: true });
//网格
let mesh = new THREE.Mesh(cylinder, material);
//将物体添加到场景中
scene.add(mesh);
动画
使用tween.js实现动画
let position = [-205, 3479, 4412];
let target = [-179, 186, 519];
let tween = new TWEEN.Tween(camera.position).to({
x: position[0],
y: position[1],
z: position[2]
}, 3000).start().onUpdate(() => {
controls.target.set(...target);
controls.update();
}).onComplete(() => {
TWEEN.remove(this.tween);
});
着色器
实现Three.js未提供的特殊效果时需要使用着色器语言,例如实现带箭头的线、火焰效果时可能会用到,语法类似C语言
WebGL和Three.js在线教程
http://www.yanhuangxueyuan.com/
Demo截图

Three.js 入门的更多相关文章
- 1. web前端开发分享-css,js入门篇
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
- Ember.js入门教程、博文汇总
第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...
- JS入门之ActiveXObject对象(转载)
JS入门之ActiveXObject对象 此对象提供自动化对象的接口. function ActiveXObject(ProgID : String [, location : String] ...
- Node.js 入门手册:那些最流行的 Web 开发框架
这篇文章与大家分享最流行的 Node.js Web 开发框架.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编 ...
- 【特别推荐】Node.js 入门教程和学习资源汇总
这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
- 让我们一起学习《Node.js入门》一书吧!
Node.js入门 读完本书之后,你将完成一个完整的web应用,该应用允许用户浏览页面以及上传文件. 里面对一些知识的讲解,让你略窥Node.js的门径.最好一段代码一段代码的写下来,我的习惯是手里拿 ...
- web前端开发分享-css,js入门篇(转)
转自:http://www.cnblogs.com/jikey/p/3600308.html 关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人 ...
- Node.js入门实例程序
在使用Node.js创建实际“Hello, World!”应用程序之前,让我们看看Node.js的应用程序的部分.Node.js应用程序由以下三个重要组成部分: 导入需要模块: 我们使用require ...
- Underscore.js(1.7.0) 中文文档 Underscore.js 入门
原文地址:http://www.css88.com/doc/underscore/ Underscore.js 入门 http://www.tuicool.com/articles/jQ3IfeR
随机推荐
- 四载磨砺,一群青年“识瘤者”以AI助力医疗创新
本文分享自华为云社区<[先锋开发者云上说]四载磨砺,一群青年"识瘤者"以AI助力医疗创新>,作者:Gauss松鼠会小助手2 . 一群青年"识瘤者" ...
- rust程序设计(5)结构体相关练习题| 附带解答
题目 基础结构体练习: 创建一个名为Person的结构体,包含name(字符串类型)和age(整数类型)两个字段. 写一个函数,接收一个Person实例作为参数,并打印出这个人的名字和年龄. 结构体方 ...
- 关于微信小程序中如何实现数据可视化-echarts动态渲染
移动端设备中,难免会涉及到数据的可视化展示.数据统计等等,本篇主要讲解原生微信小程序中嵌入echarts并进行动态渲染,实现数据可视化功能. 基础使用 首先在GitHub上下载echarts包 地址: ...
- 浏览器跨 Tab 窗口通信原理及应用实践
最近,相信大家一定被这么个动效给刷屏了: 以至于,基于这个效果的二次创作层出不穷,眼花缭乱. 基于跨窗口通信的弹弹球: 基于跨窗口通信的 Flippy Bird: 我也尝试制作了一个跨 Tab 窗口的 ...
- Go语言函数详解
函数 (1)函数的定义 函数使用func进行定义 函数是基本的代码块,用于执行一个任务 Go语言至少有一个main函数 函数声明告诉了编译器函数的名称,返回类型和参数 //1.无参数无返回值函数的定义 ...
- 使用javafx,结合讯飞ai,搞了个ai聊天系统
第一步:先在讯飞ai那边获取接入的api 点进去,然后出现这个页面: 没有的话,就点击免费试用,有了的话,就点击服务管理: 用v2.0的和用3的都行,不过我推荐用2.0版本 文档位置:星火认知大模型W ...
- JQuery_2
1.动画: 1.三种方式显示和隐藏元素 1.默认方式 1.show([speed,[easing],[fn]]) 1.参数: 1. ...
- C++学习笔记三:变量与数据类型(浮点型)
1. 数据类型与所占内存大小 类型 大小 精度 注意 float 4 7 double 8 15 默认 long double 16 >double 精度就是有效数字. 2. 声明和初始 ...
- Apache POI 操作Excel简单入门使用
Apache POI简介 开发中经常会涉及到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel ...
- C和C++练习
要点: 1.数组 2.冒泡排序BubbleSort 3.带指针的结构体(malloc,free) 4.字符串操作(拷贝.逆序.比较) 5.格式化输出printf,sprintf 6.格式化输入,sca ...