Article details

Three.js r124->r125, 一次从Geometry到BufferGeometry的迁移记录

nano71.com
2024/4/8 19:40:58
0 comments
69 views

前言
在Three.js r125版本更新中,Geometry和Face3将被永久删除,如果我从r124更新到此版本及以后的版本,这会直接导致我的网站主页项目中出现THREE.Geometry is not a constructor错误

尝试

我们可以从three.js仓库的deprecated文件夹获取已删除的功能,也可以直接迁移到性能更好的BufferGeometry,同时这也是官方推荐的,这里我选择后者

获取模型数据的不同

看一段我的项目获取Geometry.vertices数据的代码:

// 这段作用是用初始的随机粒子位置变化到模型的顶点位置数据中
for (let i = 0; i < geometry.vertices.length; i++) {
        let tween = new Tween(geometry.vertices[i];);
        const modelVertex = geographyList[index].vertices[i];
        tween
            .to({
                x: modelVertex.x, y: modelVertex.y, z: modelVertex.z,
            },)
            .start()
}

模型顶点数据所对应的关系是:

geometry. vertices: Vector3[]
对应
bufferGeometry.attributes.position.array: any[]

则:

// Geometry用法
for (let i = 0; i < geometry.vertices.length; i++) {
    const vertex = geometry.vertices[i];
    const {x, y, z} = vertex;
}

// BufferGeometry用法
const positions = bufferGeometry.attributes.position.array;
for (let i = 0; i < positions.length; i += 3) {
    const x = positions[i];
    const y = positions[i + 1];
    const z = positions[i + 2];
}

如果搭配Tween使用的话,还得加这一段:

tween.onUpdate((object) => {
            positions[i] = object.x;
            positions[i + 1] = object.y;
            positions[i + 2] = object.z;
            bufferGeometry.attributes.position.needsUpdate = true;
});

写入模型数据的不同
再看一段我的项目使用Geometry写入数据的代码:

// 这段是给每个粒子设置顶点位置信息和颜色
for (let i = 0; i < total; i++) {
    const vertex = new Vector3();
    vertex.x = rangeRandom(minZValue, -minZValue);
    vertex.y = rangeRandom(minYValue, -minYValue);
    vertex.z = rangeRandom(minZValue, -minZValue);
    geometry.vertices.push(vertex);
    geometry.colors.push(new Color(255, 255, 255));
}

模型顶点数据写入方法所对应的是:

geometry.vertices.push(Vector3)
geometry.colors.push(Color)
对应
bufferGeometry.setFromPoints(Vector3[])
bufferGeometry.setAttribute("color", Float32BufferAttribute)

则:

// BufferGeometry用法
const points = []
const colors = [];
for (let i = 0; i < total; i++) {
    const vertex = new Vector3();
    vertex.x = rangeRandom(minZValue, -minZValue);
    vertex.y = rangeRandom(minYValue, -minYValue);
    vertex.z = rangeRandom(minZValue, -minZValue);
    points.push(vertex)
    colors.push(255, 255, 255)
}
bufferGeometry.setFromPoints(points);
bufferGeometry.setAttribute("color", new Float32BufferAttribute(colors, 3));

最后
还有如果用到了THREE.JSONLoader,也会遇到THREE.Geometry is not a constructor错误,这可以直接使用我封装好的JSONLoader:

npm i @nano71/three-jsonloader
import JSONLoader from "@nano71/three-jsonloader";
nano71.com
2024/4/8 19:40:58
0 comments
69 views
Welcome to myBlog-site
Recent
Category
Guestbook
2026/3/10 16:11:31

解决 Dify 数据库插件连接 SQL Server 2008/2012 报错 DB-Lib error message 20002, severity 9

(pymssql.exceptions.OperationalError) (20002, b'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (192.168.0.223)\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (192.168.0.223)\n') (Background on this error at: https://sqlalche.me/e/20/e3q8)

view
coverImage
2025/8/21 15:53:02

代码还原 Pinia 官网上的那个可以互动的小菠萝

眨眼 眼球跟随鼠标 一定时间鼠标不移动眼球归位

view
coverImage
2025/5/20 13:58:34

JDBC速成

JDBC(Java Database Connectivity)是 Java 官方提供的一套 API,集成在 java.sql 和 javax.sql 包中 JDBC 允许 Java 程序连接和操作各种关系型数据库,如 MySQL、Oracle、PostgreSQL、SQL Server 等

view
coverImage
2024/11/25 13:34:21

Node.js实现一个数据缓存服务器

需求场景 公司的数据服务器每次更新部署时,会有一个服务不可用的时间以及服务重新启动的时间,但如果恰巧这段时间有用户进行访问。。。当然,这只适应于非即时性的数据

view
coverImage
2024/7/18 19:30:34

Go的高并发实现:多协程和任务队列设计

前言 随着大学生活的结束,我入职了浙江的一家属于电气制造业的公司,岗位是数据分析,我算是暂时脱离了互联网这一行业,以后可能就很少接触Web开发了;把曾经对Web电子邮件系统中的性能优化的一部分抽出来记录下,也算在表达我对Web后端开发的一种敬意了

view
coverImage
2024/4/25 18:07:59

针对SPA网站的SEO方式探索-2

前言 针对SPA网站,本文将使用Nginx+Express+Puppeteer实现一个高效的SEO工具,大致的实现思路为:Nginx判断UA再进行代理转发,Express负责监听转发的请求,Puppeteer接到Express命令后启动一个无用户界面的Chrome对目标页面进行访问,等待目标SPA页面加载完成后,再返回完整的HTML给爬虫

view
coverImage
loading-GIF