threejs的使用

news2024/11/17 5:29:50

threejs介绍:

Three.js是一款基于WebGL的JavaScript 3D库,用于创建和渲染3D图形场景。它提供了一个简单易用的接口,让开发者可以通过JavaScript代码创建出高度交互性和可视化的3D场景。Three.js提供了很多可用的3D对象和材质,例如几何体、灯光、纹理等,也支持自定义对象和材质。Three.js还提供了一些场景控制器和动画功能,可以用于控制3D场景的相机、光源等元素的位置和方向,以及实现动画效果。

  • 主要了解threejs的简单使用及组成

研究内容:

  1. 搭建 threejs 开发环境
  2. 掌握 threejs 基本语法组成
  3. threejs的变换方式
  4. 使用threejs完成一个简单的例子

使用步骤:

一、threeJs的引入

1.js文件
在官网上下载three.js-master.zip包,然后在index.html中引入

<script src="./three.min.js"></script>

threejs的官网地址
2.Cdn链接
在cdn官网,搜threeJs,复制链接,然后在index.html中引入

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/0.151.3/three.min.js"></script>

cdn官网
3.Npm
可以用npm安装,先安装npm ,node ,在安装管理工具,Vite 、webpack两者都可以

二、npm搭建开发环境

1.利用vite创建一个新项目
第一步

npm create vite three-2

在这里插入图片描述
选择原生函数,然后

Cd three-2 
Code . //进入项目

打开项目的package.json,就是没有threejs
在这里插入图片描述
第二步

Npm  install vite three

在这里插入图片描述
第三步

Npm run dev

第四步

import * as THREE from 'three'
console.log(THREE);//就能看到THREE对象

三、threejs的主要函数及变换方式

一、组成

1.Scence  (场景)
2.Object(point、line、mesh)  物体:geometry(几何体)+material(材质,皮肤),例如灯笼,有骨架和外壳组成
3.light  场景中的灯光
4.Camera 
5.Renderer 渲染器

二、变换方式

1.transform变换
2.Position  位置变换
3.Rotation 旋转
4.Scale 缩放

四、帧率检测器的使用及实现鼠标交互效果

一、帧率检测器
第一步 引入

import Stat from "three/examples/jsm/libs/stats.module"

第二步 初始化

const stat = new Stat()

第三步 添加到body

document.body.append(stat.dom)

第四步 物体转动更新

stat.update()

左上角出现这样的检测器
在这里插入图片描述

二、鼠标交互

第一步 引入

