当前位置: 首页 > news >正文

p5.js 从零开始创建 3D 模型,createModel入门指南

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

如果你已经开始探索 p5.js 的 3D 世界,那么createModel()这个 API 绝对是你需要掌握的强大工具。它允许你创建自定义的 3D 几何模型,为你的创意提供无限可能。

什么是 createModel ()?

createModel() 用于从一个 OBJSTL 格式的 字符串 中加载 3D 模型,并返回一个 p5.Geometry 对象。它适用于已经以文本形式(例如通过 loadStrings() 读取文件后拼接的字符串)拿到模型数据的场景。

为什么要用 createModel()

  • 当你想在运行时动态获取模型(比如用户上传、通过网络接口拿到纯文本 OBJ/STL)并立即生成几何体时,createModel() 十分方便。
  • 如果只是从本地或服务器文件直接加载,更常用的是 loadModel(),它会返回同样的 p5.Geometry

语法

let geom = createModel(modelString, fileType, normalize, successCallback, failureCallback)
参数名类型说明
modelStringString必填,OBJ/STL 文件的文本内容。通常通过 loadStrings() 或者从服务器拉取后用 join('\n') 拼接。
fileTypeString必填,模型格式,'obj''stl'(不含点号)。
normalizeBoolean可选,是否在加载时对模型做统一缩放。若 true,自动根据模型最大边长进行缩放,便于在画布中展示。
successFunction可选,加载成功后的回调,参数为得到的 p5.Geometry 对象。
failureFunction可选,加载失败后的回调,参数为事件错误对象。
flipU, flipVBoolean可选,是否翻转 U/V 纹理坐标(OBJ/STL 若带纹理时使用)。

返回值:一个 p5.Geometry 实例,你可以直接用 model(geometry)draw() 中渲染。

基础 Demo:加载并绘制一个立方体

写一个最简立方体的 OBJ 文本,然后用 createModel() 加载并画出来。

let cubeGeo;  // 存放 p5.Geometryfunction setup() {createCanvas(400, 400, WEBGL);// 定义一个简单立方体的 OBJ 文本(8 个顶点,6 个面)const cubeObj = `
v -1 -1  1
v  1 -1  1
v  1  1  1
v -1  1  1
v -1 -1 -1
v  1 -1 -1
v  1  1 -1
v -1  1 -1
f 1 2 3 4
f 5 6 7 8
f 1 5 8 4
f 2 6 7 3
f 1 2 6 5
f 4 3 7 8`;// 加载几何体:传入字符串、格式、归一化为 truecubeGeo = createModel(cubeObj, '.obj', true, // 加载成功回调(可选)function(g) {console.log('模型加载完成,共有顶点:', g.vertices.length);},// 加载失败回调(可选)function(err) {console.error('模型加载失败:', err);});
}function draw() {background(30);orbitControl();              // 支持拖拽旋转视角ambientLight(100);directionalLight(255, 255, 255, 0.5, 1, -0.5);push();rotateY(frameCount * 0.01);rotateX(frameCount * 0.008);normalMaterial();          // 根据法线给模型着色model(cubeGeo);            // 渲染几何体pop();
}

一个可用鼠标拖拽姿态的彩色旋转立方体。


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

也可以➕我 green bubble 吹吹水咯

在这里插入图片描述

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

http://www.dtcms.com/a/303859.html

相关文章:

  • Adv. Sci. 前沿:非零高斯曲率3D结构可逆转换!液晶弹性体多级形变新策略
  • VSCode使用Code Runner运行C/C++输出[Done] exited with code=0 in xxx seconds
  • Marin说PCB之POC电路layout设计仿真案例---10
  • 机械学习--线性回归---三个小案例
  • p5.js 矩形rect绘制教程
  • Ubuntu环境下搭建CUDA编程环境
  • Charles中文版使用指南:如何利用抓包工具优化API调试与网络性能
  • Ubuntu20.04安装和配置Samba实现Win11下共享文件夹
  • 「源力觉醒 创作者计划」 百度AI的战略“惊蛰”,一场重塑格局的“破壁行动”
  • 深度学习篇---百度AI Studio模型
  • 2411.按位或最大的最小子数组长度
  • 服务器中涉及节流(Throttle)的硬件组件及其应用注意事项
  • 服务器分布式的作用都有什么?
  • 《Java 程序设计》第 9 章 - 内部类、枚举和注解
  • ClickHouse MergeTree引擎:从核心架构到三级索引实战
  • C++实现黑板模式操作
  • 怎么提升服务器的防攻击能力!
  • 异地协同新玩法!Docker+Neko+cpolar打造云端共享浏览器
  • Sea AI Lab万信逸博士:大模型训练流水线并行四部曲:吞吐、内存、负载均衡与线性扩展
  • 专业Python爬虫实战教程:逆向加密接口与验证码突破完整案例
  • C 语言指针深度解析:从数组指针到指针函数的实战指南
  • 【21】C# 窗体应用WinForm ——图片框PictureBox属性、方法、实例应用
  • 重生之我在暑假学习微服务第四天《Docker-下篇》
  • Intellij Idea--解决Cannot download “https://start.spring.io‘: Connect timedout
  • React面试题目和答案大全
  • 队列算法之【用队列实现栈】
  • 系统重启过程和启动目标
  • Note3: CNN(卷积神经网络)
  • java每日精进 7.29【框架数据权限详解】
  • 远程Qt Creator中文输入解决方案