Threejs 快速入门

news2024/11/22 8:44:45

最小环境

首先,在正式学习Threejs前,有几个概念需要说明的。Threejs在底层其实还是调用html5中的canvas api来实现绘图的。但和我们一般绘制2D图像不同,Threejs在底层使用的是canvas的webgl context来实现3D绘图。webgl context本身更多是直接对gpu的操作,用起来相当不直观,为此Threejs在顶层对3D绘图所需的各种元素(例如场景,摄影机,灯光,几何图像,材质等)进行了封装,如果我们需要使用Threejs来绘图,只需要创建一个最小绘图环境即可,这个最小绘图环境包含了三个要素:

1.场景--包含所有需要显示的3D物体以及其他相关元素的容器

2.摄像机--决定3D场景如何投影到2D画布之上

3.渲染器--用于最后绘制的画笔

具体的代码如下:

<div class="km_insert_code">

    import { Scene, PerspectiveCamera, WebGLRenderer } from ‘three’;

    var scene = new Scene(); // 创建场景

    var camera = new PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000); // 创建摄影机
    camera.position.z = 8;

    var renderer = new WebGLRenderer(); // 创建渲染器
    renderer.setSize(window.innerWidth, window.innerHeight); // 设置画布大小
    renderer.setPixelRatio(window.devicePixelRatio); // 设置像素比,针对高清屏
    renderer.setClearColor(0x000000, 1); // 设置默认背景色

    document.body.appendChild(renderer.domElement); // 把画笔插入到dom中

</div>

复制

简单的几句代码,就可以建立起一个最小绘图环境,之后只要我们向这个环境中放入需要显示的3D对象,这些对象就会被绘制在画布中,显示在屏幕上。

3D**对象**

有了环境,我们还需要告诉Threejs,到底需要显示什么物体。为此,我们首先需要定义这个用于显示的物体,然后把他加入到场景中即可。

<div class="km_insert_code">

    import { Mesh, MeshBasicMaterial, BoxGeometry } from ‘three’;

    var geometry = new BoxGeometry(1, 1, 1); // 创建一个长方体,用来定义物体的形状

    var material = new MeshBasicMaterial({ color: 0xff0000 }); // 创建一个材质,用来定义物体的颜色

    var mesh = new Mesh(geometry, material); // 使用形状和素材,来定义物体

    scene.add(mesh);

    renderer.render(scene, camera);

</div>

复制

先看看效果

怎么感觉好无聊,哈哈哈,但不管怎么样,我们已经可以绘制出东西来了。

形状和材质

估计大家看了上面的代码,一定会有一些疑问,那个texture是什么鬼,geometry和material又是用来干嘛的。其实Threejs在定义一个3D物体时,需要提供两个信息,第一是形状信息,也就是这个物体上每一个点,每一个面的坐标信息,第二是材质信息,用于告诉Threejs物体的颜色,纹理,反光等信息。有了这些信息,Threejs才知道要如何渲染这个物体。而上面的new BoxGeometry(1, 1, 1),就是告诉Threejs,我要显示一个长宽高各为1的长方形。而new MeshBasicMaterial({ color: 0xff0000}),就是要告诉Threejs,这个长方体是红色的。最后根据形状和素材,new Mesh(geometry, material),生成需要显示的物体。

上面提到在Threejs中如果要生成一个长方体,则需要定义一个BoxGeometry,那除了长方体,Threejs还可以生成形状呢:

1.BoxGeometry--长方体

2.CircleGeometry--圆形平面

3.CylinderGeometry--圆柱体

4.PlaneGeometry--方形平面

5.RingGeometry--环形平面

6.SphereGeometry--球形

7.TextGeometry--文字

8.TorusGeometry--圆环

9.TubeGeometry--圆管

另外上面写到的MeshBasicMaterial,其实是指一个直接就能显示颜色的材质。什么叫直接显示颜色呢?这里要涉及到Threejs里的灯光设置。物体的材质由于确定物体的颜色,纹理,以及反光等属性。要反光,首先需要有一个光源:

