p5.js 加载 3D 模型(loadModel)

点赞 + 关注 + 收藏 = 学会了

什么是 loadModel?

loadModel() 是 p5.js 中用于加载 3D 模型的核心函数,它能将 OBJ 或 STL 格式的 3D 模型文件转换为 p5.js 可处理的 p5.Geometry 对象,之后可以通过 model() 函数在画布上显示。

基础语法结构

js 复制代码
loadModel(path, [options])
// 或(旧版语法,功能相同)
loadModel(path, [normalize], [successCallback], [failureCallback])
  • path:模型文件的位置,支持两种路径形式:

    • 本地路径:如 'assets/model.obj'(推荐将模型放在项目的 assets 文件夹中)

    • 网络 URL:如 'https://example.com/model.stl'(受浏览器跨域限制,本地测试可能失败)

注意: 路径错误会导致加载失败,可通过失败回调函数排查。

  • 可选参数:options(配置对象,推荐使用)

这是最灵活的参数形式,通过一个对象配置所有加载选项,支持以下属性:

属性名 类型 作用 默认值
normalize 布尔值 若为 true,自动缩放模型至适合画布大小(避免模型过大 / 过小) false
successCallback 函数 模型加载成功后执行的函数(参数为加载完成的 p5.Geometry 对象)
failureCallback 函数 模型加载失败后执行的函数(参数为错误信息对象)
flipU 布尔值 翻转纹理的 U 坐标(解决纹理左右颠倒问题) false
flipV 布尔值 翻转纹理的 V 坐标(解决纹理上下颠倒问题) false
fileType 字符串 强制指定文件类型(.obj.stl),当路径不含扩展名时使用 自动从路径推断
  • 可选参数:normalize(单独缩放控制,旧版语法)

    • 类型:布尔值

    • 作用 :等同于 options.normalize,控制是否自动缩放模型

    • 使用场景 :不需要其他配置时,可简化为 loadModel(path, true)

  • 可选参数:successCallbackfailureCallback(回调函数,旧版语法)

    • 类型:函数

    • 作用 :分别对应 options.successCallbackoptions.failureCallback

    • 使用场景:仅需要处理加载结果,不需要其他配置时使用

  • 返回值p5.Geometry 对象(包含模型的顶点、面、法向量等数据)

  • 必须在 preload() 中调用 :因为模型加载是异步操作,preload() 会等待所有加载完成后再执行 setup(),避免使用未加载的模型导致错误。

基础用法

在使用 loadModel() 之前,需要准备一个模型文件。

练手的话,可以用我这个模型。

  1. 在你的项目根目录中创建一个 assets 文件夹。
  2. assets 里创建一个 cube.obj 文件。注意后缀是 .obj
  3. 将下面这段代码放在 cube.obj 里保存好。
bash 复制代码
# 带底面的四棱锥模型
# 顶点坐标 (v x y z)
v  40.0  0.0  40.0   # 底面右上角
v -40.0  0.0  40.0   # 底面左上角
v -40.0  0.0 -40.0   # 底面左下角
v  40.0  0.0 -40.0   # 底面右下角
v  0.0  3.0  0.0   # 顶点

# 纹理坐标 (vt u v)
vt 1.0 1.0
vt 0.0 1.0
vt 0.0 0.0
vt 1.0 0.0
vt 0.5 0.0

# 法向量 (vn x y z)
vn 0.0 -1.0 0.0    # 底面法向量(向下)
vn 0.0 0.5 0.5     # 前面法向量
vn -0.5 0.5 0.0    # 左面法向量
vn 0.0 0.5 -0.5    # 后面法向量
vn 0.5 0.5 0.0     # 右面法向量

# 面定义(顶点/纹理/法向量)
f 1/1/1 2/2/1 3/3/1 4/4/1  # 底面
f 1/1/2 2/2/2 5/5/2        # 前面
f 2/1/3 3/2/3 5/5/3        # 左面
f 3/1/4 4/2/4 5/5/4        # 后面
f 4/1/5 1/2/5 5/5/5        # 右面

加载并显示模型

js 复制代码
let myModel; // 存储模型对象

// 预加载:在程序开始前完成加载
function preload() {
  // 加载模型(路径改为你的模型文件位置)
  myModel = loadModel('assets/cube.obj'); 
}

function setup() {
  createCanvas(800, 600, WEBGL); // 创建3D画布(必须用WEBGL渲染模式)
}

function draw() {
  background(220);
  
  // 3D变换:让模型旋转,更易观察
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  
  // 显示模型
  model(myModel);
}

运行代码可以看到一个会动的平面出现在画布里。

参数与回调函数

带加载回调(适合处理加载状态)

js 复制代码
let myModel;
let loadStatus = "加载中...";

function preload() {
  // 路径 + 成功回调 + 失败回调
  loadModel(
    'assets/cube.obj', 
    (model) => { // 成功回调:模型加载完成后执行
      myModel = model;
      loadStatus = "加载成功!";
    }, 
    (error) => { // 失败回调:加载出错时执行
      loadStatus = "加载失败:" + error.message;
    }
  );
}

function setup() {
  createCanvas(400, 400, WEBGL);
}

function draw() {
  background(0);
  fill(255);
  // 显示加载状态(2D文字需用screenX/screenY转换坐标)
  push();
  translate(-width/2 + 20, -height/2 + 20);
  text(loadStatus, 0, 0); // 左上角显示状态
  pop();
  
  if (myModel) { // 模型加载完成后才显示
    rotateX(frameCount * 0.01);
    rotateY(frameCount * 0.01);
    model(myModel);
  }
}

通过回调函数实时反馈加载状态,避免因加载失败导致程序崩溃。

自动适配画布大小(normalize 参数)

js 复制代码
let myModel;

function preload() {
  // 第二个参数设为true:自动缩放模型以适应画布
  myModel = loadModel('assets/cube.obj', true); 
}

function setup() {
  createCanvas(400, 400, WEBGL);
}

function draw() {
  background(240);
  orbitControl(); // 允许鼠标拖拽旋转模型
  model(myModel);
}

当模型过大或过小时,normalize: true 会自动缩放模型,避免超出画布或过小看不清。


以上就是本文的全部内容啦,想了解更多 P5.js 用法欢迎关注 《P5.js中文教程》

可以➕我 green bubble 吹吹水咯

点赞 + 关注 + 收藏 = 学会了

相关推荐
崔庆才丨静觅13 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606114 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了14 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅14 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅14 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅15 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment15 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅15 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊15 小时前
jwt介绍
前端
爱敲代码的小鱼15 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax