今天整理一下矩阵变换的通用公式,其实主要是控制旋转的方式。
用了一个shader作为工具,展示不同矩阵变换的效果。
Shader "MyShader/SS_19"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Height("Height",float)=0.5
_Matrix1("Matrix1",vector)=(1,0,0)
_Matrix2("Matrix2",vector)=(0,1,0)
_Matrix3("Matrix3",vector)=(0,0,1)
[Toggle(ROT)]_Rot("Rot",Float)=0
}
SubShader
{
Pass
{
CGPROGRAM
#pragma shader_feature ROT
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed _Height;
fixed3 _Matrix1;
fixed3 _Matrix2;
fixed3 _Matrix3;
float4 fun(float4 _v){
float3x3 mat=float3x3(
_Matrix1.x,_Matrix1.y,_Matrix1.z,
_Matrix2.x,_Matrix2.y,_Matrix2.z,
_Matrix3.x,_Matrix3.y,_Matrix3.z
);
#if ROT
float s=sin(_Time.y);
float c=cos(_Time.y);
float3x3 mat1=float3x3(
c,0,s,
0,1,0,
-s,0,c
);
mat=mul(mat,mat1);
#endif
return float4(mul(mat,_v.xyz),0);
}
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(fun(v.vertex));
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
- 缩放的通用公式:
float3x3 mat=float3x3(//s=size
s,0,0,
0,s,0,
0,0,s
);
- 反向:
float3x3 mat=float3x3(
0,0,1,
0,1,0,
1,0,0
);
- 旋转的通用公式:
float3x3 mat=float3x3(//z轴为轴心
s,-c,0,
c,s,0,
0,0,1
);
float3x3 mat=float3x3(//x轴为轴心
1,0,0,
0,s,c,
0,-c,s
);
float3x3 mat=float3x3(//y轴为轴心
c,0,s,
0,1,0,
-s,0,c
);
- 其中的特殊角度:
- 不变
- 沿z轴往左翻90°
- 沿z轴往右翻90°
- 沿x轴往前翻90°
- 沿x轴往后翻90°
- 沿y轴往右翻90°
- 沿y轴往左翻90°
- 不变
返回目录:https://blog.csdn.net/yzy1987523/article/details/106676451