当前位置: 首页 > news >正文

three.js入门 1 介绍和基础代码

three.js介绍和安装

1.three.js概念
three.js是JavaScript编写的WebGL第三方库。提供了非常多的3D显示功能

什么是threejs,很简单,你将它理解成three + js就可以了。three表示3D的意思,js表示javascript的意思。那么合起来,three.js就是使用javascript来写3D程序的意思。Javascript是运行在网页端的脚本语言,那么毫无疑问Three.js也是运行在浏览器上的。

2.three.js的功能
Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象。你可以在它的主页上看到许多精彩的演示。

3.相关网站
官网:https://threejs.org/
中文文档:https://threejs.org/docs/index.html#manual/zh
github:https://github.com/mrdoob/three.js

使用parcel打包工具开发

Parcel 是 Web 应用打包工具,适用于经验不同的开发者。它利用多核处理提供了极快的速度,并且不需要任何配置。
官网:https://www.parceljs.cn/

  • 创建npm项目

    mkdir three_basic
    cd three_basic
    npm init -y
    npm install parcel-bundler
    npm install parcel-bundler --save-dev
    
  • 接着,通过修改你的package.json来添加这些任务脚本

    {
        ...
        "scripts": {
            "dev": "parcel src/index.html",
            "build": "parcel build src/index.html"
        },
        ...
    }
    
  • 创建基础文件

    mkdir src
    cd src
    mkdir index.html
    mkdir assets
    mkdir css/style.css
    mkdir main/main.js
    
  • index.html

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <link rel="stylesheet" href="./assets/css/style.css">
    </head>
    
    <body>
      <!-- type="module" 为模块化开发 -->
      <script src="./main/main.js" type="module"></script>
    
    </body>
    
    </html>
    
  • style.css

    * {
      margin: 0;
      padding: 0;
    }
    
    html,
    body {
      width: 100%;
      height: 100%;
    }
    
    body {
      background-color: skyblue;
    }
    
  • main.js

    import * as THREE from "three";
    

使用npm安装

cd three_basic
npm install three --save

启动项目

npm run dev

了解three.js最基本创建的内容

所有页面基本都要基础代码

import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import Stats from 'three/examples/js/libs/stats.min.js'
// console.log(THREE)

// 1. 创建场景(必要)
const scene = new THREE.Scene();

// 2. 创建相机(必要)
const camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
);

//设置相机位置
camera.position.set(0, 0, 10);
scene.add(camera);

// 3. 添加物体(必要)
// 创建几何体
const cubeGeometry = new THREE.BoxGeometry();
const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });
// 根据几何体和材质创建物体
const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial)
// 将物体放进场景
scene.add(mesh);

// 4. 初始化渲染器(必要)
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
// 将webgl渲染的canvas内容放置到html中
document.body.appendChild(renderer.domElement);

//使用渲染器,通过相机将场景渲染进来
renderer.render(scene, camera);

// 5. 轨道控制器 (非必要)
const controls = new OrbitControls(camera, renderer.domElement);

// 7. 辅助坐标系(非必要)
const axes = new THREE.AxesHelper(5)
scene.add(axes);

// 8. 性能插件(非必要)
// 引入stats.js

const stats = new Stats()
// 设置stats样式
stats.dom.style.position = 'absolute';
stats.dom.style.top = '0px';
document.body.appendChild(stats.dom);

// 6. 重新渲染动画(必要)
function render() {
  renderer.render(scene, camera);

  // 更新stats
  stats.update();

  // 渲染下一帧的时候就会调用render函数
  requestAnimationFrame(render);
}
render();

// 9. 页面变化,页面也要相对的更新(必要)
window.addEventListener('resize', function () {

  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight;
  // 更新摄像机的投影矩阵
  camera.updateProjectionMatrix();

  // 更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 更新渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio)
})

全屏和退出全屏

// 双击控制屏幕进入全屏,退出全屏
window.addEventListener("dblclick", function () {
  // 获取文档全屏元素,没有时为 undefined
  let fullScreenElemet = document.fullscreenElement;
  
  if (fullScreenElemet) {
    // 以文档退出全屏
    document.exitFullscreen();
  } else {
    // 以画布进入全屏
    renderer.domElement.requestFullscreen();
  }

})

相关文章:

  • pytorch-实现天气识别
  • Unity2D学习———角色移动两种方式+小怪追随+Unity演示+C#代码
  • 拓展上机-3题解:哥德巴赫猜想
  • 如果你看不懂别人画的 UML 类图,看这一篇文章就够了
  • 【论文】论文阅读记录
  • 【第三十九讲】Boot 启动流程
  • ApkScan-PKID 查壳工具下载使用以及相关技术介绍
  • 从BNB遭黑客攻击(跨链桥BSC Token Hub遭到攻击),看公链中心化问题
  • 【多线程实践】一、为何使用多线程三种线程创建方式利弊分析
  • LIFELONG LEARNING WITH DYNAMICALLY EXPANDABLE NETWORKS论文阅读+代码解析
  • 计算机网络——集线器与交换机
  • 用通俗易懂的方式讲解:CatBoost 算法原理及案例
  • 系统架构演变和SpringCloud的定义:
  • 后端必会的前端vue基础知识
  • VGG16 - 咖啡豆识别
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Facebook AccountKit 接入的坑点
  • git 常用命令
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • magento 货币换算
  • Meteor的表单提交:Form
  • orm2 中文文档 3.1 模型属性
  • Redis的resp协议
  • spring boot下thymeleaf全局静态变量配置
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 规范化安全开发 KOA 手脚架
  • 蓝海存储开关机注意事项总结
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 通信类
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 自定义函数
  • #define与typedef区别
  • #Linux(Source Insight安装及工程建立)
  • #单片机(TB6600驱动42步进电机)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C语言)字符分类函数
  • (LeetCode) T14. Longest Common Prefix
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET : 在VS2008中计算代码度量值
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET Standard 的管理策略
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/C# 使用反射注册事件
  • /*在DataTable中更新、删除数据*/
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [HTML API]HTMLCollection
  • [LeetCode] Minimum Path Sum
  • [Leetcode] Permutations II