【Three.js基础】创建场景、渲染场景、创建轨道控制器(一)

这篇具有很好参考价值的文章主要介绍了【Three.js基础】创建场景、渲染场景、创建轨道控制器(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🐱 个人主页:不叫猫先生
🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫系列专栏:vue3从入门到精通、TypeScript从入门到实践
📢 资料领取:前端进阶资料以及文中源码可以找我免费领取
🔥 前端学习交流:博主建立了一个前端交流群,汇集了各路大神,一起交流学习,期待你的加入!(文末有我wx或者私信)

threejs轨道控制器,Three.js从入门到实践,javascript,前端,开发语言,three.js

一、 WebGL与Three.js的关系

WebGL(Web Graphics Library)是一种 JavaScript API,用于在任何兼容的 Web 浏览器中呈现交互式 3D 和 2D 图形,不需要插件,即专门处理计算或处理3D图像的JS API。
Three.js 是一款 WebGL 框架,其WebGL 的 API 接口基础上又进行的一层封装。由西班牙巴塞罗那的程序员 Ricardo Cabbello Miguel 所开发,人称Mr.doob。

二、打包工具 parcel

Parcel 是 Web 应用打包工具,适用于经验不同的开发者。它利用多核处理提供了极快的速度,并且不需要任何配置。其他详细用法详见官网。

1.安装

yarn add parcel -D

2.配置package.json

{
  "scripts": {
    "dev": "parcel src/index.html",
    "build": "parcel build src/index.html"
  }
}

三、搭建three.js环境

博主建议搭建一个本地的three.js环境,方便快速查看文档。

1.项目目录

├─ .parcel-cache
│  ├─ data.mdb
│  └─ lock.mdb
├─ dist
│  ├─ index.07fedde6.css
│  ├─ index.07fedde6.css.map
│  ├─ index.246235aa.js
│  ├─ index.246235aa.js.map
│  ├─ index.html
│  ├─ main.0632549a.js
│  ├─ main.0632549a.js.map
│  ├─ style.a11e3109.css
│  ├─ style.a11e3109.css.map
│  ├─ style.a11e3109.js
│  └─ style.a11e3109.js.map
├─ package.json
├─ src
│  ├─ assets
│  │  ├─ css
│  │  │  └─ style.css
│  │  └─ img
│  ├─ index.html
│  └─ main
│     └─ main.js
└─ yarn.lock

2.安装three

yarn add three -S

3.新建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>
	<script src="./main/main.js" type="module"></script>
</body>
</html>

4.创建一个场景(Creating a scene)

创建场景借助three.js来进行显示,需要场景、相机和渲染器3个对象,透过然后通过摄像机渲染出场景。

(1)创建场景

new THREE.Scence();

(2)创建相机

three.js里有几种不同的相机,这使用的是PerspectiveCamera(透视摄像机),接收四个参数:

  • 视野角度(FOV):摄像机视锥体垂直视野角度,从视图的底部到顶部,显示器上能看到的场景范围,单位是角度,默认是50
  • 长宽比(aspect ratio):物体的宽/物体的高,比如(window.innerWidth / window.innerHeight),通常是使用画布的宽/画布的高,默认值是1(正方形画布)
  • 近截面(near plane):摄像机的近端面,默认值是0.1,其有效值范围是0到当前摄像机far plane(远端面)的值之间。
  • 远截面(far):摄像机的远端面,默认值是2000。

当物体某些部分比摄像机的远截面远或者比近截面近的时候,该这些部分将不会被渲染到场景中。该值必须大于near plane(摄像机视锥体近端面)的值。

new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)

(3)设置相机的位置

camera.position.set(0, 0, 10)

(4)相机添加到场景

scene.add(camera)

(5)创建几何体

BoxGeometry是四边形的原始几何类,它通常使用构造函数所提供的“width”、“height”、“depth”参数来创建立方体或者不规则四边形。

BoxGeometry(width : Float, height : Float, depth : Float, widthSegments : Integer, heightSegments : Integer, depthSegments : Integer)

  • width — X轴上面的宽度,默认值为1。
  • height — Y轴上面的高度,默认值为1。
  • depth — Z轴上面的深度,默认值为1。
  • widthSegments — (可选)宽度的分段数,默认值是1。
  • heightSegments — (可选)高度的分段数,默认值是1。
  • depthSegments — (可选)深度的分段数,默认值是1。
