Unity中Shader旋转矩阵(二维旋转矩阵)

文章目录

  • 前言
  • 一、旋转矩阵的原理
    • 1、我们以原点为中心,旋转坐标轴θ度
    • 2、求 P~2x~:
    • 3、求P~2y~:
    • 4、最后得到 P~2~点 的点阵
    • 5、该点阵可以拆分为以下两个矩阵相乘的结果
  • 二、在Shader中,使用该旋转矩阵实现围绕 z 轴旋转
    • 1、在属性面板定义 float 变量作为旋转的角度θ
    • 2、在常量缓冲区申明该变量
    • 3、在 顶点着色器 定义旋转矩阵
    • 4、用旋转矩阵乘以顶点的 xy 实现围绕z轴旋转
    • 5、效果
  • 三、测试代码


前言

在Shader中,我们经常对顶点进行旋转变换。我们在这篇文章中了解一下旋转使用的旋转矩阵。


一、旋转矩阵的原理

我们先在2D平面下,了解2D原理

1、我们以原点为中心,旋转坐标轴θ度

我们需要求的就是坐标系旋转后,P点在旋转后坐标系中的位置。

因为,我们旋转物体时,我们是围绕着一个轴旋转。
旋转后,我们需要求的就是物体顶点围绕该轴旋转后的坐标位置。
这里我们的 P 点就像 模型的顶点一样,得到P点的位置,就相当于得到了模型顶点在旋转后的位置。

  • 旋转前 P1(2,3)
  • 旋转后 P2 (?,?)
    在这里插入图片描述

2、求 P2x

  • 求 P2x 可以化为求 OB + BC
    在这里插入图片描述

  • 求OB:
    在这里插入图片描述

  • 求BC:
    在这里插入图片描述

  • P2x = OB + BC
    P2x = OB + BC = cos(θ)P1x + sin(θ)P1y

3、求P2y:

  • 求P2y可以化为求 OC - AC
    在这里插入图片描述
  • 求OC:
    在这里插入图片描述
  • 求AC:
    在这里插入图片描述
  • P2y = OC - AC
    P2y = OC - AC = cos(θ)P1y - sin(θ)P1x

4、最后得到 P2点 的点阵

这个点阵就是我们旋转矩阵的核心

  • P2x = OB + BC = cos(θ)P1x + sin(θ)P1y
  • P2y = OC - AC = cos(θ)P1y - sin(θ)P1x

在这里插入图片描述

5、该点阵可以拆分为以下两个矩阵相乘的结果

因为,我们该点阵目前是在二维平面旋转。所以,可以认为我们是围绕 z 轴在旋转。

  • Mrotate就是我们的旋转矩阵
  • P1 就是我们旋转前的点
    在这里插入图片描述

二、在Shader中,使用该旋转矩阵实现围绕 z 轴旋转

1、在属性面板定义 float 变量作为旋转的角度θ

_Angle(“Angle”,Float) = 0

2、在常量缓冲区申明该变量

CBUFFER_START(UnityPerMaterial)
float _Angle;
CBUFFER_END

3、在 顶点着色器 定义旋转矩阵

float2x2 M_rotate = float2x2
(
cos(_Angle),sin(_Angle),
-sin(_Angle),cos(_Angle)
);

4、用旋转矩阵乘以顶点的 xy 实现围绕z轴旋转

v.vertexOS.xy = mul(M_rotate,v.vertexOS.xy);

5、效果

围绕x轴旋转 和 围绕y轴旋转,我们可以修改 .xy 来实现。
请添加图片描述


三、测试代码

