ThreeJs新手入门不完全教学指南 快速入门篇(二)

上周向大家介绍了下在threeJs中几个最基本也是最重要的几个核心概念,场景、相机、渲染器等等,今天让我们来继续探索更多的功能。

还没看过上一篇的可以先去补习下这篇文章 ThreeJs新手入门不完全教学指南 快速入门篇(一)

好了,赶紧进入正题吧

点模型、线模型

在上一篇中我们介绍过了网格模型 Mesh 来创建几何体,这里我们来介绍另外两种。

点模型

js 复制代码
// 创建自定义的几何顶点
const vertices = new Float32Array([0, 0, 0, 50, 0, 0, 0, 100, 0, 0, 0, 10, 0, 0, 100, 50, 0, 10]);

// 创建一个三个一组的空间坐标
const attribute = new THREE.BufferAttribute(vertices, 3);

// 一个空的几何体
const geometry = new THREE.BufferGeometry();

// 添加定位属性
geometry.attributes.position = attribute;

const material = new THREE.PointsMaterial({
  color: 0xffff00,
  size: 5
});

const points = new THREE.Points(geometry, material);

scene.add(points);

与Mesh网格模型对应的材质不同,生成点模型材质的对象是PointsMaterial 通过点模型对象Points添加参数geometry、material

黄色的点就是生成的点模型,大家可以修改几何顶点查看不同的效果

线模型

js 复制代码
const material = new THREE.LineBasicMaterial({
  color: 0xffff00
});

const line = new THREE.Line(geometry, material);

scene.add(line);

添加线模型材质与对象

将Line对象换成LineLoop可看到线段闭合效果

js 复制代码
const line = new THREE.LineLoop(geometry, material);

引入外部模型

往往threeJs所提供的几何模型只能实现些简单的模型,一些复杂的模型通常使用建模软件绘制完成后引入。

这里提供一个官方案例中的士兵模型,大家自行下载

将下载好的模型放入public目录下

由于这里提供的模型是glb格式,所以我们引入GLTFLoader

js 复制代码
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
js 复制代码
const loader = new GLTFLoader();
loader.load('/Soldier.glb', (gltf) => {
  scene.add(gltf.scene);

  renderer.render(scene, camera);
});

引入后看到坐标原点有个小黑点,我们拉近相机的距离

js 复制代码
camera.position.set(10, 10, 10);

效果如下

纹理贴图

当我们需要在模型上展示图片时,我们可以使用纹理贴图功能

这里创建一个矩形平面模型

js 复制代码
const geometry = new THREE.PlaneGeometry(200, 100);

const texLoader = new THREE.TextureLoader();

const texture = texLoader.load(
  'https://cc-blog-admin.oss-cn-beijing.aliyuncs.com/image/2023-09-11/5db9622b-243d-404f-b7a4-05147f486f24.png'
);

const material = new THREE.MeshLambertMaterial({ map: texture, side: THREE.DoubleSide });

const mesh = new THREE.Mesh(geometry, material);

scene.add(mesh)

效果如下

如果将PlaneGeometry换成BoxGeometry

会看到六个面都贴上了图片

相关推荐
她说可以呀1 小时前
Vue插槽
前端·javascript·vue.js
qq_448011161 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan2 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352902 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝3 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing034 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel4 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放4 小时前
Python基础语法练习题(73)
java·前端·python
风骏时光牛马4 小时前
面向复杂场景的大模型应用落地与能力优化实践
前端
小小善后师5 小时前
我做了个病历归档小程序,被 AI 识别的"最后一公里"狠狠上了一课
前端