threejs官网

https://threejs.org/docs/index.html#manual/zh/introduction/Installation (官网非常的详细)

导入安装

npm install three (下载安装threejs)

然后就可以在项目中导入threejs

import * as THREE from 'three'

创建场景和相机

就是需要一个场景来呈现 3D效果 相机是 对于在哪个位置来观察这个场景中的3D效果(这里用到的Vue2)

<script>
import * as THREE from 'three'
export default {
camera: null, //相机对象
scene: null, //场景对象
renderer: null, //渲染器对象
mounted () {
this.init()
},
methods: {
init () {
// 先创建一个场景
this.scene = new THREE.Scene();
// 创建一个相机
this.camera = new THREE.PerspectiveCamera(
// 第一个参数是角度 75°
75,
// 第二个参数传入宽高比
// window.innerWidth / window.innerHeight,
600 / 600,
// 近端
0.1,
// 远端
1000
)
// 创建相机定位 set 设置相机位置 x y z
this.camera.position.set(0, 0, 10)
// 把相机添加到场景
this.scene.add(this.camera)
// 创建一个物体 参数是宽高比 一样的大小
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)
// 创建物体材质
const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0Xffff00 })
// 根据几何体和材质创建物体 参数一是物体体 参数二是材质
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
// 将几何体添加到场景
this.scene.add(cube) //初始化渲染器
this.renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小 可以填屏幕大小 参数是宽高
this.renderer.setSize(600, 600)
// 其实现在的renderer就是画布 把画板的dom渲染到画布上
document.querySelector('#container').appendChild(this.renderer.domElement)
// 使用渲染器 通过相机将场景渲染出来
this.renderer.render(this.scene, this.camera)
}
}
}
</script>

上面就可以呈现基本的物体了(关于材质或者渲染器什么的可以去 官网看看非常的详细)

接下来引入轨道  就是物体可以跟随鼠标的移动而移动

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' 
// 创建轨道控制器 第一个参数是相机 第二个参数是 要渲染的元素
const container = new OrbitControls(this.camera, this.renderer.domElement)
// 先执行一下那个渲染函数
   this.render()
    render () {
// 每一帧都会渲染轨道控制器 参数是场景和摄像头
this.renderer.render(this.scene, this.camera)
// 浏览器自带渲染 下一帧的时候就去在执行这个函数
requestAnimationFrame(this.render)
}

 还有一些小功能 (不要在意那些变量都是不同代码找到的所以有些变量不一样嘿嘿)

  //   添加坐标 参数是大小的意思
const axesHelper = new THREE.AxesHelper(5)
// 添加到场景 中
this.scene.add(axesHelper)
// 设置物体的位置
// this.cube.position.set(5,0,0)
// 也可以单独设置
this.cube.position.x += 0.1
// 物体的缩放 set 参数是xyz
this.cube.scale.set(2, 3, 1)
// 也可以设置旋转 set (x,y,z)
// 下面例子 Math.PI代表180° 'XYZ' 表示先旋转什么
// eg:this.cube.rotation.set(Math.PI /4 0,0,'XYZ')
// 下面是代表不断的旋转
this.cube.rotation.x += 0.1
// 这个是threejs 带的算时间的
this.clock = new THREE.Clock()
// 创建控制器
this.container = new OrbitControls(this.camera, this.renderer.domElement)
// 设置控制阻尼器,让控制器更有真实效果 必须在动画循坏的时候调用update().
container.enableDamping = true

当然配合使用一些好用的库 比如gsap(后期有时间会专门写一些这个动画库特别的厉害各种线性动画或者3D动画都是牛的)

https://greensock.com/docs/v3/GSAP 官网

还有一个好用的库  dat.gui 用来控制一些变量来帮助开发(非常的不错用起来也非常简单可以百度一下)

下载安装 npm install --save dat.gui
// 导入dat.gui 控制变量
import * as dat from 'dat.gui'

