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

这篇具有很好参考价值的文章主要介绍了Unity中Shader旋转矩阵(二维旋转矩阵)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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


一、旋转矩阵的原理

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

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

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

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

  • 旋转前 P1(2,3)
  • 旋转后 P2 (?,?)
    Unity中Shader旋转矩阵(二维旋转矩阵),Unity,unity,矩阵,游戏引擎

2、求 P2x:

  • 求 P2x 可以化为求 OB + BC
    Unity中Shader旋转矩阵(二维旋转矩阵),Unity,unity,矩阵,游戏引擎
  • 求OB:

c o s ( θ ) = O B O A cos(θ) = \frac{OB}{OA} cos(θ)=OAOB

O B = c o s ( θ ) ∗ O A OB = cos(θ)*OA OB=cos(θ)OA

O B = c o s ( θ ) ∗ P 1 x OB = cos(θ)*P_{1x} OB=cos(θ)P1x

  • 求BC:
    s i n ( θ ) = A D A P sin(θ) = \frac{AD}{AP} sin(θ)=APAD

A D = s i n ( θ ) ∗ A P AD = sin(θ)*AP AD=sin(θ)AP

A D = s i n ( θ ) ∗ P 1 y AD = sin(θ)*P_{1y} AD=sin(θ)P1y

  • P2x = OB + BC
    P 2 x = O B + B C = c o s ( θ ) P 1 x + s i n ( θ ) P 1 y P_{2x} = OB + BC = cos(θ)P_{1x} + sin(θ)P_{1y} P2x=OB+BC=cos(θ)P1x+sin(θ)P1y

3、求P2y:

  • 求P2y可以化为求 OC - AC
    Unity中Shader旋转矩阵(二维旋转矩阵),Unity,unity,矩阵,游戏引擎
  • 求OC:

c o s ( θ ) = O C O B cos(θ)= \frac{OC}{OB} cos(θ)=OBOC

O C = c o s ( θ ) ∗ O B OC=cos(θ)*OB OC=cos(θ)OB

O C = c o s ( θ ) ∗ P 1 y OC=cos(θ)*P_{1y} OC=cos(θ)P1y

  • 求AC:

s i n ( θ ) = B D B P sin(θ) = \frac{BD}{BP} sin(θ)=BPBD

B D = s i n ( θ ) ∗ B P BD = sin(θ)*BP BD=sin(θ)BP

A C = s i n ( θ ) ∗ B P AC = sin(θ)*BP AC=sin(θ)BP

A C = s i n ( θ ) ∗ P 1 x AC = sin(θ)*P_{1x} AC=sin(θ)P1x

  • P2y = OC - AC

P 2 y = O C − A C = c o s ( θ ) P 1 y − s i n ( θ ) P 1 x P_{2y} = OC - AC = cos(θ)P_{1y} - sin(θ)P_{1x} P2y=OCAC=cos(θ)P1ysin(θ)P1x

4、最后得到 P2点 的点阵

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

  • P 2 x = O B + B C = c o s ( θ ) P 1 x + s i n ( θ ) P 1 y P_{2x} = OB + BC = cos(θ)P_{1x} + sin(θ)P_{1y} P2x=OB+BC=cos(θ)P1x+sin(θ)P1y
  • P 2 y = O C − A C = c o s ( θ ) P 1 y − s i n ( θ ) P 1 x P_{2y} = OC - AC = cos(θ)P_{1y} - sin(θ)P_{1x} P2y=OCAC=cos(θ)P1ysin(θ)P1x

[ c o s ( θ ) ∗ P 1 x s i n ( θ ) ∗ P 1 y − s i n ( θ ) ∗ P 1 x c o s ( θ ) ∗ P 1 y ] \begin{bmatrix} cos(θ)*P_{1x}&sin(θ)*P_{1y}\\ -sin(θ)*P_{1x}&cos(θ)*P_{1y}\\ \end{bmatrix} [cos(θ)P1xsin(θ)P1xsin(θ)P1ycos(θ)P1y]

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

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

  • Mrotate就是我们的旋转矩阵
    M r o t a t e = [ c o s ( θ ) s i n ( θ ) − s i n ( θ ) c o s ( θ ) ] M_{rotate}= \begin{bmatrix} cos(θ)&sin(θ)\\ -sin(θ)&cos(θ)\\ \end{bmatrix} Mrotate=[cos(θ)sin(θ)sin(θ)cos(θ)]
  • P1 就是我们旋转前的点
    P 1 = [ P 1 x P 1 y ] P_1= \begin{bmatrix} P_{1x}\\ P_{1y}\\ \end{bmatrix} P1=[P1xP1y]

二、在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 来实现。
Unity中Shader旋转矩阵(二维旋转矩阵),Unity,unity,矩阵,游戏引擎文章来源地址https://www.toymoban.com/news/detail-764263.html


三、测试代码

//平移变换
//缩放变换
//旋转变换
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_END
            Varying 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
        }
    }
}

到了这里,关于Unity中Shader旋转矩阵(二维旋转矩阵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity编写Shader内置各种矩阵和方法介绍

    返回目录 大家好,我是阿赵。 这里记录一下Unity编写Shader内置各种矩阵和方法 UNITY_MATRIX_MVP:Current model * view * projection matrix. UNITY_MATRIX_MV:Current model * view matrix. UNITY_MATRIX_V:Current view matrix. UNITY_MATRIX_P:Current projection matrix. UNITY_MATRIX_VP:Current view * projection matrix. 其中: M:model(模型

    2024年02月11日
    浏览(36)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(51)
  • 【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader | 模糊 | 滤镜 | Blur)

    一、前言 嗨,大家好,我是新发。 以前我写文章都是很长很长,接下来我会尝试用新的方式来写博客,尽量简短,以实用为主。同时也是作为自己零碎的一些记录,方便查阅。 本文我要说的是在 Unity 中通过 UI 全屏图来模糊场景画面的效果。 二、效果演示 这是没用模糊效果

    2024年02月05日
    浏览(32)
  • Unity矩阵平移旋转缩放Matrix4x4

    最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转、平移、缩放。(注意这里本文中的transform组件式基于unity浮点数的教程并非帧同步定点数)参考原文 参数可以参考我上图的参数,这里注意三个顶点是一个面,这里我上述的

    2024年01月17日
    浏览(32)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(52)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(47)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(74)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(52)
  • 【Unity3D】游戏物体操作 ③ ( 旋转操作 | 旋转工具 | 基本旋转 | 设置旋转属性 | 增量旋转 | 缩放操作 | 轴向缩放 | 整体缩放 | 操作工具切换 | 操作模式切换 )

    选中 Scene 场景 中的 游戏物体 GameObject , 点击 工具栏 中的 转换工具 , 此时在该 游戏物体 会被 4 个 圆圈 环绕 ; 红圈 : 拖动该圈 , 绕 X 轴旋转 ; 绿圈 : 拖动该圈 , 绕 Y 轴旋转 ; 蓝圈 : 拖动该圈 , 绕 Z 轴旋转 ; 最外层还有一个 白圈 ; 鼠标左键按住旋转 : 在 Unity 旋转 游戏物体

    2023年04月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包