webpack使用Ammo.js - 在react中使用Ammo.js

article/2025/10/8 23:27:20

真实麻烦啊

        • [我的项目仓库 Next.js项目 仅供参考](https://gitee.com/honbingitee/three-template-next.js/tree/feature%2Fphysics/)
        • 本文展示使用`ammo.wasm.js` 结合`ammo.wasm.wasm`的wasm版本使用方法
          • 1. 配置webpack
          • 2. 导出Ammo 修改ammo.wasm.js文件
          • 3. 删除语句 通过查找 `this.Ammo= `删除这句话 这句话会报错this是undefined
          • 4. 添加`ammo.wasm.wasm`文件并在 `ammo.wasm.js`中指定位置

场景: 在react的服务端渲染框架Next.js中使用ammo.js
在原生js中使用非常方便,像three.js示例那样几乎不需要什么配置

在webpack打包的项目中使用Ammo.js还是很繁琐的

有两种选择
ammo.js js版本 目前为止是1.9M 太大了 所以没采用这个方案
ammo.wasm.js wasm版本 使用它需要配合ammo.wasm.wasm两个一起使用 一共大概1M多
文件在此处获取
https://github.com/kripken/ammo.js/tree/main/builds
也可在three文件中获取
位置:

"three/examples/jsm/libs/ammo.wasm.js";

我的项目仓库 Next.js项目 仅供参考

位于physics分支下
在这里插入图片描述

案例在线地址: http://three.hongbin.xyz/three/physics

本文展示使用ammo.wasm.js 结合ammo.wasm.wasm的wasm版本使用方法

1. 配置webpack

源码中有引用fs这个node库的代码 不配置会报fs的错

如果使用create-react-app需要使用工具自定义webpack配置
create-react-app问题不少 不认为是最佳的react项目工具,可以尝试其他基于react的框架

配置如下
在这里插入图片描述
我是在框架的自定义webpack配置文件处更改 但不管怎么变化都是上图的配置
next.config.js

/** @type {import('next').NextConfig} */
const nextConfig = {experimental: {appDir: true,},compiler: {styledComponents: true,},webpack: (config, options) => {// 为了支持 ammo.js 物理引擎config.resolve.extensions.push('.js');config.resolve.fallback = { fs: false };config.resolve.alias.path = require.resolve('path-browserify')return config},
}module.exports = nextConfig
2. 导出Ammo 修改ammo.wasm.js文件

在这里插入图片描述
在文件最后加入默认导出语句

至此应该已经可以打印Ammo函数了
但不能执行 执行会有报错 下面逐一解决

3. 删除语句 通过查找 this.Ammo= 删除这句话 这句话会报错this是undefined

在这里插入图片描述

4. 添加ammo.wasm.wasm文件并在 ammo.wasm.js中指定位置

查找 ammo.wasm.wasm定位位置, ammo.wasm.js中引用了ammo.wasm.wasm 但源码中引用位置不适合现代项目 需要手动指定文件位置
在next.js框架中放在public目录下的文件可以使用/xxx定位 所以我改成了 /ammo.wasm.wasm并将文件放在public目录下 其他框架可以灵活调整
在这里插入图片描述

ok至此 在我的本地项目中已经可以正常使用了
在这里插入图片描述

发现了这个库内置了ammo和three用于开发游戏 物理效果 有兴趣可以尝试 enable3d


http://chatgpt.dhexx.cn/article/ikVklbEI.shtml

相关文章

Vue里面使用threeJS 的 OrbitControls报错问题

vue使用 OrbitControls 首先需要按需引入 1、执行 npm install three --save-dev npm install three --save-dev 2 按需引入 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js; 3 使用鼠标控制器 /*** 创建渲染…

JSM 2019 | 数据驱动在滴滴,详解智能出行时代的统计思维

桔妹导读:当地时间7月27日至8月1日,统计学领域顶级学术会议 JSM(Joint Statistical Meetings)在美国丹佛成功举行。丹佛是美国科罗拉多州的首府和最大城市,紧靠景色秀丽的落基山,气候宜人。平均海拔1610米&…

JM

第3章 JMX-MBean的HelloWorld实例 3.1 前言 Boss Connecter这个项目用到的技术还真够多的,这一章是要用到的JMX技术。什么是JMX?在一篇网文中是这样说的:“JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套…

Three.js--》实现3d圣诞贺卡展示模型

目录 项目搭建 初始化three.js基础代码 加载环境模型 设置环境纹理 添加水面并设置阴影效果 实现幽灵小球的运动 实现相机切换和文字切屏 实现漫天星星和爱心样式 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目…

Three.js 点击模型,高亮发光模型外轮廓

最近在开发一个功能,在三维场景里有很多模型,需要点击模型,高亮对应的模型,代表选中了该模型。做起来还是稍微麻烦一些的。 具体效果 实现流程 主要的流程还是, Created with Raphal 2.3.0 开始 获取鼠标点 射线碰撞…

Three.js--》实现3d汽车模型展览搭建

目录 项目搭建 初始化three.js基础代码 添加汽车模型展示 动态修改汽车模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助…

vue3中使用three.js

现在vue3的项目中,大部分是vitevue3typescriptpinia的技术栈 vue3项目中安装three.js pnpm i types/three three 注意:在package.json中查看他们的版本,如果版本不一致的话,可能导致ts不能识别three这个模块 导入three模块 impor…

three.js学习笔记(十九)——后期处理

介绍 后期处理是指在最终图像(渲染)上添加效果。人们大多在电影制作中使用这种技术,但我们也可以在WebGL中使用。 后期处理可以是略微改善图像或者产生巨大影响效果。 下面链接是Three.js官方文档中一些关于后期处理的示例: http…

JMM--

数据同步的八大原子操作 1.lock 作用于主内存中的变量,把一个变量标记为一条线程的独占状态。 2.unlock 作用于主内存中的变量,把一个处于锁定状态的变量释放出来,释放后的变量才能被其它线程锁定。 3.read 作用于主内存中的变量&#xff0c…

Three.js--》实现3d小岛模型搭建

目录 项目搭建 初始化three.js基础代码 设置环境背景 设置水面样式 添加天空小岛 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还…

JMS简介

jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体…

java jsm_JSM 基础

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多…

JSM

消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer&am…

【HLL】使用 HyperLogLog 去重案例

1.概述 HyperLogLog一个常用的场景就是统计网站的UV。 ##基数 简单来说,基数(cardinality,也译作势),是指一个集合(这里的集合允许存在重复元素)中不同元素的个数。例如看下面的集合: {1,2,3,4,5,2,3,9,7} 这个集合有9个元素,但是2和3各出现了两次,因此不重复的元素…

5redis-----------redis高级--GEO-查询附近的人、基数统计算法HLL 、布隆过滤器、缓存雪崩穿透击穿-------全栈式开发44

redis高级 一、GEO查询附近的人二、基数统计算法-HyperLogLog三、布隆过滤器四、缓存雪崩&缓存穿透(一)缓存雪崩(二)缓存穿透(三)缓存击穿 一、GEO查询附近的人 引入 我们所处的任何位置都可以用经纬…

【Hll】Hll HyperLogLog: Cardinality Estimation(基数估计算法源码解析)

1.概述 好文章,转载防丢失 主要是这里有源码,我遇到问题了,问题是flink在累加器中使用的时候,每次累加最终结果是1,2 每次到了2 就会重新回到1,很郁闷于是看看源码 2.背景 我们经常会统计某个字段的dis…

PostgreSQL HLL插件介绍—晟数学院

更多精彩内容:请登录:ke.sandata.com.cn 前言 HLL是 HyperLogLog数据结构的简称。PostgresSQL通过插件的方式引入了这种新的数据类型hll。HyperLogLog是一个具有固定大小,类似于集合结构,用于可调精度的不同值计数。例如,在1280字节的hll数据结构中,它可以在很小的误差…

Redis介绍、优点,缺点、数据类型:字符串、集合、列表、散列、有序集合、HLL、GEO操作

Redis Redis(REmote DIctionary Server)是一个非常流行的基于内存的轻量级键值数据库(key-value database)。与其把Redis称为一种数据库,不如说Redis是一种数据结构服务器更为恰当。Redis原生地在内存中实现了多种类型…

java postgresql插件_PostgreSQL HLL插件介绍

前言 HLL是 HyperLogLog数据结构的简称。PostgresSQL通过插件的方式引入了这种新的数据类型hll。HyperLogLog是一个具有固定大小,类似于集合结构,用于可调精度的不同值计数。例如,在1280字节的hll数据结构中,它可以在很小的误差范…

DataSketches HLL Sketch module

上图是官网的介绍,翻译后的意思是此模块提供Apache Druid聚合器为不同的计数基于HLL sketch来自datasketches数据库。摄入的时候这个聚合器创建HLL sketch对象存储在Druid的segments中。在查询的时候sketches被读取并且被合并到一起。最后默认情况下,你可…