知道了这些就可以做一些简单的好玩的效果了 但是需要找一些好看的3D模型 这里推荐一个

https://sketchfab.com/3d-models?features=downloadable&sort_by=-likeCount 这个也是threejs官网给的里面有好多的模型而且特别多免费的

下面代码是gltf 模型和组合gsap 动画 包括模型上面带的动画组成的一个会走的宇航员 (非常有意思可以试试)

<template>
<div>
<div id="container" @dblclick="shopOrPlay"></div>
</div>
</template> <script>
import * as THREE from 'three'
// 导入控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
// 导入模型
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
// 导入动画
import gsap from 'gsap'
export default {
data () {
return {
camera: null, //相机对象
scene: null, //场景对象
renderer: null, //渲染器对象
mode: null, // 航天员
container: null,
flag: true,
clock: new THREE.Clock(),
mixer: '',
mixers: [],
animate1: null,
baseZ: 3,
baseR: 0.7,
basePY: -6,
basePX: -8,
baseMixer: null,
stars: null, //星星
mon: null,//月球
};
},
mounted () {
this.init()
},
methods: { init () {
// 初始化场景
this.scene = new THREE.Scene();
// 设置背景
// 初始化相机 75度 宽高比 最小0.1 最大2000
this.camera = new THREE.PerspectiveCamera(75,
(document.documentElement.offsetWidth || window.innerWidth) / (document.documentElement.offsetHeight || window.innerHeight),
0.1,
100000)
// 设置摄像头位置
this.camera.position.set(0, 0, 10)
// // 初始化渲染器
this.renderer = new THREE.WebGLRenderer({
// 抗锯齿
// antialias: true,
alpha: true // 这个是背景透明色
})
// 设置渲染器宽高
this.renderer.setSize((document.documentElement.offsetWidth || window.innerWidth), (document.documentElement.offsetHeight || window.innerHeight))
// 实例化控制器
this.container = new OrbitControls(this.camera, this.renderer.domElement)
this.container.enableDamping = true // 更新摄像头宽高比
this.camera.aspect = (document.documentElement.offsetWidth || window.innerWidth) / (document.documentElement.offsetHeight || window.innerHeight);
// // 更新摄像头投影矩阵
this.camera.updateProjectionMatrix()
// // 添加相机到场景
this.scene.add(this.camera); // 初始化模型
const loader = new GLTFLoader();
// 添加月球
loader.load('/mon/scene.gltf', (gltf) => {
this.mon = gltf.scene
this.mon.scale.set(1500, 1500, 1500)
this.mon.position.set(0, -12, 0) this.scene.add(this.mon); }, undefined, function (error) { });
// 创建一个超大球体 半径一千 后面的是经纬度 切分为各60
const skyGeomtry = new THREE.SphereGeometry(5000, 50, 50)
// 创建一个纹理
const skMaterial = new THREE.MeshBasicMaterial({
side: THREE.DoubleSide, //两面可见
// 添加纹理 为星河纹理
map: new THREE.TextureLoader().load('./images/bj.jpg')
})
// 把球体翻到里面能看见不然是黑色的 俩面可见就不翻转了
skyGeomtry.scale(1, 1, 1)
// 添加材质
const sky = new THREE.Mesh(skyGeomtry, skMaterial) // 添加到场景
this.scene.add(sky)
// 创建宇航员
loader.load('./yuhangyuan/scene.gltf', (gltf) => {
this.mode = gltf.scene
this.mode.scale.set(3, 3, 3)
this.mode.position.set(this.basePX, this.basePY, -90)
this.mode.rotation.set(0, 0, 0)
this.mixer = new THREE.AnimationMixer(gltf.scene.children[0]);
this.baseMixer = this.mixer.clipAction(gltf.animations[0]).setDuration(1)
this.baseMixer.play();
this.animate1 = gsap.to(this.mode.position, {
z: this.baseZ, duration: 8, onComplete: () => {
gsap.to(this.mode.rotation, {
y: this.baseR * Math.PI, duration: 1,
})
},
})
this.mixers.push(this.mixer);
this.scene.add(this.mode);
}, undefined, (error) => { }); // 添加光
let light2 = new THREE.DirectionalLight(0Xfffff, 0.3)
light2.position.set(0, 10, 10) let light1 = new THREE.HemisphereLight();
this.scene.add(light1, light2
)
// // 设置渲染器编码
this.renderer.outputEncoding = THREE.sRGBEncoding;
// 监听屏幕大小变化修改渲染器的宽高相机比例
window.addEventListener('resize', this.size)
// 监听屏幕按键
window.addEventListener('keyup', this.spacemanMove)
document.querySelector('#container').appendChild(this.renderer.domElement)
this.render()
},
render () { // 在这里设置阻尼感
this.container.update()
var delta = this.clock.getDelta();
for (var i = 0; i < this.mixers.length; i++) { // 重复播放动画
this.mixers[i].update(delta - 0.011);
}
this.renderer.render(this.scene, this.camera)
requestAnimationFrame(this.render)
},
size () {
this.camera.aspect = (document.documentElement.offsetWidth || window.innerWidth) / (document.documentElement.offsetHeight || window.innerHeight);
this.camera.updateProjectionMatrix()
this.renderer.setSize((document.documentElement.offsetWidth || window.innerWidth), (document.documentElement.offsetHeight || window.innerHeight))
},
// 宇航员移动
spacemanMove (e) {
if (!this.animate1) return
if (!this.animate1.isActive()) {
if (e.keyCode === 38) {
this.animate1 = gsap.to(this.mode.position, {
z: (this.baseZ -= 3)
})
}
if (e.keyCode === 40) {
this.animate1 = gsap.to(this.mode.position, {
z: (this.baseZ += 3)
})
}
if (e.keyCode === 37) {
this.animate1 = gsap.to(this.mode.rotation, {
y: (this.baseR -= 0.3) * Math.PI
})
}
if (e.keyCode === 39) {
this.animate1 = gsap.to(this.mode.rotation, {
y: (this.baseR += 0.3) * Math.PI
})
}
if (e.keyCode === 87) {
this.animate1 = gsap.to(this.mode.position, {
y: (this.basePY += 2)
})
}
if (e.keyCode === 83) {
this.animate1 = gsap.to(this.mode.position, {
y: (this.basePY -= 2)
})
}
if (e.keyCode === 65) {
this.animate1 = gsap.to(this.mode.position, {
x: (this.basePX -= 3)
})
}
if (e.keyCode === 68) {
this.animate1 = gsap.to(this.mode.position, {
x: (this.basePX += 3)
})
}
}
},
shopOrPlay () {
if (!this.flag) {
this.flag = true
this.baseMixer.play()
} else {
this.flag = false
this.animate1 = gsap.to(this.mode.rotation, {
y: (this.baseR += 2) * Math.PI,
yoyo: true,
duration: 10,
})
this.baseMixer.stop()
}
}
},
beforeDestroy () {
window.removeEventListener('resize', this.size)
window.removeEventListener('keyup', this.spacemanMove)
},
}
</script>
<style scoped lang='scss'>
#container {
background: url("@/assets/bj1.jpg");
background-size: cover;
}
</style>