const cubeGeometry = new THREE.BoxGeometry();

(6)设置材质

这里使用的是基础网格材质(MeshBasicMaterial),以简单着色(平面或线框)方式来绘制几何体,不受光照的影响。使用color属性为几何体着色,默认值为白色 (0xffffff)

const cubeMaterial = new THREE.MeshBasicMaterial({color:0xffff00})

(7)创建物体

根据几何体、材质创建物体。Mesh表示基于以三角形为polygon mesh(多边形网格)的物体的类。把几何体与材料融合就得到了网格,网格才是我们真正渲染的东西。
用法:Mesh( geometry : BufferGeometry, material : Material )

  • geometry(可选):BufferGeometry的实例,默认值是一个新的BufferGeometry。
  • material (可选):一个Material,或是一个包含有Material的数组,默认是一个新的MeshBasicMaterial。
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)

(8)将几何体添加到场景

scene.add(cube)

5.渲染场景

场景写完之后,需要进行渲染。

(1)初始化渲染器

这里使用的是WebGL1Renderer,该版本的渲染器会强制使用 WebGL 1 渲染上下文。注意:自r118起,WebGLRenderer会自动使用 WebGL 2 渲染上下文。

const renderer = new THREE.WebGL1Renderer()
console.log(renderer)//renderer中有一个canvas对象,就是我们看到的画布内容

(2)设置渲染的尺寸大小

renderer.setSize(window.innerWidth ,window.innerHeight)

(3)将webgl渲染的canvas内容添加到body

document.body.appendChild(renderer.domElement)

(4)使用渲染器通过相机将场景渲染进来

创建一个使渲染器能够在每次屏幕刷新时对场景进行绘制的循环。使用requestAnimationFrame时,当用户切换到其它的标签页时会暂停,不会浪费用户处理器资源,也不会损耗电池的使用寿命。

function render(){
	renderer.render(scene,camera)
	//渲染下一帧的就会调用
	requestAnimationFrame(render)
}
render()

6.展示1(几何体静止)

threejs轨道控制器,Three.js从入门到实践,javascript,前端,开发语言,three.js

7.创建轨道控制器

Orbit controls(轨道控制器)可以使得相机围绕目标进行轨道运动。
用法:OrbitControls( object : Camera, domElement : HTMLDOMElement )

  • object: (必须)将要被控制的相机。该相机不允许是其他任何对象的子级,除非该对象是场景自身。

  • domElement: 用于事件监听的HTML元素。

//导入控制器
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'
//创建轨道控制器
const controls =  new OrbitControls(camera,renderer.domElement);

8.展示2(几何体可旋转)

threejs轨道控制器,Three.js从入门到实践,javascript,前端,开发语言,three.js

四、源码

main.js中的源码如下文章来源地址https://www.toymoban.com/news/detail-788597.html

import * as THREE from 'three'
//导入控制器
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'

console.log(THREE)
//创建场景
const scene = new THREE.Scene();
//创建相机(角度,宽高比,,)
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
//相机位置
camera.position.set(0, 0, 10)
scene.add(camera);


//添加物体
//创建几何体
const cubeGeometry = new THREE.BoxGeometry();
//设置材质
const cubeMaterial = new THREE.MeshBasicMaterial({color:0xffff00})

//根据几何体,材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)
// 将几何体添加到场景
scene.add(cube)

//初始化渲染器
const renderer = new THREE.WebGL1Renderer()

//设置渲染的尺寸大小
renderer.setSize(window.innerWidth ,window.innerHeight)
console.log(renderer)//renderer中有一个canvas对象

// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement)

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

//创建轨道控制器
const controls =  new OrbitControls(camera,renderer.domElement);
//创建一个使渲染器能够在每次屏幕刷新时对场景进行绘制的循环
function render(){
	renderer.render(scene,camera)
	//渲染下一帧的就会调用
	requestAnimationFrame(render)
}
render()

