Threejs是供js使用的webgl框架

threejs是开源免费的,当有了图形框架,我们便可以省去很多专业知识,而面向api编程,可以更快的构建3D效果。

git地址 : https://github.com/mrdoob/three.js.git

1、运行

可通过git直接执行 git clone https://github.com/mrdoob/three.js.git 拉取源码。
拉取源码后 进入项目目录执行 npm run dev 即可运行。
访问启动端口可看到如下页面:

点击 examples 目录即可进入查看示例:
点击 docs 查看文档,官方有如何引入项目安装,第一个示例、以及提供的各个api解释(新手很难看懂)

首个教程示例

一、介绍

threejs中进行构建画面时,有四个必须元素:

场景:scene, 摄像机:camera,renderer:渲染器,灯光:light

1、场景:场景相当于一个大舞台,你所有的东西都要放在这个舞台上用于展示
2、摄像机: 摄像机相当于你的眼睛,你想观看什么角度看到的东西,就要设置摄像机的位置,以及观看点
3、渲染器: 渲染器就是webgl的封装,用于显示在屏幕上。
4、灯光: 灯光属于一个辅助效果,像阴影,亮度都和灯光有关

二、起步

直接上代码,这里用的vue,所以文件格式为.vue格式,注意 vue 文件中,*

代码要放在 mounted()中,否则created中可能dom树还未加载完会报错。其次 场景 scene 变量要放在 script 标签最前面作为全局变量,不然也会报错,如图:

