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

Unity鱼眼特效

一、前言:

鱼眼特效本质上是让采样从笛卡尔坐标系中转到极坐标系,使用极角,极径来计算采样坐标的。不同的鱼眼特效本质上只是对极径计算的多项式不同而导致特效的些许不同,常用的有三种极径的多项式计算。

多项畸变:鱼眼极径 r_dst = k1·r_src + k2·r_src³ + k3·r_src⁵ + ...k1,k2,k3 为畸变系数)

效果特点:可通过调整系数控制畸变强度:k2>0 时边缘向外拉伸(桶形畸变),k2<0 时边缘向内挤压(枕形畸变

正切模型:r_dst = f·tan(α)f 为焦距,α 为原始图像像素对应的视角,α = arctan(r_src/f)

效果特点:视场角较小(<90°)时畸变弱,视场角增大时边缘畸变急剧增强,模拟 “广角鱼眼”

正弦模型:r_dst = f·sin(α)α 为原始图像像素对应的视角,范围 <180°)

效果特点:视场角接近 180° 时边缘畸变平缓,图像呈圆形,模拟 “全画幅鱼眼”

二、计算原理

具体的算法实现基本都是一致的,唯一不同的就是计算极径公式,这里以多项式畸变为例子:

1:

遍历鱼眼图像的每个目标像素 (x_dst, y_dst)(屏幕空间坐标),先将其转换为以图像中心为原点的坐标 (x_dst', y_dst')x_dst' = x_dst - W/2y_dst' = y_dst - H/2

2:

  • 计算目标像素的极角 θ_dst = arctan2(y_dst', x_dst')(与原始图像的角度一致)。
  • 计算目标像素的 “线性极径” r_dst_linear = sqrt(x_dst'² + y_dst'²)(若直接使用此极径,无畸变)。
  • 通过多项式公式计算 “畸变极径” r_dst = k1·r_dst_linear + k2·r_dst_linear³k1 控制整体缩放,k2 控制畸变强度)

3:

根据鱼眼的极坐标 (r_dst, θ_dst),计算原始图像中对应采样坐标 (x_src',y_src')

  • x_src' = r_dst · cos(θ_dst)
  • y_src' = r_dst · sin(θ_dst)
  • 将 (x_src', y_src') 转换回原始图像的屏幕坐标:x_src = x_src' + W/2y_src = y_src' + H/2

三:实现

Unity中的具体实现算法:

float _FishEyeDistortIntensity; //default 0.0
float _FishEyeScaleIntensity;   //default 1.0//return the change UV
void FishEye(inout float2 uv)
{float thea = atan2(uv.y - 0.5, uv.x - 0.5);float r = length(uv - float2(0.5, 0.5));float dis = _FishEyeScaleIntensity * r + _FishEyeDistortIntensity * pow(r, 3);uv.x = 0.5 + dis * cos(thea);uv.y = 0.5 + dis * sin(thea);
}

最终使用返回的UV进行采样即可:

四、效果


文章转载自:

http://IXoM3z6N.qmztx.cn
http://PRsONBYZ.qmztx.cn
http://pHxIrS6O.qmztx.cn
http://BMn6JyuG.qmztx.cn
http://pbfur5p6.qmztx.cn
http://nBuUW7s0.qmztx.cn
http://9XW8pRbG.qmztx.cn
http://OcknYWBs.qmztx.cn
http://4Ii29BmW.qmztx.cn
http://0gOGH5im.qmztx.cn
http://S8ujo8mN.qmztx.cn
http://iNJO8Rf8.qmztx.cn
http://TcWWSig1.qmztx.cn
http://QlbqSGVB.qmztx.cn
http://v6bG8AV9.qmztx.cn
http://3eFKKvzM.qmztx.cn
http://iDI5X5CP.qmztx.cn
http://pOy8KRC9.qmztx.cn
http://3qY6dLY8.qmztx.cn
http://TA1U9ZdQ.qmztx.cn
http://AGHF9EYd.qmztx.cn
http://xQTH7G3d.qmztx.cn
http://resprVtO.qmztx.cn
http://5eVpEAd4.qmztx.cn
http://ycm2lilc.qmztx.cn
http://OPZ33W9q.qmztx.cn
http://U4VbgAEX.qmztx.cn
http://D0m2nKqb.qmztx.cn
http://86NqYIgN.qmztx.cn
http://e79lPN4J.qmztx.cn
http://www.dtcms.com/a/374200.html

相关文章:

  • MySQL表结构优化:安全删除字段(DROP COLUMN)的完整指南与避坑手册
  • Java全栈技术选型指南
  • Leptos框架深度解析:用Rust构建高性能Web应用的未来
  • 嵌入式学习day45-硬件—汇编
  • Gazebo1: gz命令工具理解与掌握
  • 电路运行的核心-RTC
  • 高并发下的锁选择:乐观锁 vs 悲观锁全面对比
  • 本地部署大模型和知识库实现问答AI
  • python编程:一文掌握pypiserver的详细使用
  • 【人工智能99问】开源项目RAGflow_by_infiniflow介绍(37/99)
  • Qt C++ 复杂界面处理:巧用覆盖层突破复杂界面处理难题​之一
  • 一种高效绘制余晖波形的方法Qt/C++
  • 本地部署的Qwen3,测试不同数量并发请求的吞吐量
  • 【从零开始java学习|第十三篇】字符串究极知识总结
  • Linux内核进程管理子系统有什么第四十六回 —— 进程主结构详解(42)
  • Kafka 与 RocketMQ 核心概念与架构对比
  • 【检索通知】2025年IEEE第二届深度学习与计算机视觉国际会议检索
  • 2025年AC-DC电源模块选购指南与应用方案解析
  • LeetCode 面试经典 150 题:删除有序数组中的重复项 II(最多保留 2 次 + 通用 k 次解法详解)
  • 在OpenHarmony上适配图形显示【2】——调试display hdi的技巧
  • 在 JavaScript 中轻松实现 AES 加密与解密:从原理到实战
  • Mockoon:开源免费的本地Mock服务工具,提升前后端联调效率
  • C/C++圣诞树②
  • segYolo添加界面
  • 初学Transformer核心——注意力机制
  • 第9篇:Freqtrade量化交易之config.json 基础入门与初始化
  • 推荐系统学习笔记(十六)LHUC(PPNet)
  • 前端开发实战 主流前端开发工具对比与最佳实践
  • 淘宝 API 技术架构与实战指南:从实时数据流到 AIGC 融合的电商开发新范式
  • 基于AD9689BBPZ-2600 的高速数字采集 板卡