到了这里,关于【Three.js基础】创建场景、渲染场景、创建轨道控制器(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Three.js使用OrbitControls(控制器)后修改相机旋转方向无效问题

            当我们在项目使用 OrbitControls(控制器)来控制相机进行旋转的时候不可避免就会遇到一个问题,修改相机的 lookAt 和 rotation 无效~ 通过 lookAt、和rotation对相机的旋转进行操作后发现相机的位置和角度并没有发生变化,原因是当前相机已经被 OrbitControls 控制器托管

    2024年04月10日
    浏览(79)
  • Three.js之创建3D场景

    【G】Three.js官方文档:https://threejs.org/docs/ Three.js是一个流行的WebGL库,官方文档提供了详细的API参考和示例,适合学习和参考。 【G】Three.js GitHub链接:https://github.com/mrdoob/three.js 这是一个流行的基于WebGL的3D图形库,提供了丰富的功能和工具,用于创建交互式的3D场景和应用。

    2024年02月14日
    浏览(75)
  • three.js鼠标控制场景旋转

    鼠标控制旋转

    2024年02月17日
    浏览(36)
  • three.js(三):three.js的渲染结构

    概述 three.js 封装了场景、灯光、阴影、材质、纹理和三维算法,不必在直接用WebGL 开发项目,但有的时候会间接用到WebGL,比如自定义着色器。 three.js 在渲染三维场景时,需要创建很多对象,并将它们关联在一起。 下图便是一个基本的three.js 渲染结构 Renderer 渲染器 Renderer

    2024年02月11日
    浏览(42)
  • Three.js初识:渲染立方体、3d字体、修改渲染背景颜色

    用场景对three.js进行渲染:场景、相机、渲染器 场景 透视摄影机 参数解析: fov: 视野角度(FOV)。视野角度就是无论在什么时候,你所能在显示器上看到的场景的范围,它的单位是角度(与弧度区分开)。 aspect: 长宽比(aspect ratio)。 也就是你用一个物体的宽除以它的高的值

    2024年02月07日
    浏览(43)
  • 【Three.js】渲染模型卡顿的优化办法

    优化方法是根据chatGPT的回答下,我这里记录一下,有的方法进行了尝试,有的还没有。 可以通过减少面数来优化,也可以使用 LOD技术(Level of Detail) 在不同距离下使用不同的模型细节来优化。 使用LOD技术可以在不同距离下使用不同的模型细节来优化three.js渲染性能,下面是

    2024年02月05日
    浏览(33)
  • 基于Three.js的WebXR渲染入门

    我不会花太多时间讨论 Three.JS 渲染管道的工作原理,因为它在互联网上有详细记录(例如,此链接)。 我将在下图中列出基础知识,以便更容易理解各个部分的去向。 在我们深入了解 WebXR API 本身之前,您应该知道 WebXR 设备 API Polyfill 可通过两种主要方式帮助开发人员: 如

    2024年02月11日
    浏览(41)
  • Three.js教程:WebGL渲染器设置(锯齿模糊)

    推荐:将 NSDT场景编辑器 加入你的3D工具链 其他系列工具: NSDT简石数字孪生 一般实际开发,threejs的WebGL渲染器需要进行一些通用的基础配置,本节课给大家简单介绍下,比如渲染模糊或锯齿问题。 渲染器锯齿属性 .antialias 设置渲染器锯齿属性 .antialias 的值可以直接在参数中

    2024年02月11日
    浏览(53)
  • Three.js之相机、渲染器、光源、动画、性能监测

    第一个3D案例—透视投影相机 第一个3D案例—渲染器 … Canvas画布布局和全屏 透视投影相机PerspectiveCamera WebGL渲染器WebGLRenderer 辅助观察坐标系AxesHelper 漫反射网格材质MeshLambertMaterial 点光源PointLight 点光源辅助观察PointLightHelper 环境光AmbientLight 平行光DirectionalLight 平行光辅助观

    2024年02月13日
    浏览(41)
  • Three.js之几何体、高光材质、渲染器设置、gui

    阵列立方体和相机适配体验 Threejs常见几何体简介 … gui.js库(可视化改变三维场景) 注:基于Three.js v0.155.0 长方体:BoxGeometry 球体:SphereGeometry 圆柱:CylinderGeometry 矩形平面:PlaneGeometry 圆形平面:CircleGeometry 高光网格材质:MeshPhongMaterial(shininess、specular) WebGL渲染器设置:

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包