threeJS——安装以及三要素

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、安装
  • 二、三要素
    • 1.场景
      • 1.1创建场景
      • 1.2向场景添加元素
      • 1.3场景属性
    • 2.相机
      • 2.1相机特点
      • 2.2正交相机
      • 2.3空间布局
      • 2.4小姐操作
    • 3.渲染器
  • 总结


前言

本章简单介绍前端框架threeJS的使用,使用threeJS我们可以构建出前端的3D界面。不仅能应用在看房、模型分享网站等有需求的项目中,还可以在其他项目中做出酷炫的效果。


一、安装

为了方便查看效果,我们用vite快速创建一个项目,然后使用npm工具进行安装,命令如下:

npm install --save three

安装完成后,我们编写一个html文件测试

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script type="module">import * as THREE from "three";//   创建场景const scene = new THREE.Scene();// 加载图片作为背景// const loader = new THREE.TextureLoader();// loader.load("./image/1.png", (texture) => {//   scene.background = texture;// });//   创建透视相机const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000);// 修改相机位置camera.position.set(0, 0, 5);// 旋转相机camera.lookAt(0, 0, 0);// 物体网格const geometry = new THREE.BoxGeometry(1, 1, 1);// 物体材质const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });const cube = new THREE.Mesh(geometry, material);// 添加到场景scene.add(cube);// 创建网格辅助线const gridHelper = new THREE.GridHelper(10, 10);scene.add(gridHelper);//   创建渲染器const renderer = new THREE.WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);// 将渲染出的元素追加到页面document.body.appendChild(renderer.domElement);function animation() {requestAnimationFrame(animation);cube.rotation.x += 0.01;cube.rotation.y += 0.01;// 渲染场景和相机renderer.render(scene, camera);}animation();</script></body>
</html>

运行后,对应页面上会出现一个不停旋转的立方体
在这里插入图片描述
然后说明threeJS可以使用了

二、三要素

treeJS中有三个重要元素

  • 场景
  • 相机
  • 渲染器

1.场景

场景元素(scene)中存储着我们所有的对象(模型、灯光、摄像机),是一个容器

1.1创建场景

从导入three包中提供的函数,可以创建一个场景对象

import * as THREE from 'three';const scene = new THREE.Scene();

1.2向场景添加元素

有了场景后,我们就可以向里面添加需要的元素,这个元素可以是模型、灯光等,threeJS中提供了多种默认的模型,也可以自己读取建模软件中的模型进行导入,我们试着导入一个默认的立方体:

const geometry = new THREE.BoxGeometry( 1, 1, 1 );// 物体材质
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
const cube = new THREE.Mesh( geometry, material );
scene.add( cube );

对于模型而言,创建出的物体还需要为其指定材质才能够正常显示。
最后使用BoxGeometry()创建模型顶点数据,用MeshBasicMaterial()创建模型材质,两者结合变成完整的立方体模型,然后添加到场景scene中

1.3场景属性

场景除了可以存储各种元素以外,场景对象本身也有很多属性,比如我们可以使用background属性设置场景背景
在这里插入图片描述

2.相机

threejs中提供了多种类型的相机:正交相机(距离不影响物体大小)、透视相机(物体近大远小)、立方相机(用于全景图)、立体相机。
这里主要使用的是透视相机,因为符合人眼的规律。

2.1相机特点

在开始介绍该对象的属性前,先说一下3D建模中透视相机的特点:
在这里插入图片描述
相机的视野区域是一个立方体(锥体),离我们人眼原的一段是远端,离我们人眼近的一端是近端,处于这个立方体内的物体会被投射到近端,形成画面。

2.2正交相机

我们说过,相机有很多种类型,上面视野范围呈锥体的是透视相机,而正交相机的视角范围是一个立方体,正交相机投射的物体会保留原来的大小(不会近大远小)。
这种相机常被用于一些需要精准测量的模型中,不会因为缩放干扰到数据。
在这里插入图片描述

2.3空间布局