三、代码如下

 initDraw(){//构建四要素中的场景,上图已声明为全局变量,所以无需用this指针scene = new THREE.Scene(); //设置场景背景,这里的图片 根目录为 vue中的public目录,6张图片分辨率要一致,否则不显示scene.background = new THREE.CubeTextureLoader().setPath('./img/skyBox6/').load(['side.jpg',//前'side.jpg',//后'sky.JPEG',//上'grass.JPEG',//下'side.jpg',//右'side.jpg',//左],()=>this.renderer.render(scene,this.camera));//创建一个四要素中的辅助灯光                        let ambientLight = new THREE.AmbientLight(0xffffff, 0.7);scene.add(ambientLight);//灯光加入场景/*创建四要素中的相机,即人的视角,camera放在vue的data中用于 render()方法中使用参数分别是 角度(好比人睁眼不可能看到180度的平面,离眼睛越远处可视宽高越广),宽高比(可当作分辨率比),即能看到的宽高比值,可视最近距离,当摄像头距离物体小于这个值时,将不再显示,可视最远距离,当摄像头距离物体大于这个值时,将不再显示*/this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / (window.innerHeight), 0.1, 2000);this.camera.position.set(-10, 10, 10);//摄像机坐标,threejs中心为0,0,0//摄像机对准的坐标(俩点决定射线),摄像机坐标为起点,目标点决定的射线方向this.camera.lookAt(new THREE.Vector3(0, 0, 0));/**创建四要素中的渲染器,即人的视角,renderer放在vue的data中用于 render()方法中使用*四大要素最后一个渲染器,用于将摄像机看到的舞台显示在屏幕上*/this.renderer = new THREE.WebGLRenderer({antialias:true});this.renderer.setClearColor(0xffffff, 1.0);//用指定颜色先清屏//渲染器的大小,相当于给 div标签设置宽,高this.renderer.setSize(window.innerWidth,window.innerHeight);//将渲染器加入htmldom树中document.body.appendChild(document.createElement('div')).appendChild(this.renderer.domElement);//这是一个辅助器,用于允许通过鼠标旋转,放大,缩小摄像机看的位置,方便观察3D效果let controls = new OrbitControls(this.camera, this.renderer.domElement);controls.enableRotate =true; //启用旋转controls.enablePan = true; //启用平移controls.enableZoom =true;//启用缩放//创建一个方块模型,用于放到场景中查看let geometry = new THREE.BoxGeometry(3, 3, 3, 30, 30, 30);//加载给方块贴图的图片let map = new THREE.TextureLoader().load('img/skyBox6/sky.JPEG',()=>this.renderer.render(scene,this.camera));//将贴图应用于纹理,纹理可以是普通颜色,也可是这里加载的图片,如果是颜色,将//map:map换成color:'0xffffff'(16进制的rgb) 即可let material = new THREE.MeshPhongMaterial({map:map});//将纹理贴到方块上,形成一个可视的方块物体let box = new THREE.Mesh(geometry, material);scene.add(box);//物体加入 场景中this.render();//所有工作完毕后进行渲染场景}

渲染函数如下:

 render(){requestAnimationFrame(this.render);//相当于setInterval计时器一直循环渲染//调用渲染器的渲染方法,渲染指定的场景,从指定摄像机角度看到的图像this.renderer.render(scene, this.camera)}

四、最后效果如图:

全部代码如下

可直接复制到新建的 .vue文件中运行(图片文件注意目录放在 vue项目public/img/skyBox6目录下:)

<template>
</template>
<script>
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
let scene = undefined
export default {name: 'HomeView',data(){return{renderer:null,camera:null}},methods:{initDraw(){scene = new THREE.Scene();scene.background = new THREE.CubeTextureLoader().setPath('./img/skyBox6/').load(['side.jpg','side.jpg','sky.JPEG',//天空'grass.JPEG','side.jpg','side.jpg',],()=>this.renderer.render(scene,this.camera));let ambientLight = new THREE.AmbientLight(0xffffff, 0.7);scene.add(ambientLight);this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / (window.innerHeight), 0.1, 2000);this.camera.position.set(-10, 10, 10);this.camera.lookAt(new THREE.Vector3(0, 0, 0));this.renderer = new THREE.WebGLRenderer({antialias:true});this.renderer.setClearColor(0xffffff, 1.0);this.renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(document.createElement('div')).appendChild(this.renderer.domElement);let controls = new OrbitControls(this.camera, this.renderer.domElement);controls.enableRotate =true; //启用旋转controls.enablePan = true; //启用平移controls.enableZoom =true;//启用缩放let geometry = new THREE.BoxGeometry(3, 3, 3, 30, 30, 30);let map = new THREE.TextureLoader().load('img/skyBox6/sky.JPEG',()=>this.renderer.render(scene,this.camera));let material = new THREE.MeshPhongMaterial({map:map});let box = new THREE.Mesh(geometry, material);scene.add(box);this.render()},render(){requestAnimationFrame(this.render);this.renderer.render(scene, this.camera)}},mounted(){this.initDraw()}
}
</script>
<style lang="less">.about{}
</style>

Threejs示例一相关推荐

  1. 3D 可视化入门:渲染管线原理与实践

    前端技术深度复盘, 今天也要博学一下~ 一.引子 玩 3D 游戏的时候,有没有想过这些 3D 物体是怎么渲染出来的?其中的动画是怎么做的?为什么会出现穿模.阴影不对.镜子照不出主角的情况?要想解答这些 ...

  2. 绝对干货,直接收藏 | 3D 可视化入门:渲染管线原理与实践

    来自某不愿具名同学的投稿,文章较长建议 PC 端观看~ 一.引子 玩 3D 游戏的时候,有没有想过这些 3D 物体是怎么渲染出来的?其中的动画是怎么做的?为什么会出现穿模.阴影不对.镜子照不出主角的情 ...

  3. threejs基础示例

    1 先打一个架子,这样容易写代码 先看一个结果 <!DOCTYPE html> <html lang="en"> <head><meta ...

  4. threejs 绘制球体_3D可视化库-Threejs调研及简单示例

    0 背景 WebGL是一种3D绘图协议,其允许JavaScript和OpenGL ES2.0结合在一起,为H5 Canvas提供硬件3D加速渲染,可以借助系统显卡在浏览器里更流畅地显示3D场景和模型. ...

  5. threejs 3d网络设备拓扑图绘制示例

    技能点:threejs,Vue,canvas,几何数学. 展示网站:http://jstopo.top 模型上方图标贴图 function drawFaceIcon(scene,url,obj){// ...

  6. ThreeJS的特效合成器和后期处理通道

    最近要写个 web 交互式发光可交互的框架.没查到啥好资料,自己一个人摸索了很久,有些失望,可是毕竟是探索过的东西,所以做个记录,怀念我过去好多天掉的青丝(捂脸).我在前面那篇博客里面已经介绍了如何让 ...

  7. threejs添加立方体_前端图形学(三十)——从源码去看threejs中的光照模型

    欢迎来到[畅哥聊技术]前端图形学相关技术文章,更多精彩内容持续更新中,敬请关注. 上章节回顾 熟悉了threejs中内置的几何图形的渲染原理就是通过顶点渲染 传入自定义顶点渲染自定义的几何图形 本章目 ...

  8. threejs 影子属性_影子场vs.属性访问器接口第2轮

    threejs 影子属性 如果你们还没有注意到Dirk Lemmerman和我之间的(轻松) 摊牌 ,那么让我快速提及一下我们是如何做到这一点的. 首先,Dirk创建了JavaFX技巧23:" ...

  9. threejs对象拾取

    对象拾取 对象拾取也就是要获得鼠标事件发生位置的图形对象.在threejs中,是通过Raycaster 对象来拾取对象的,ray是射线,caster是投射器,从字面上即可理解其工作原理是:从某个方向发 ...

最新文章

  1. 笔记-信息系统安全管理-信息系统的安全属性
  2. 基本注射/资格赛,范围
  3. 前端学习(2912):MvvM的实现原理
  4. 小型云台用的是什么电机_直流电机的工作原理是什么?未来的电动车都会用直流电机吗?...
  5. HDU4027 (线段树/修改区间,询问区间和)
  6. python3.6 配置COCO API出错解决方案
  7. CCF NOI1017 价格查询
  8. 计算机桌面锁定了没设密码怎么解锁,电脑桌面锁屏怎么设置,电脑怎么给手机解锁...
  9. 湘潭大学计算机科学,湘潭大学计算机科学和技术一级学科.doc
  10. 离散数学第二版屈婉玲教材pdf_离散数学 第二版 [屈婉玲,耿素云,张立昂 编著] 2015年版...
  11. UCOS操作系统——创建与删除任务(三)
  12. 有卡却显示无服务器,为什么卡一直显示无服务
  13. 《Accurate eye center localisation by means of gradients》论文阅读
  14. 计算机网络谢希仁(1)
  15. 输入神经网络的数据类型要求,神经网络数据格式
  16. 一个ios工程师必须具备的八大知识技能点
  17. Arduino通过RXTX联通JAVA实现数字温度计案例
  18. C语言~~自制-拼图游戏
  19. http statusCode(状态码) 200、300、400、500序列
  20. 俄罗斯方块java消行_Tetris ai 俄罗斯方块自动消行程序

热门文章

  1. AutoHotKey (AHK) 自定义快捷键
  2. win10怎么安装php有安装包,win10应用商店安装包保存在哪里?
  3. CPA十三--借款费用的确认原则(转载)
  4. 爱普生EPSON Stylus SX130 打印机驱动
  5. 全国计算机有一级学科博士点的学校,拥有一级学科博士点能否说明一个学校的这个专业较强?...
  6. J2ME经验总结之汉字转拼音2
  7. Spark SQL 工作流程源码解析(四)optimization 阶段(基于 Spark 3.3.0)
  8. tp886n设置虚拟服务器,普联TL-WR886N V2-V3如何设置虚拟服务器
  9. SICK新品 | 智能激光型光电传感器W12L详解
  10. 移动端h5页面会被植入广告问题解决