<div class="km_insert_code">

    import { SpotLight } from ‘three’;

    var light = new SpotLight(0xffffff);
    light.position.z = 5;
    light.position.x = 5;
    light.position.y = 5;

    scene.add(light);

</div>

复制

这里我们定义了一个白光源,具体的效果如下:

为了可以看清楚效果,我在场景中加入了一个绿色平面,可以看到,这个绿色平面上的反光是从下到上减弱,可见,这个光源是在画面的下方。

如果我把光源的强度减弱,那么平面上的反光也会跟着减弱:

但不知大家有木有发现,绿色平面上的反光是减弱了,但红色的那个长方体,还是一样的红,完全没有变化。其实这就体现出不同材质的区别了,在红色长方体上,我采用的是MeshBasicMaterial这种材质,而在绿色平面上,我采用的是另一种称为MeshLambertMaterial的材质,这种材质的特点是漫反射强烈,主要用来模拟真实环境下的物体,例如木材,石料等物质的反光情况。另外Threejs还有另外一种材质叫MeshPhongMaterial,这种材质主要是镜面反射强烈,用来模拟镜子,金属等拥有高光的物体就比较合适。

MeshLambertMaterial和MeshPhongMaterial两种材质,都是需要光照才能看到的,如果场景中没有光源,你将会什么都看不到。相反我们在红色长方体上采用的材质是MeshBasicMaterial,这种材质即使没有光,也可以看到,你可以想象为它自己发光吧,如果用技术一点的话来说,就是MeshLambertMaterial和MeshPhongMaterial两种材质需要根据场景光线的数值来计算显示在屏幕上的颜色,而MeshBasicMaterial则忽略光线的作用,是什么颜色,就直接显示什么颜色,但也由于这种材质忽略了光照的作用,那么它也不会有任何阴影的效果。所以这种材质就叫Basic,用来做演示就十分合适。一下就是Threejs提供给我们用到的其他材质

1.MeshBasicMaterial

2.MeshLambertMaterial--漫反射材质

3.MeshPhongMaterial--镜面反射材质

4.MeshDepthMaterial--根据物体上每一点到摄像机的远近来显示颜色,远的显示黑色,近的显示白色

5.MeshNormalMaterial--根据物体上每一面的法向量方向来显示颜色

纹理贴图

如果绘制3D物体时,只能使用纯色,那也未免太单调了,没关系,Threejs提供了接口来帮忙解决这个问题。Threejs的材质,除了可以设置颜色,还支持纹理贴图,我们可以把一个图片,覆盖在3D物体上作为他的纹理,这样就可以利用这些贴图来模拟更真实的场景

<div class="km_insert_code">

    import { TextureLoader, MeshLambertMaterial } from ‘three’;

    var texture = new TextureLoader().load(‘./assets/texture/crate.gif’);

    var material = new MeshLambertMaterial({ map: texture });

</div>

复制

上面的代码中,我们通过TextureLoader来加载一个gif图作为纹理,并且把这个纹理通过map属性映射到了材质上,加上材质后,整个物体就更加真实了

3D动画

能绘图了,但如何加入动画呢?其实很简单,在之前的代码中已经讲解过,Threejs是通过渲染器来绘图的,你可以想象成拍照。我们在场景中摆好灯光,摆好道具,渲染器咔嚓一下,就把当前的画面绘制下来了。那如果要做成动画,只需要在渲染器来个定时连拍就可以拉。具体如下。

<div class="km_insert_code">

    function render() {
        requestAnimationFrame(render);
        update();
        renderer.render(scene, camera);
    }

    function update() {
        // update your view
    }

</div>

复制

这里我们通过requestAnimationFrame接口,来做定时刷新,每次进入render方法,都会先去执行update方法(用于更新场景),然后让渲染器拍照(renderer.render(scene, camera)),最后等待下一次render。在update方法中,我们可以修改场景中所有物体的参数,例如,我们可以试着让盒子在屏幕中转动:

<div class="km_insert_code">

    function update() {
        box.rotation.x += 0.005;
        box.rotation.y += 0.01;
    }

