尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
叶片浮雕:Sobel 梯度到伪法线
一张灰度叶片加上一点方向光就会像压在纸里的浅浮雕。这个效果很好玩但它没有从照片里恢复真实三维。更准确的说法是把灰度当作人为指定的高度再由邻域差分构造一张伪法线图。从高度差开始Sobel 的横、纵卷积核分别估计两个方向的变化。下面将结果除以 8使单位斜坡的内点梯度接近 1再乘上强度参数。法线取(-gx,-gy,1)后归一化和同样归一化、从表面指向光源的光向量点乘得到一个简化漫反射亮度。内图黄色箭头画的是入射光线与公式中从表面指向光源的 L 方向相反。坐标方向必须说清楚图像 y 轴向下光向量也用同一坐标约定。若一边把 y 当屏幕向下另一边却当世界向上阴影就会翻转。边界使用钳位采样不会读取越界数据但会造成边缘梯度和内点不同。Canvas 像素接口可以接收最终像素数组。本例刻意先保留一维高度数组不把图像读取、色彩管理和卷积混在一起。输入若来自 sRGB 照片还需要决定灰度与高度的映射不能默认亮的地方一定凸起。用平面检查方向纯常量图应该得到朝向正 z 的法线沿 x 递增的平面在内点应该得到负 x 分量。这样的例子比“看起来挺立体”更能暴露符号错误。下面生成一个高斯形小丘只用于观看明暗它不是植物组织模型也没有环境遮蔽、镜面反射和投影。运行node relief.js输出relief.pgm。本地测试覆盖常量、斜坡、单位法线和边界索引没有测试真实照片、GPU、浏览器上传与性能。把每一步留成独立函数后面想换高度图或光照才不会同时打破所有环节。可独立运行的核心例子const fsrequire(node:fs); function normalAt(a,w,h,x,y,strength1) { const sample(dx,dy)a[Math.max(0,Math.min(h-1,ydy))*wMath.max(0,Math.min(w-1,xdx))]; const gx(-sample(-1,-1)sample(1,-1)-2*sample(-1,0)2*sample(1,0)-sample(-1,1)sample(1,1))/8; const gy(-sample(-1,-1)-2*sample(0,-1)-sample(1,-1)sample(-1,1)2*sample(0,1)sample(1,1))/8; const v[-gx*strength,-gy*strength,1],lengthMath.hypot(...v); return v.map(xx/length); } const flatArray(25).fill(3),rampArray.from({length:25},(_,i)i%5); if(normalAt(flat,5,5,2,2).join(,)!0,0,1)throw Error(平面错误); const nnormalAt(ramp,5,5,2,2); if(Math.abs(n[0]1/Math.sqrt(2))1e-9||Math.abs(Math.hypot(...n)-1)1e-9)throw Error(梯度错误); const w64,h64,aArray.from({length:w*h},(_,i)10*Math.exp(-((i%w-32)**2(Math.floor(i/w)-32)**2)/200)); const light[-.5,-.5,1],llMath.hypot(...light),llight.map(xx/ll); const pixelsa.map((_,i){ const nnormalAt(a,w,h,i%w,Math.floor(i/w),2); const dotn.reduce((sum,x,j)sumx*l[j],0); return Math.round(255*(.2.8*Math.max(0,dot))); }); if(pixels.some(x!Number.isFinite(x)||x0||x255))throw Error(灰度越界); fs.writeFileSync(relief.pgm,P2\n${w} ${h}\n255\npixels.join( )); console.log(已生成 relief.pgm);内图借叶片说明流程代码用高斯小丘验证法线并未恢复叶片三维。
RELATED

相关推荐

AdaIN风格迁移:利用特征统计量实现实时任意风格转换

AdaIN风格迁移:利用特征统计量实现实时任意风格转换

简介:这是一份围绕AdaIN的图像风格迁移实战资源包,面向人工智能、机器学习方向的开发者与学习者,旨在帮助读者理解并实现基于深度学习的艺术风格迁移技术,将照片内容与名画风格进行融合。资源包共30个文件,压缩后约17.…

📅 2026/10/27 9:38:12
Agent Skills深度解析:从提示词到AI可复用技能资产

Agent Skills深度解析:从提示词到AI可复用技能资产

说实话,我最近无论刷技术社区还是看各大 AI 工具的更新日志,都绕不开“skills”这个词。Claude 官方端出了 Agent Skills,OpenAI 的 Codex 也紧随其后搞了自己的 Skills 体系,再加上各路效率博主整理的“skill 推荐”“skill 下载…

📅 2026/10/27 9:38:12
微电网两阶段鲁棒优化实战:MATLAB+YALMIP+CPLEX建模与CCG求解全攻略

微电网两阶段鲁棒优化实战:MATLAB+YALMIP+CPLEX建模与CCG求解全攻略

简介:面向微电网经济调度与不确定性优化方向的研究生和工程师,这份代码基于MATLABYALMIPCPLEX完整复现了《微电网两阶段鲁棒优化经济调度方法_刘一欣》一文。针对原文中导致模型难以求解的少量笔误,作者通过邮件与通讯作者确认并做了修正&…

📅 2026/10/27 9:38:12
MORE NEWS

更多资讯

📰

可直接运行的数据库系统概论课程设计包:MySQL导入建表与事务实验避坑

简介:山东科技大学数据库系统概论课程设计是一份面向高校数据库课程学习者与初学者的实践资料,围绕数据表的创建与修改展开,帮助读者把SQL建表、改表等课堂概念落到可运行的程序中。压缩包共5个文件,以2个txt说明与测试数据、1个c…

📰

从用例图到双账本:超市进销存系统库存一致性设计

简介:这份超市进销存管理系统源码与用例图资料,面向学习零售业务系统开发的学生、课程设计者及初级开发者,围绕商品进货、销售、库存、订单等流程提供可运行参考。压缩包共103个文件、约2.03MB,以aspx页面、cs后台代码、jpg/gif界…

📰

重复文件清理技术:原理、工具与最佳实践

1. 重复文件清理痛点与解决方案 作为一名长期与数字文件打交道的从业者,我深刻理解重复文件带来的困扰。在日常工作中,我们经常会遇到这样的情况:同一份文档被多次保存到不同文件夹,下载的图片在不同设备间同步时产生副本&#xf…

📰

ModelSim老工程救星:GCC 4.2.1 MinGW32 VC9编译包详解与避坑指南

简介:这份资源是面向32位Windows环境下硬件仿真开发的GCC编译器集成包,专为ModelSim与QuestaSim用户准备,解决仿真环境中缺少可用C/C编译与链接工具的问题,适合从事Verilog/VHDL验证、嵌入式软件协同调试的工程师与学习者。压缩包…

📰

Delphi老项目数据库层拆解:MyDAC v5.10源码精读与二次开发实践

简介:MySQL Data Access Components(MyDAC)v5.10 源文件面向使用 Delphi 7 至 2007 及 CBuilder 的数据库开发者,用于在不依赖第三方库或中间件的前提下直接连接 MySQL 服务器,完成数据读取、写入、更新与删除等操作。…

📰

Android Gradle 依赖治理:Version Catalogs 四层协同实践

简介:本资源是一套面向Android开发者的Gradle依赖统一管理实践方案,聚焦Windows平台下的Gradle命令高效执行与工程化配置优化。针对开发者常因环境差异(如Windows下需去除./前缀)导致命令执行失败、依赖管理混乱等问题&#xff0c…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