企業(yè)網(wǎng)盤怎么申請seo搜索優(yōu)化 指數(shù)
文章目錄
- 前言
- 一、圍繞X軸旋轉(zhuǎn)
- 1、可以使用上篇文章中,同樣的方法推導(dǎo)得出圍繞X軸旋轉(zhuǎn)的點陣。
- 2、求M~rotate~
- 二、圍繞Y軸旋轉(zhuǎn)
- 1、可以使用上篇文章中,同樣的方法推導(dǎo)得出圍繞Y軸旋轉(zhuǎn)的點陣。
- 2、求M~rotate~
- 三、圍繞Z軸旋轉(zhuǎn)
- 1、可以使用上篇文章中,同樣的方法推導(dǎo)得出圍繞Z軸旋轉(zhuǎn)的點陣。
- 2、求M~rotate~
- 四、在Shader實現(xiàn)
- 1、在屬性面板定義四維變量,用xyz控制XYZ軸上的旋轉(zhuǎn)
- 2、在常量緩沖區(qū)申明該變量
- 3、在 頂點著色器 定義旋轉(zhuǎn)矩陣
- 4、使用旋轉(zhuǎn)矩陣與模型頂點相乘輸出
- 5、最終效果
- 五、最終測試代碼
前言
在上篇文章中,我們推算出了Shader物體旋轉(zhuǎn)所使用的二維旋轉(zhuǎn)矩陣。
- Unity中Shader旋轉(zhuǎn)矩陣(二維旋轉(zhuǎn)矩陣)
在這篇文章中,我們來推算得到四維旋轉(zhuǎn)矩陣。
一、圍繞X軸旋轉(zhuǎn)
圍繞X軸旋轉(zhuǎn)代表,物體頂點的X軸不變。
1、可以使用上篇文章中,同樣的方法推導(dǎo)得出圍繞X軸旋轉(zhuǎn)的點陣。
- 我們把P2增加一維且分量為1
2、求Mrotate
- Mrotate * P1 = P2
- Mrotate = P2* P1-1
- 最后得到Mrotate
二、圍繞Y軸旋轉(zhuǎn)
圍繞Y軸旋轉(zhuǎn)代表,物體頂點的Y軸不變。
1、可以使用上篇文章中,同樣的方法推導(dǎo)得出圍繞Y軸旋轉(zhuǎn)的點陣。
- 我們把P2增加一維且分量為1
2、求Mrotate
- Mrotate * P1 = P2
- Mrotate = P2* P1-1
- 最后得到Mrotate
三、圍繞Z軸旋轉(zhuǎn)
圍繞Z軸旋轉(zhuǎn)代表,物體頂點的Z軸不變。
1、可以使用上篇文章中,同樣的方法推導(dǎo)得出圍繞Z軸旋轉(zhuǎn)的點陣。
- 我們把P2增加一維且分量為1
2、求Mrotate
- Mrotate * P1 = P2
- Mrotate = P2* P1-1
- 最后得到Mrotate
可以修改sin函數(shù)前面的負號位置實現(xiàn)順時針還是逆時針。這篇文章中是順時針
四、在Shader實現(xiàn)
1、在屬性面板定義四維變量,用xyz控制XYZ軸上的旋轉(zhuǎn)
_Rotation(“Rotation(XYZ)”,Vector) = (0,0,0,0)
2、在常量緩沖區(qū)申明該變量
CBUFFER_START(UnityPerMaterial)
float4 _Rotation;
CBUFFER_END
3、在 頂點著色器 定義旋轉(zhuǎn)矩陣
float4x4 M_rotateX = float4x4
(
1,0,0,0,
0,cos(_Rotation.x),sin(_Rotation.x),0,
0,-sin(_Rotation.x),cos(_Rotation.x),0,
0,0,0,1
);
float4x4 M_rotateY = float4x4
(
cos(_Rotation.y),0,sin(_Rotation.y),0,
0,1,0,0,
-sin(_Rotation.y),0,cos(_Rotation.y),0,
0,0,0,1
);
float4x4 M_rotateZ = float4x4
(
cos(_Rotation.z),sin(_Rotation.z),0,0,
-sin(_Rotation.z),cos(_Rotation.z),0,0,
0,0,1,0,
0,0,0,1
);
4、使用旋轉(zhuǎn)矩陣與模型頂點相乘輸出
v.vertexOS = mul(M_rotateX,v.vertexOS);
v.vertexOS = mul(M_rotateY,v.vertexOS);
v.vertexOS = mul(M_rotateZ,v.vertexOS);
5、最終效果
五、最終測試代碼
//平移變換
//縮放變換
//旋轉(zhuǎn)變換(四維)
Shader "MyShader/URP/P3_5_7"
{Properties{_Translate("Translate(XYZ)",Vector) = (0,0,0,0)_Scale("Scale(XYZ)",Vector)= (1,1,1,1)_Rotation("Rotation(XYZ)",Vector) = (0,0,0,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;float4 _Rotation;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);//旋轉(zhuǎn)變換float4x4 M_rotateX = float4x4(1,0,0,0,0,cos(_Rotation.x),sin(_Rotation.x),0,0,-sin(_Rotation.x),cos(_Rotation.x),0,0,0,0,1);float4x4 M_rotateY = float4x4(cos(_Rotation.y),0,sin(_Rotation.y),0,0,1,0,0,-sin(_Rotation.y),0,cos(_Rotation.y),0,0,0,0,1);float4x4 M_rotateZ = float4x4(cos(_Rotation.z),sin(_Rotation.z),0,0,-sin(_Rotation.z),cos(_Rotation.z),0,0,0,0,1,0,0,0,0,1);v.vertexOS = mul(M_rotateX,v.vertexOS);v.vertexOS = mul(M_rotateY,v.vertexOS);v.vertexOS = mul(M_rotateZ,v.vertexOS);o.vertexCS = TransformObjectToHClip(v.vertexOS.xyz);return o;}half4 frag (Varying i) : SV_Target{return 1;}ENDHLSL}}
}