//平移变换
//缩放变换
//旋转变换
Shader "MyShader/URP/P3_5_5"
{Properties{_Translate("Translate(XYZ)",Vector) = (0,0,0,0)_Scale("Scale(XYZ)",Vector)= (1,1,1,1)_Angle("Angle",Float) = 0}SubShader{Tags{"PenderPipeline"="UniversalPipeline""RenderType"="Opaque""Queue"="Geometry"}Pass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attribute{float4 vertexOS : POSITION;};struct Varying{float4 vertexCS : SV_POSITION;};CBUFFER_START(UnityPerMaterial)float4 _Translate;float4 _Scale;float _Angle;CBUFFER_ENDVarying vert (Attribute v){Varying o;//平移变换float4x4 M_Translate = float4x4(1,0,0,_Translate.x,0,1,0,_Translate.y,0,0,1,_Translate.z,0,0,0,1);v.vertexOS = mul(M_Translate,v.vertexOS);//缩放交换float4x4 M_Scale = float4x4(_Scale.x,0,0,0,0,_Scale.y,0,0,0,0,_Scale.z,0,0,0,0,1);v.vertexOS = mul(M_Scale,v.vertexOS);//旋转变换float2x2 M_rotate = float2x2(cos(_Angle),sin(_Angle),-sin(_Angle),cos(_Angle));v.vertexOS.xy = mul(M_rotate,v.vertexOS.xy);o.vertexCS = TransformObjectToHClip(v.vertexOS.xyz);return o;}half4 frag (Varying i) : SV_Target{return 1;}ENDHLSL}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/292819.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业级低代码平台:助力IT部门,释放业务创新力

随着低代码技术的升级,越来越多的企业开始采用低代码平台,如恒逸集团利用低代码平台快速搭建了综合业务管理平台,时间比传统开发缩短近一倍。云表低代码提供的数据、流程、权限、图表等引擎工具,完美适配企业数字化需求。根据Gart…

java设计模式学习之【责任链模式】

文章目录 引言责任链模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用日志示例代码地址 引言 在现实生活中,常常会遇到这样的场景:一个请求或命令需要经过多个层级的处理。例如,一个行政审批流程可能需要通过多个部门的审…

FPGA未解之谜

一.ila一会能加载出波形,一会加载不出波形——在自己做的v7开发板中遇到,其他开发板从未遇到过 1.小梅哥说:可能与硬件jtag连接不稳定导致。

VScode 工作区配置 和 用户配置

一、工作区配置 通常不同的项目都有不同的配置,我一般都是使用eslint和prettier一起用,所以经常会有这几个文件: 这里简单介绍一下这几个文件的作用吧。 1.vscode文件夹下 一般有两个文件,extensions.json和settings.json。 e…

linux 驱动——私有数据

文章目录 linux 驱动中的私有数据container_of驱动程序数据结构定义 应用程序模块使用 linux 驱动中的私有数据 前面的程序中,都只申请了一个从设备号,这里使用 alloc_chrdev_region 分配两个设备号,这两个设备共用 ops 方法。 所以需要在 …

福建农林大学 html +css + JavaScript 期末复习 -- 保姆级

html css JavaScript 期末复习&#xff08;保姆级复盘&#xff09; 考试题型 1、选择题 20题 30分 2、判断题 15题 15分 3、程序题 3 题 30分 4、综合题 2 题 25分 1、网页第一代文本标签&#xff08;直接上代码&#xff0c;看保姆级注解&#xff09; <!-- doctype: docum…

【Spring Boot】面试题汇总,带答案的那种

继上次的文章【MySQL连环炮&#xff0c;你抗的住嘛&#xff1f;】爆火之后&#xff0c;越来越多的小伙伴后台留言&#xff0c;要求阿Q总结下其他的“连环炮”知识点&#xff0c;想在金九银十的面试黄金期轻松对线面试官。 同样为了节省大家的时间&#xff0c;阿Q最近对【Sprin…

世界第一!移动云刷新虚拟化性能测试世界纪录

近日&#xff0c;国际权威性能测评机构SPEC公布了最新一期虚拟化性能基准测试结果&#xff0c;移动云大云天元操作系统&#xff08;BC-Linux&#xff09;&#xff0c;凭借其出色的虚拟化性能&#xff0c;一举将世界纪录提升了10%&#xff0c;总分达到了8336分。 移动云SPEC vir…

口碑好的国产主食冻干猫粮品牌有哪些?盘点十大放心猫粮国产名单

冻干猫粮可以帮助猫咪摄入更多的水分&#xff0c;因为冻干是高蛋白质的食物&#xff0c;当猫咪吃了冻干猫粮后&#xff0c;会感到口渴&#xff0c;从而更主动地去喝水。对于那些不喜欢喝水的猫咪&#xff0c;可以将冻干复水后再喂给它们&#xff0c;这样也可以增加猫咪的水分摄…

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜C

老规矩&#xff0c;先看目录&#xff0c;平均每个3-4C&#xff08;C是月饼&#xff0c;月饼一般分为4块&#xff09; C是什么&#xff0c;是两个都不行了&#xff0c;但联合起来可以&#xff0c;联合的英文是combined&#xff0c;好的&#xff0c;我知道这个英文也记不住&#…

深度学习目标检测(2)yolov3设计思想

YOLOv3基础 YOLOv3算法基本思想可以分成两部分&#xff1a; 按一定规则在图片上产生一系列的候选区域&#xff0c;然后根据这些候选区域与图片上物体真实框之间的位置关系对候选区域进行标注。跟真实框足够接近的那些候选区域会被标注为正样本&#xff0c;同时将真实框的位置…

RTP/RTCP/RTSP/SIP/SDP/RTMP对比

RTP&#xff08;Real-time Transport Protocol&#xff09;是一种用于实时传输音频和视频数据的协议。它位于传输层和应用层之间&#xff0c;主要负责对媒体数据进行分包、传输和定时。 RTCP&#xff08;Real-Time Control Protocol&#xff09;是 RTP 的控制协议&#xff0c;…