</div>

复制

最后的最后,其实Threejs还有很多额外的能力,例如刚刚我们使用图片作为纹理,那么我们也可以使用视频作为纹理,把这个纹理贴到一个盒子上,通过陀螺仪来控制摄像机的拍摄方向,就可以作出一个全景视频啦。Threejs也支持粒子系统,模型数据导入,自定义着色器等一系列高级功能,大家也赶快掌握起来吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/615425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何向gitee开源项目提交代码

文章目录 前言登录账号fork项目fork完成拉去代码check out出分支开发提交代码到自己的远程仓库创建pull requestcreate pull request 前言 如何向开 源 项 目 提交自己的代码呢&#xff1f;相信很多小伙伴都会看到比较不错的开源项目&#xff0c;然后想在此基础上实现自己的代…

读财报丨Q1保费环比增长33.4%,慧择增长源泉来自于何处?

一季度我国经济表现开局良好&#xff0c;保险行业增长态势明朗。从财报来看&#xff0c;中国人寿、中国平安、中国人保、新华保险、中国太保等大型上市险企Q1净利润纷纷超预期&#xff0c;随着巨头业绩转暖&#xff0c;保险中介行业也迎来了发展好时机。 近日&#xff0c;国内…

Xshell安装教程-Xshell 7激活教程-Xshell换机转移许可证详解

Xshell 7是一款功能强大的终端模拟器&#xff0c;支持SSh2&#xff0c;SSh3&#xff0c;SFTP&#xff0c;TELNET&#xff0c;RLOGIN和SERIAL。通过提供业界先进的性能&#xff0c;Xshell包含了其他SSH客户端无法发现的功能和优势。 本篇文章主要为大家介绍Xshell 7的安装、激活…

自动化回归测试工具—— AREX 上手实践

AREX 是一款开源的自动化测试工具平台&#xff0c;基于 Java Agent 技术与比对技术&#xff0c;通过流量录制回放能力实现快速有效的回归测试。同时提供了接口测试、接口比对测试等丰富的自动化测试功能&#xff0c;无需编程能力也可快速上手。 AREX 可以通过 Docker-Compose …

当开发同事辞职,接手到垃圾代码怎么办?

目录 一、前言 二、开发中的另一种选择 三、低代码概念 四、低代码在开发中的优势 01、开发效率提高 02、开发成本减少 03、维护性更高 五、有低代码后就不要开发了? 一、前言 事实上&#xff0c;垃圾项目是日积月累而成的&#xff0c;所谓冰冻三尺非一日之寒&#xf…

列表与字典—>一维列表

这一期内容可以结合着与第一期一起看https://guidm.blog.csdn.net/article/details/130900129?spm1001.2014.3001.5502 让我们来先做个题目&#xff1a; 1、输入一个整数n&#xff0c;要求输出[1,n]范围内的所有完数。 完数是一个正整数&#xff0c;该数恰好等于其所有不同…

计算机组成原理笔记概览

Chapter 1 计算机概要与技术Chapter 2 指令:计算机的语言Chapter 3 算术运算Chapter 4 处理器Chapter 5 大容量和高速度:开发存储器层次结构适配教材:《计算机组成与设计 硬件/软件接口 原书第5版》 要学计算机组成原理,你得知道它是干什么的,抓住总线:如何改进计算机的…

nacos入门-纯springboot整合nacos(百分之百可以-参考官网,比官网还全)

我是一个大数据工程师&#xff0c;但是被迫营业做后端&#xff0c;现在接手了一个项目&#xff0c;干&#xff01;有个东西叫Nacos。没接触过&#xff0c;那不行&#xff0c;会被优化的。我一大数据工程师搞gr的springcloud&#xff0c;网上很多说整合整合springboot的&#xf…

Python+Django生活用品商城网站前后端

程序示例精选 PythonDjango生活用品商城网站前后端 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonDjango生活用品商城网站前后端 >>编写代码&#xff0c;代码整洁&am…

Java多线程wait notify和park unpark的使用