场景中用三维坐标来描述位置,threejs中的布局如下(用blender模拟一下):
在这里插入图片描述
如果是刚创建出的元素(包括相机)都是生成在场景原点的位置,如果我们想要成功渲染出模型,需要先调整模型和相机的位置,让模型处于相机的可视范围内。

2.4小姐操作

相机可以进行位置的移动和视角的旋转,这些可以帮助我们在页面渲染出一些想要的效果。

// 修改相机位置camera.position.set(0, 0, 10);// 视角中心位置(看向哪)camera.lookAt(5, 0, 0);

3.渲染器

设置好场景和相机后需要使用渲染器才可以真正渲染到页面上。
本质是在canvas标签上来展示效果。
渲染器我们这里介绍WebGLRenderer
调用构造器可以创建对应对象,其中可以设置canvas属性来指定一个已有的canvas标签,在里面渲染效果。

// 创建渲染器const renderer = new THREE.WebGLRenderer({canvas: document.querySelector('.canvas1')});

如果不设置,或者没有现成的canvas元素,就需要用追加节点的方式动态的追加一个新的canvas元素。

document.body.appendChild(renderer.domElement)

这里renderer.domElement指向的是用来渲染的canvas对象,如果在构造方法中指定过,就是我们指定的那一个。如果是没有指定过,就会自动生成一个canvas,这个时候再用来作为追加节点就可以了。


总结

由此我们已经能够简单使用threeJS创建简单模型,不过想要做出酷炫效果,需要导入外部模型,这个后面再说。

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

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

相关文章

毕业项目推荐:基于yolov8/yolo11的野生菌菇检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

【精华】为什么class在前端开发中不常用?

为什么class在前端开发中不常用&#xff1f; js是一种基于原型的语言。它的对象继承是通过 原型链&#xff08;prototype chain&#xff09;实现的&#xff0c;每个对象都有一个 proto 属性指向它的原型。&#xff08;大多数传统面向对象语言&#xff08;如 Java、C、Python、…

【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL

SQL备忘录 from to : 点击访问源地址

阿里云物联网获取设备属性api接口:QueryDevicePropertyData

阿里云物联网接口&#xff1a;QueryDevicePropertyData 说明&#xff1a;调用该接口查询指定设备或数字孪生节点&#xff0c;在指定时间段内&#xff0c;单个属性的数据 比如提取上传到物联网的温度数据 api文档&#xff1a;QueryDevicePropertyData_物联网平台_API文档-阿里…

需求和开发模型

文章目录 什么是需求&#xff1f;用户需求软件需求用户需求和软件需求的不同 开发模型什么是“模型”&#xff1f;软件的生命周期常见的开发模型瀑布模型&#xff08;Waterfall Model&#xff09;螺旋模型增量模型、迭代模型敏捷模型 测试模型V 模型W 模型&#xff08;双 V 模型…

21-发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回需要准备的 最…

sql深入学习

文章目录 前言知识学习注释的两种形式字符型注入万能密码 布尔盲注报错注入堆叠注入时间盲注二次注入 小技巧 前言 这次学习建立在对数据库有基本的认识&#xff0c;了解基础的增删改查语句&#xff0c;数字型注入和字符型注入的基础上&#xff0c;进一步深入学习知识&#xf…

利用three.js在Vue项目中展示重构的stl模型文件

一、目的 为了在前端页面展示3d打印机打印过程 二、前期准备 完整模型的stl文件和模型切割成的n个stl文件 models文件夹下的文件就是切割后的stl文件 三、代码 <template><div ref"threeContainer" class"three-container"></div><…

【Eureka 缓存机制】

今天简单介绍一下Eureka server 的缓存机制吧✌️✌️✌️ 一、先来个小剧场&#xff1a;服务发现的"拖延症" 想象你是个外卖小哥&#xff08;客户端&#xff09;&#xff0c;每次接单都要打电话问调度中心&#xff08;Eureka Server&#xff09;&#xff1a;“现在…

Python--内置模块和开发规范(下)

2. 开发规范 2.1 单文件应用 文件结构示例 # 文件注释 import os import jsonDB_PATH "data.json" # 常量放顶部def load_data():"""函数注释&#xff1a;加载数据"""if os.path.exists(DB_PATH):with open(DB_PATH, "r"…

