three.js-走进3d的奇妙世界一创建一个三维场景
一、git代码仓库地址
git clone https://github.com/josdirksen/learning-threejs-third 下载并解压
二、创建一个三维场景
如下图所示是一个三维场景,包括了一个几何体,球,平面,坐标系等等。
那么这些东西究竟是怎么实现呢,在未了解three.js之前,我也一直对这些东西感到疑惑。今天就带大家一起走进3d的奇妙世界。
大家都知道在现实生活中,我们能看到或者感觉到阳光,雨水,高山,风等等,那么在3d的世界中这么东西都是以怎么样子构建的呢。
在three中存在了几个重要的东西用来实现对现实生活中的模拟。
1.camera(相机):他就像人的眼睛一样,用来观察一切事物,没有他我们就什么都看不见。当然他也有许多属性,譬如相机的位置,观看的方向,相机的旋转角度(可以想象一下你拿相机照相的情形)
2.scene(场景):可以想象成一个真实的世界,如果没有了世界,那其他也就什么都没有了
3.renderer(渲染器):渲染器会基于摄像机的角度来计算场景对象在浏览器中渲染成什么样子
// 创建场景
var scene = new THREE.Scene();
// 创建相机 接收四个参数fov aspect near far
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
// 创建渲染器
var renderer = new THREE.WebGLRenderer();
renderer.setClearColor(new THREE.Color(0x000000)); //将场景的背景颜色设置为黑色
renderer.setSize(1000,400); //设置场景的大小
renderer.shadowMap.enabled = true; //渲染阴影,后面有提到
document.getElementById("demo").appendChild(renderer.domElement); // 要渲染的div
renderer.render(scene ,camera )
下面解释如何在刚刚建好的环境中添加三维对象
首先我们创建一个坐标系,便于直观的看出三维模型,这里的坐标系使用的右手坐标系。可以拿出右手体会下。
// 添加坐标轴 线宽为20
var axes = new THREE.AxesHelper(20)
//并把坐标系添加到场景中
scene.add(axes)
现在场景中有了一个三维对象,就如现实世界中有了事物,有了眼睛。但是我们站在哪里,以什么角度去看呢,这就需要设置摄像机的位置,观看的角度
// 相机位置
camera.position.set(-30, 40, 30);
// 相机看的方向 为场景的方向也可以设置成其他方向
camera.lookAt(scene.position);
我们继续分别添加一个平面、球型和正方体
// 创建平面
// 创建平面的大小
var planeGeometry = new THREE.PlaneGeometry(60,20,1,1);
// 创建平面的材质MeshLambertMaterial
var planeMaterial = new THREE.MeshLambertMaterial({
color:0xffffff
});
var plane = new THREE.Mesh(planeGeometry,planeMaterial);
plane.receiveShadow = true; //平面是否接受投影
plane.position.set(15, 0, 0); //平面的位置
plane.rotation.x = -0.5 * Math.PI; //平面绕x轴旋转90度 scene.add(plane);
// 添加立方体长宽高 4 4 4
var cubeGeometry = new THREE.BoxGeometry(4, 4, 4);
var cubeMaterial = new THREE.MeshLambertMaterial({
color: 0xFF0000,
wireframe: true
});
var cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
cube.position.set(-4, 4, 0);
cube.castShadow = true; //是否投影
scene.add(cube);
//创建球体
var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
var sphereMaterial = new THREE.MeshLambertMaterial({
color: 0x7777FF,
wireframe: true
});
var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphere.position.set(20, 0, 0);
sphere.castShadow = true;
scene.add(sphere);
最后添加光源,此外在需要在rendrer中渲染阴影
// 添加光源
var ambienLight = new THREE.AmbientLight(0x353535);
scene.add(ambienLight);
var spotLight = new THREE.SpotLight(0xFFFFFF);
spotLight.position.set(-10, 20, -5);
spotLight.castShadow = true;
scene.add(spotLight);
function init(){
// 创建场景
var scene = new THREE.Scene();
// 创建相机 接收四个参数fov aspect near far
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setClearColor(new THREE.Color(0x000000)); //将场景的背景颜色设置为黑色
renderer.setSize(1000,400);
renderer.shadowMap.enabled = true;
// 添加坐标轴
var axes = new THREE.AxesHelper(20)
scene.add(axes)
// 创建平面
// 创建平面的大小
var planeGeometry = new THREE.PlaneGeometry(60,20,1,1);
// 创建平面的材质
var planeMaterial = new THREE.MeshLambertMaterial({
color:0xffffff
});
var plane = new THREE.Mesh(planeGeometry,planeMaterial);
plane.receiveShadow = true;
plane.position.set(15, 0, 0);
plane.rotation.x = -0.5 * Math.PI; scene.add(plane);
// 添加立方体
var cubeGeometry = new THREE.BoxGeometry(4, 4, 4);
var cubeMaterial = new THREE.MeshLambertMaterial({
color: 0xFF0000,
wireframe: true
});
var cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
cube.position.set(-4, 4, 0);
cube.castShadow = true;
scene.add(cube);
//创建球体
var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
var sphereMaterial = new THREE.MeshLambertMaterial({
color: 0x7777FF,
wireframe: true
});
var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphere.position.set(20, 0, 0);
sphere.castShadow = true;
scene.add(sphere);
// 相机位置
camera.position.set(-30, 40, 30);
// 相机看的方向
camera.lookAt(scene.position);
// 添加光源
var ambienLight = new THREE.AmbientLight(0x353535);
scene.add(ambienLight); var spotLight = new THREE.SpotLight(0xFFFFFF);
spotLight.position.set(-10, 20, -5);
spotLight.castShadow = true;
scene.add(spotLight); document.getElementById("webgl-output").appendChild(renderer.domElement);
var step = 0;
renderScene();
function renderScene(){
// stats.update();
cube.rotation.x += 0.02;
cube.rotation.y += 0.02;
cube.rotation.z += 0.02;
step += 0.04;
sphere.position.x = 20 + (10 * (Math.cos(step)));
sphere.position.y = 2 + (10 * Math.abs(Math.sin(step)));
requestAnimationFrame(renderScene);
renderer.render(scene, camera);
}
}
three.js-走进3d的奇妙世界一创建一个三维场景的更多相关文章
- Three.js - 走进3D的奇妙世界
本文将通过Three.js的介绍及示例带我们走进3D的奇妙世界. 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第6期-支付结算部支付研发团队前端研发高级工程师-刘琳<three. ...
- MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界
MYSQL(基本篇)--一篇文章带你走进MYSQL的奇妙世界 MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的"精通MYSQL等数据库及优化 ...
- js 数组 添加或删除 元素 splice 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素 filter
里面可以用 箭头函数 splice 删除 增加 数组 中元素 操作数组 filter 创建新数组 检查指定数组中符合条件的所有元素
- Three.js 实现3D开放世界小游戏:阿狸的多元宇宙 🦊
声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 2545光年之外的开普勒1028星系,有一颗色彩斑斓的宜居星球 ,星际移民 ...
- Miox带你走进动态路由的世界——51信用卡前端团队
写在前面: 有的时候再做大型项目的时候,确实会被复杂的路由逻辑所烦恼,会经常遇到权限问题,路由跳转回退逻辑问题.这几天在网上看到了51信用卡团队开源了一个Miox,可以有效的解决这些痛点,于是乎我就做 ...
- [C#] 走进异步编程的世界 - 开始接触 async/await
走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...
- [C#] 走进异步编程的世界 - 剖析异步方法(上)
走进异步编程的世界 - 剖析异步方法(上) 序 这是上篇<走进异步编程的世界 - 开始接触 async/await 异步编程>(入门)的第二章内容,主要是与大家共同深入探讨下异步方法. 本 ...
- [C#] 走进异步编程的世界 - 剖析异步方法(下)
走进异步编程的世界 - 剖析异步方法(下) 序 感谢大家的支持,这是昨天发布<走进异步编程的世界 - 剖析异步方法(上)>的补充篇. 目录 异常处理 在调用方法中同步等待任务 在异步方法中 ...
- [C#] 走进异步编程的世界 - 在 GUI 中执行异步操作
走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5877042.html 序 这是继<开始接 ...
随机推荐
- Postman Interceptor安装成功却无法在Postman启用的解决办法
新手在使用 Postman 和Postman Interceptor的过程中总会遇到各种各样的问题.我们 chrome插件网 争取在这里汇总大家遇到的所有的问题的解决方案.今天要分享的解决方案问题是: ...
- Read Uncommitted
Read Uncommitted是隔离级别最低的一种事务级别.在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirt ...
- J2EE学习篇之--JQuery技术详解
前面我们讲解了的J2EE的技术都是服务端的技术,下面我们来看一下前端的一些开发技术,这一篇我们来看一下jQuery技术 简介: jQuery由美国人John Resig创建,至今已吸引了来自世界各地的 ...
- 如何加大jvm的内存和tomcat的内存
如何扩大jvm的内存和tomcat的内存,如何让项目没有用的值得到及时的回收和清理,java项目 最佳答案 修改 tomcat 的内存方式:修改 catalina.bat在set JAVA_OPT ...
- QtConcurrent::run() 的使用
QFuture<T>run(constClass *object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constA ...
- Python Elasticsearch api,组合过滤器,term过滤器,正则查询 ,match查询,获取最近一小时的数据
Python Elasticsearch api 描述:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.下 ...
- 关于RF做自动化大致流程的梳理
RF只是一个框架,类似于单元测试框架,可以实现对用例的有效管理.结合其它第三方库,可以进行,接口,数据库,APP的自动化测试.结合JENKINS,还可以进行有效的持续集成. 本文不讲调用第三方库的哪些 ...
- json 报错415 400
JS操作JSON总结 $(function(){ $.ajax({ method: 'post', url: '/starMOOC/forum/getSectionList', dataType: ...
- PAT_A1050#String Subtraction
Source: PAT A1050 String Subtraction (20 分) Description: Given two strings S1 and S2, S=S1− ...
- POJ 1329 Circle Through Three Points(三角形外接圆)
题目链接:http://poj.org/problem?id=1329 #include<cstdio> #include<cmath> #include<algorit ...