線性代數:矩陣變換圖形(三維錯切變換)

        緊接上一篇:http://blog.csdn.net/yinhun2012/article/details/79640538

        之前我們學習了理解了圖形學中的線性代數,而且實際的操作了圖形的基礎變換,既然學習完基本變換了,那麼接下來就看看一些不常見的特殊變換,下面我們就看看錯切變換,也稱爲切變。

        這裏要介紹一下仿射變換的一個特點,就是“平直性”,因爲前面我們理解仿射變換是一個線性變換加上一個平移,線性這個性質就保證了直線變換後還是直線,所以仿射變換,變換後的圖形,是直線邊的還是直線邊。

        切變是一種特殊的“平直性”變換,簡單來說就是矩形變爲平行四邊形,長方體變爲平行六面體,如下圖:

      

      

        上面展示了長方體沿着X軸進行切變的示意圖,從圖中我們可以看出長方體沿X軸兩邊經過非單位1的等比例平移得到平行四邊形,然後”牽引“整個長方體”扭曲“成平行六面體,所以切變矩陣的變換參數肯定存在有多個變動的縮放因子K。事實上,數學上規定n維仿射座標系下的切變變換是取出一個切變方向座標軸,然後將其他軸乘以切變因子再加到切變方向軸上。既然有了概念和定義,那我們就很容易推導了,如下圖:

        

        沿着X軸切變的推導過程還是很簡單的,那麼我們繼續進行Y軸切邊和Z軸切邊推導,如下圖:

        

        既然我們推導完畢,那麼具體切變在圖形學程序中起到什麼作用呢?talk is cheap,show me your code直接上程序,如下圖:

        

        上面是構建cgshader程序控制圖形切變的效果圖,可以看出切變可以起到一些特殊的視覺效果。代碼如下:

        

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unlit/TransformationUnlitShader"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_X_M_Factor("XM_Factor",Range(0,10)) = 0
		_X_N_Factor("XN_Factor",Range(0,10)) = 0
		_Y_M_Factor("YM_Factor",Range(0,10)) = 0
		_Y_N_Factor("YN_Factor",Range(0,10)) = 0
		_Z_M_Factor("ZM_Factor",Range(0,10)) = 0
		_Z_N_Factor("ZN_Factor",Range(0,10)) = 0
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#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;

			float _X_M_Factor;  //x切變m縮放因子
			float _X_N_Factor;  //x切變n縮放因子

			float _Y_M_Factor;  //y切變m縮放因子
			float _Y_N_Factor;  //y切變n縮放因子

			float _Z_M_Factor;  //z切變m縮放因子
			float _Z_N_Factor;  //z切變n縮放因子
			
			v2f vert (appdata v)
			{
				v2f o;
				//構建x軸切邊矩陣
				float4x4 _Mat_X = float4x4(1, _X_M_Factor, _X_N_Factor,0,
											0,1,0,0,
											0,0,1,0,
											0,0,0,1);
				//構建y軸切邊矩陣
				float4x4 _Mat_Y = float4x4(1,0,0,0,
											_Y_M_Factor,1, _Y_N_Factor,0,
											0,0,1,0,
											0,0,0,1);
				//構建Z軸切邊矩陣
				float4x4 _Mat_Z = float4x4(1, 0, 0, 0,
											0, 1, 0, 0,
											_Z_M_Factor, _Z_N_Factor, 1, 0,
											0, 0, 0, 1);
				float4 vx = mul(_Mat_Z, mul(_Mat_Y, mul(_Mat_X, v.vertex)));
				o.vertex = UnityObjectToClipPos(vx);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				return col;
			}
			ENDCG
		}
	}
}

        這裏不懂cgshader的小夥伴們不用急,這個程序只爲演示切變的效果。

        demo下載地址:https://download.csdn.net/download/yinhun2012/10302296


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章