请多多指教

threeJs构建3D世界的更多相关文章

  1. 3D 世界的钥匙「GitHub 热点速览 v.22.08」

    有没有想过把身边的物件儿转成 3D 动画,在网页上实现一把?本期特推的项目 Three.js 就是帮你创建 3D 页面的知名开源项目,好玩的 3D 世界在向你招手.除了打开浏览器 3D 世界的钥匙外, ...

  2. threejs构建web三维视图入门教程

    本文是一篇简单的webGL+threejs构建web三维视图的入门教程,你可以了解到利用threejs创建简单的三维图形,并且控制图形运动.若有不足,欢迎指出. 本文使用的框架是three.js gi ...

  3. Threejs 开发3D地图实践总结【转】

    Threejs 开发3D地图实践总结   前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂 ...

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

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

  5. 转 threejs中3D视野的缩放实现

    Threejs基础部分学习知道透视相机new THREE.PerspectiveCamera(fov, aspect , near,far)中. fov视野角(拍摄距离)越大,场景中的物体越小.fov ...

  6. NeHe OpenGL教程 第十课:3D世界

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. 第1部分: 游戏引擎介绍, 渲染和构造3D世界

    原文作者:Jake Simpson译者: 向海Email:GameWorldChina@myway.com ---------------------------------------------- ...

  8. 【Stage3D学习笔记续】真正的3D世界(六):空间大战

    这就是书上的最终效果了,一个完整的空间大战游戏: 点击查看源码 这里并没有太多的新知识,所涉及的东西更多的是游戏开发方面的优化和技巧,下面我们大家一起来看看: 飞船: 类似粒子效果中的粒子创建方法,我 ...

  9. 【Stage3D学习笔记续】真正的3D世界(二):显示模型

    虽然我们进入真3D世界了,但是上一章的Demo仍然是显示的一个平面,尽管我们的平面在3D空间中旋转可以看出一点3D透视的效果,但是既然是真3D,就要拿出点3D的样子来! 如果要显示3D模型,我们就要告 ...

  10. 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵

    如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...