go设计模式

刘&#xff1a;https://www.bilibili.com/video/BV1kG411g7h4 https://www.bilibili.com/video/BV1jyreYKE8z 1. 单例模式 2. 简单工厂模式 代码逻辑&#xff1a; 原始&#xff1a;业务逻辑层 —> 基础类模块工厂&#xff1a;业务逻辑层 —> 工厂模块 —> 基础类模块…

搭建数字化生态平台公司:痛点与蚓链解决方案

在数字技术突飞猛进的当下&#xff0c;数字化生态平台成为众多企业实现创新发展、拓展业务版图的 “秘密工具”。今天&#xff0c;咱们就一起来聊聊搭建这类平台的公司&#xff0c;看看它们有啥独特之处&#xff0c;又面临哪些难题。 一、面临的痛点 &#xff08;一&#xff0…

标记符号“<”和“>”符号被称为“尖括号”或“角括号”

你提到的“<”和“>”符号被称为“尖括号”或“角括号”。它们常用于编程语言中表示类型参数&#xff08;如泛型&#xff09;、HTML标签&#xff08;如<div>&#xff09;、数学中的不等式&#xff08;如< 5&#xff09;等。 好的&#xff0c;我来用通俗的方式解…

云平台DeepSeek满血版:引领AI推理革新,开启智慧新时代

引言&#xff1a;人工智能的未来——云平台的卓越突破 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正深刻地改变着我们生活与工作方式的方方面面。作为AI领域的创新者与领航者&#xff0c;云平台始终走在技术前沿&#xff0c;凭借无穷的热情…

自然语言处理:文本规范化

介绍 大家好&#xff01;很高兴又能在这儿和大家分享自然语言处理相关的知识了。在上一篇发布于自然语言处理&#xff1a;初识自然语言处理-CSDN博客为大家初步介绍了自然语言处理的基本概念。而这次&#xff0c;我将进一步深入这个领域&#xff0c;和大家聊聊自然语言处理中一…

HTTP非流式请求 vs HTTP流式请求

文章目录 HTTP 非流式请求 vs 流式请求一、核心区别 服务端代码示例&#xff08;Node.js/Express&#xff09;非流式请求处理流式请求处理 客户端请求示例非流式请求&#xff08;浏览器fetch&#xff09;流式请求处理&#xff08;浏览器fetch&#xff09; Python客户端示例&…

C语言机试编程题

编写版本&#xff1a;vc2022 1.求最大/小值 #include<stdio.h> int main(){int a[50],n;int max, min;printf("请输入您要输入几个数");scanf_s("%d", &n);printf("请输入您要比较的%d个数\n",n);for (int i 0; i<n; i) {scanf_…

c++ 多个.cpp文件运行

目录 方法 1&#xff1a;将其他文件中的 main 改为普通函数 方法 2&#xff1a;使用头文件组织代码 方法 3&#xff1a;条件编译&#xff08;仅用于调试或特殊需求&#xff09; 方法 4&#xff1a;创建类或命名空间管理逻辑 在一个C项目中&#xff0c;多个.cpp文件不能同…

基于OFDR的层压陆相页岩油储层中非对称裂缝群传播的分布式光纤监测

关键词&#xff1a;OFDR、分布式光纤传感、裂缝传播 一. 概述 四川盆地凉高山组优质页岩油储层存在复杂的垂直重叠岩性&#xff0c;大陆页岩油储层存在发育层理&#xff0c;薄层和天然裂缝&#xff0c;对水平井多级压裂技术的裂缝网络形态控制和监测构成挑战。本研究提出了一…

UniApp 按钮组件 open-type 属性详解:功能、场景与平台差异

文章目录 引言一、open-type 基础概念1.1 核心作用1.2 通用使用模板 二、主流 open-type 值详解2.1 contact - 客服会话功能说明平台支持代码示例 2.2 share - 内容转发功能说明平台支持注意事项 2.3 getUserInfo - 获取用户信息功能说明平台支持代码示例 2.4 getPhoneNumber -…