目录 一、wait & notify的使用1、API介绍2、demo2、多线程模式3、wait和notify的原理 二、Park & Unpark的使用1、基本使用2、特点3、park和unpark的原理 一、wait & notify的使用 1、API介绍 obj.wait() 让进入 object 监视器的线程到 waitSet 等待 obj.wait(n)…

508教室使用方法

一、教室平面图 508教室的布局如下&#xff0c;重要的设备已经在图中标出。总开关、一体机和机柜。   二、使用方法 2.1 房间机器上电 进门后首先走到“总开关位置”&#xff0c;将电匝闭合。 原来的开关如图所示&#xff0c;有3组开关&#xff0c;1号组开关用于控制插座、…

商业智力,Social焕新|数说故事重磅发布“SocialGPT”,国内首个专注Social领域的商业大模型

AGI时代的到来&#xff0c;市场风云变幻&#xff0c;世界正在经历着一场技术革命的颠覆性洗礼。 2023年6月6日6时&#xff0c;数说故事正式对外发布数说故事“SocialGPT”&#xff0c;国内首个专注Social领域的商业大模型。数说故事“SocialGPT”大家昵称它为“社牛”大模型&a…

chatgpt赋能python:Python如何保存为py文件

Python如何保存为py文件 如果你是一个Python初学者或者在使用Python进行编程&#xff0c;你可能会想知道如何将Python代码保存为.py文件。本文将向您介绍Python如何保存为py文件&#xff0c;这样你就可以像其他编程语言一样&#xff0c;通过编辑器来直接修改和运行代码了。 保…

spring实例化bean之实例化

1.关键方法createBean doGetBean中调用getSingleton方法中调用singletonFactory.getObject()触发lambda表达式中的createBean方法 AbstractAutowireCapableBeanFactory#createBean protected Object createBean(String beanName, RootBeanDefinition mbd, Nullable Object[] …

安装和使用MySQL

文章目录 零、学习目标一、获取MySQL安装程序二、安装MySQL数据库管理系统三、启动并使用MySQL命令行&#xff08;一&#xff09;启动MySQL命令行&#xff08;二&#xff09;在MySQL命令行里操作数据库1、显示数据库2、使用数据库3、查看数据库里的表4、查看表的记录 零、学习目…

还在用InputStream的available()方法获取流的字节数吗?那你可要小心了!

问题说明 因为项目需求&#xff0c;需要从一个url获取文件流然后保存到minio文件服务器中。 先看看下面的代码片段 MinioClient minioClient MinioClient.builder().endpoint(new URL("http://ip:port")).credentials("username", "password"…

关于npm install md5报错the command again as root/Administrator的解决办法

nodejs安装依赖报错 (venv) PS D:\pythonProject> npm install md5 npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! requiredBy: . npm ERR! } npm ERR! npm ERR! The operation was rejected by your operating system. npm ERR! Its possible that the file was…

QQ群内增加ChatGPT机器人

0. 起因 最近弄了一个QQ群&#xff0c;人在逐渐增多&#xff0c;问问题的人也越来越多&#xff0c;有些问题是编程基础问题&#xff0c;2023年了&#xff0c;这些问题都不应该由人类来解决了&#xff0c;交给AI吧。所以&#xff0c;想在QQ群里加个ChatGPT机器人&#xff0c;应…

simplify3d 打印参数设置笔记

专业实用且详细的打印教程 3D打印故障排除&#xff1a;所有问题和解决方案 simplify3d 切片软件使用 初始设置 材料&#xff1a;PLA 喷头温度 215 热床温度 60 导入的模型格式 stl 保存的模型名称可以是中文 但是名称中不允许有空格&#xff0c;否则我这个打印机加热好喷头和…

GORM---初级查询

文章目录 初始数据表一般查询Where条件普通SQL查询查询 Struct & Map Not 条件Or 条件内联条件额外查询选项FirstOrInitAttrsAssign FirstOrCreateAttrsAssign 初始数据表 一般查询 var p1, p2, p3, p4 connect.PersonInfo var ps []connect.PersonInfo// 把主键升序&…