随机推荐

  1. 记一次 .NET 某娱乐聊天流平台 CPU 爆高分析

    一:背景 1.讲故事 前段时间有位朋友加微信,说他的程序直接 CPU=100%,每次只能手工介入重启,让我帮忙看下到底怎么回事,哈哈,这种CPU打满的事故,程序员压力会非常大, 我让朋友在 CPU 高 ...

  2. SQL--插入单引号值

    sql语句中插入单引号的值需要多写一个单引号进行转义 例如:插入一个值为student' name的值 update table set name='student'' name'

  3. day02-实现01

    实现01 1.实现任务阶段1 编写mytomcat,该服务器能给浏览器返回"你好,我是服务器!"的简单信息. 根据之前的tomcat框架整体分析,我们将浏览器发送请求,tomcat ...

  4. 【网络】https 轻解读

    Abstract TLS.SSL.摘要(digest).对称/非对称加密.数字签名(signature).证书(certification),傻傻分不清楚?为了解 https, 鄙人对以上这几个名词都 ...

  5. 【云原生 · Kubernetes】runtime组件

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying runtime组件 8.1 部署cri-o组件 8.2 下载二进制文件 8.3 修改配置文件 ...

  6. 重新认识下JVM级别的本地缓存框架Guava Cache——优秀从何而来

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 不知不觉,这已经是<深入理解缓存 ...

  7. i春秋Zone

    打开网页是个简单的表单填写, 尝试注入....没用 查看源码,没找到什么有用的信息 只有抓包了 发现一个cookie的login值为0,改为1试试 没什么特别的回显,但这应该就是登录与否的判定了,所以 ...

  8. 前后端结合解决Excel海量公式计算的性能问题

    背景 在数据密集的业务领域,尤其是金融,保险,税务等行业中,经常需要利用Excel模型,来对业务进行分析和处理.例如: 1.金融投资: 根据模型进行估值计算,并对投资风险进行评估,通过测算出投资的内部 ...

  9. MongoDB - 事务支持

    事务简介 事务是数据库中处理的逻辑单元,每个事务中包括一个或多个数据库操作,既可以是读操作,也可以是写操作. ACID 是一个"真正"事务所需要具备的一组属性集合,指的是原子性(A ...

  10. 学习 vue3 第一天 vue3简介,创建vue3项目 Composition Api 初识

    前言: 从今天开始来和大家一起学习 vue3 相信大家都不陌生,已经火了一段时间了,但是还是有不少人没有学习,那就跟着六扇老师来简单的入个门 废话不多说,来开始今天的学习 Vue3 简介: 2020年 ...