import {OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

第二步 初始化

const orbitControls = new OrbitControls(camera,renderer.domElement)

第三步 物体转动更新

  orbitControls.update()

最终,鼠标可以与物体交互,出现立体感
在这里插入图片描述

四、threejs构建的简单例子,小车的运行

完整代码如下

import * as THREE from 'three'
import Stat from "three/examples/jsm/libs/stats.module"
import {OrbitControls } from 'three/examples/jsm/controls/OrbitControls'


const w = window.innerWidth
const h = window.innerHeight
const stat = new Stat()

// Scene(场景)
const scene = new THREE.Scene()
// 材质
const material = new THREE.MeshNormalMaterial()
// AxesHelper辅助 
const axes = new THREE.AxesHelper(2,2,2)
// scene.add(axes)

// Object 物体:geometry(几何体)+material(材质,皮肤)
// 整个汽车
const car = new THREE.Group()
// 车身  SphereGeometry 圆形   BoxGeometry立方
const body = new THREE.Group()

const bodyCube1 = new THREE.Mesh(
  new THREE.BoxGeometry(1,2,0.5),
  material
)
const bodyCube2 = new THREE.Mesh(
  new THREE.BoxGeometry(0.5,0.5,0.5),
  new THREE.MeshBasicMaterial({color:0xff0000})
  )
bodyCube2.position.z = 0.5
body.add(bodyCube1)
body.add(bodyCube2)
car.add(body)

// 轮子1
const wheelGroup1 = new THREE.Group()
const wheel1 = new THREE.Mesh(
  new THREE.BoxGeometry(0.1,0.7,0.7),
  material
)
wheelGroup1.position.set(-0.6,0.6,0)
wheelGroup1.add(wheel1)
car.add(wheelGroup1)

// 轮子2
const wheelGroup2 = new THREE.Group()
const wheel2 = new THREE.Mesh(
  new THREE.BoxGeometry(0.1,0.7,0.7),
  material
)
wheelGroup2.position.set(0.6,0.6,0)
wheelGroup2.add(wheel2)
car.add(wheelGroup2)

const wheelGroup3 = wheelGroup1.clone()
wheelGroup3.position.y = -0.6
car.add(wheelGroup3)
// 轮子4
const wheelGroup4 = wheelGroup2.clone()
wheelGroup4.position.y = -0.6
car.add(wheelGroup4)

// 轮胎
let n=20;
const circle = new THREE.Group()
for(let i =0;i<n;i++){
  let r = 0.5
  const geometry = new THREE.BoxGeometry(0.1,0.1,0.2)
  const mesh = new THREE.Mesh(geometry,material)
  mesh.position.x = r * Math.cos(Math.PI * 2/n * i)  //360
  mesh.position.y = r * Math.sin(Math.PI * 2/n * i)
  circle.add(mesh)
}
circle.rotation.y = -0.5 * Math.PI//90
wheelGroup1.add(circle)
wheelGroup2.add(circle.clone())
wheelGroup3.add(circle.clone())
wheelGroup4.add(circle.clone())
scene.add(car)

//Camera 75是个角度 越大广角越大,看到的越多
const camera = new THREE.PerspectiveCamera(75,w/h,0.1,100)
camera.position.set(0,0,5)
camera.lookAt(0,0,0)//相机朝向

//*renderer---渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(w,h)
// renderer.render(scene,camera)
// 将渲染出来的场景添加到页面
document.body.append(renderer.domElement)
document.body.append(stat.dom)

const orbitControls = new OrbitControls(camera,renderer.domElement)

// 让物体动起来
const clock = new THREE.Clock()
tick()
function tick(){
  const time = clock.getElapsedTime() //time 是一个一直均匀增加的值 getElapsedTime考虑到刷新率的
  // car.position.y = Math.sin(time) * 2
  car.position.y = time % 4 - 2
  wheelGroup1.rotation.x = -time
  wheelGroup2.rotation.x = -time
  wheelGroup3.rotation.x = -time
  wheelGroup4.rotation.x = -time


  requestAnimationFrame(tick)
  renderer.render(scene,camera)
  stat.update()
  orbitControls.update()
}

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

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

相关文章

C++ -2- 类和对象(上)| 什么是类

​ 文章目录 1.面向过程与面向对象2.类的引入3.类的定义两种定义方式 4.类的访问限定符5.类的作用域6.类的示例化7.类的对象大小计算8.类成员函数的this指针C语言和C的对比(this指针)空指针的问题 C语言和C实现Stack对比 1.面向过程与面向对象 C&#xff1a;面向过程&#xf…

java获取请求ip的方法

在上篇文章中我们介绍了 java获取请求 ip的方法&#xff0c;那么这篇文章我们就来详细讲解下获取请求 ip的方法。获取请求 ip的方法是基于 HTTP协议的&#xff0c;其原理如下&#xff1a; 1、用 web应用程序&#xff0c;将 web服务器端与客户端通过 HTTP协议通信。 2、客户端发…

LNMP架构和论坛搭建以及一键部署

数据流向 一、Nginx服务安装 1、关闭防火墙 [rootking ~]# systemctl stop firewalld [rootking ~]# systemctl disable firewalld [rootking ~]# setenforce 0 2、将所需软件包拖入/opt目录下 3、安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 4、创建运…

Feign快速入门

文章目录 一、Feign1.1 Feign介绍1.2 Feign的使用步骤1.3 Feign的自定义配置1.3.1 配置方法 1.4 Feign的优化 一、Feign 1.1 Feign介绍 Feign是一个Java HTTP客户端&#xff0c;它使开发人员可以轻松地与RESTful API进行交互。Feign使用注释来描述REST API&#xff0c;它还支持…

Springboot整合Junit5

1 SpringBoot整合Junit &#xff08;一&#xff09;junit5 介绍 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架&#xff0c;JUnit5与之前版本的Junit框架有很大的不同。由三个不同子项目的几个不同模块组成。 JUnit 5 JUnit Platfo…

音视频开发十九:SDL线程和事件

SDL事件相关API DL_Event 是SDL库中使用的一个数据结构&#xff0c;用于表示系统中发生的事件。一个事件可以是键盘按键、鼠标移动、游戏手柄移动、窗口事件等。SDL_Event 结构包含有关事件类型、事件发生时间和事件参数的详细信息。 SDL_Event 结构具有以下成员&#xff1a;…

[5 种有效方法] 适用于 Android 的通用解锁图案/密码

在当今世界&#xff0c;保护您的密码对于您的文件和数据的安全至关重要&#xff0c;尤其是在第三方应用程序盛行的情况下。为这些应用程序注册帐户不是问题&#xff0c;就像记住它们一样。但是&#xff0c;如果您不知何故忘记了手机密码&#xff0c;您仍然可以在不丢失宝贵数据…

突破规模化运维瓶颈 SREWorks云原生数智运维平台揭秘

作者&#xff1a; 钟炯恩——阿里云大数据基础工程技术团队运维专家 引言 突破规模化运维瓶颈是诸多IT规模增长的企业及组织当前遇到的比较棘手的问题。面对这些问题&#xff0c;多数人的第一反应是上云。但是上云之后我们会发现&#xff0c;即使云上的架构规模增大&#xf…

如何使用DNS实现融合CDN功能

将托管DNS解决方案与CDN配对可为您的网站提供额外的性能、可靠性和灵活性。 域名系统&#xff08;DNS&#xff09;是一种用于计算机、服务或连接到Internet或专用网络的任何资源的分层分布式命名系统&#xff0c;它将各种信息与分配给每个参与实体的域名相关联&#xff0c;它基…

ChatGPT 火了,一大批开源平替也来了

ChatGPT 凭一己之力让全球为 AI 沸腾&#xff0c;引发了科技巨头之间的聊天机器人军备竞赛。 众所周知&#xff0c;ChatGPT 的背后技术是 GPT(Generative Pre-trained Transformer)模型。GPT 是一种基于 Transformer 模型的自然语言处理模型&#xff0c;由 OpenAI 公司开发。它…

【elasticsearch部署】

安装elasticsearch 1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1.部署2.2.DevTools 3.安装IK分词器3.1.在线安装ik插件&#xff08;较慢&#xff09;3.2.离线安装ik插件&#xff08;推荐&#xff09;1&#xff09;查看数据卷目录2&#xff09;解压缩分词器安…

前端必备的nginx知识点

nginx学习&#xff0c;看这一篇就够了&#xff1a;下载、安装。使用&#xff1a;正向代理、反向代理、负载均衡。常用命令和配置文件,很全_java冯坚持的博客-CSDN博客 前端必备的nginx知识点 - 掘金 前言&#xff1a; 最近在做一个后台项目 ngixn简介 nginx是一款轻量级&…

【Sql】sql语句练习随记

本文通过最经典的“学生-成绩-课程-教师”表来帮助练习sql语句。 STUDENT表 SNO 学号SNAME 姓名SSEX 性别SBIRTHDAY 生日CLASS 班级 SCORE表 SNO 学号CNO 课程编号DEGREE 分数 COURSE表 CNO 课程编号CNAME 课程名称TNO 教师编号 TEACHER表 TNO 教师编号TNAME 教师姓名TS…

(包教包会)最强分布式锁工具:Redisson

今天来聊聊分布式锁的最强实现&#xff1a;Redisson 从分布式锁到Redisson实现非常详细&#xff0c;适合慢慢咀嚼~ 一. Redisson概述 1.1 什么是Redisson&#xff1f; Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。…

CRMEB开源商城/标准版后台默认admin路径修改、后台目录地址修改

默认admin路径修改 v4.7 版本开始兼容可以修改admin路径&#xff0c;可以根据自己的要求更换后台访问地址&#xff1b; 默认路径不能携带特殊字符、全部都为小写字母 修改后台admin默认路径 标准版本文件位置根目录/config/app.php 开源版本文件位置根目录/crmeb/config/app.p…

新增套餐/redis/QuartZ

套餐其实就是检查组的集合&#xff0c;例如有一个套餐为“入职体检套餐”&#xff0c;这个体检套餐可以包括多个检查组&#xff1a;一般检查、血常规、尿常规、肝功三项等。所以在添加套餐时需要选择这个套餐包括的检查组。 套餐对应的实体类为Setmeal&#xff0c;对应的数据表…

深度学习(7)之图像抠图 Image Matting算法调研

目录 1.Trimap和Strokes 2. 相关数据集 3.论文算法调研 3.1 Deep Image Matting 3.2 Semantic Image Matting 3.3 Background Matting 3.4 Background Matting V2 3.5 Semantic Human Matting 3.6 HAttMatting 3.7 MMNet&#xff1a;Towards Real-Time Automatic Portrait Matt…

Nginx虚拟主机、优化和防盗链

一、Nginx虚拟主机 1、基于域名的nginx虚拟主机的操作步骤 1.1 为虚拟主机提供域名和IP的映射(也可以使用DNS正向解析) echo "192.168.2.66 www.xkq.com www.wy.com" >> /etc/hosts1.2 为虚拟主机准备网页文档 mkdir -p /var/www/html/ly/ mkdir -p /var/w…

经典文献阅读之--VGICP(体素化的ICP匹配)

0. 简介 之前我们在以前的文章中介绍了很多有关于点云匹配相关的知识&#xff0c;最近两年处理GICP这一大一统的ICP匹配方法以外&#xff0c;还有一个工作对体素化和ICP这两者打起了心思&#xff0c;《Voxelized GICP for Fast and Accurate 3D Point Cloud Registration》提出…

动车的颜色种类

01 大家平时见到最多的动车 可能就是白色的吧 和谐号动车组开行后 白就是动车的经典配色 白色为底 车腰一条蓝色飘带让其设计感十足 我们也可以把这种动车配色 称为和谐白 02 复兴号CR400AF型电力动车组 最高运营速度350公里每小时 因其车身采用银色底色 搭配侧窗…