如何做互联网网站,久久网站建设,国外有哪些做服装的网站,网站如何适应屏幕文章目录 前言一、围绕X轴旋转1、可以使用上篇文章中#xff0c;同样的方法推导得出围绕X轴旋转的点阵。2、求M~rotate~ 二、围绕Y轴旋转1、可以使用上篇文章中#xff0c;同样的方法推导得出围绕Y轴旋转的点阵。2、求M~rotate~ 三、围绕Z轴旋转1、可以使用上篇文章中#x… 文章目录 前言一、围绕X轴旋转1、可以使用上篇文章中同样的方法推导得出围绕X轴旋转的点阵。2、求M~rotate~ 二、围绕Y轴旋转1、可以使用上篇文章中同样的方法推导得出围绕Y轴旋转的点阵。2、求M~rotate~ 三、围绕Z轴旋转1、可以使用上篇文章中同样的方法推导得出围绕Z轴旋转的点阵。2、求M~rotate~ 四、在Shader实现1、在属性面板定义四维变量用xyz控制XYZ轴上的旋转2、在常量缓冲区申明该变量3、在 顶点着色器 定义旋转矩阵4、使用旋转矩阵与模型顶点相乘输出5、最终效果 五、最终测试代码 前言
在上篇文章中我们推算出了Shader物体旋转所使用的二维旋转矩阵。
Unity中Shader旋转矩阵二维旋转矩阵
在这篇文章中我们来推算得到四维旋转矩阵。 一、围绕X轴旋转
围绕X轴旋转代表物体顶点的X轴不变。
1、可以使用上篇文章中同样的方法推导得出围绕X轴旋转的点阵。 我们把P2增加一维且分量为1
2、求Mrotate
Mrotate * P1 P2Mrotate P2* P1-1 最后得到Mrotate 二、围绕Y轴旋转
围绕Y轴旋转代表物体顶点的Y轴不变。
1、可以使用上篇文章中同样的方法推导得出围绕Y轴旋转的点阵。 我们把P2增加一维且分量为1
2、求Mrotate
Mrotate * P1 P2Mrotate P2* P1-1 最后得到Mrotate 三、围绕Z轴旋转
围绕Z轴旋转代表物体顶点的Z轴不变。
1、可以使用上篇文章中同样的方法推导得出围绕Z轴旋转的点阵。 我们把P2增加一维且分量为1
2、求Mrotate
Mrotate * P1 P2Mrotate P2* P1-1 最后得到Mrotate
可以修改sin函数前面的负号位置实现顺时针还是逆时针。这篇文章中是顺时针 四、在Shader实现
1、在属性面板定义四维变量用xyz控制XYZ轴上的旋转 _Rotation(“Rotation(XYZ)”,Vector) (0,0,0,0) 2、在常量缓冲区申明该变量 CBUFFER_START(UnityPerMaterial) float4 _Rotation; CBUFFER_END 3、在 顶点着色器 定义旋转矩阵 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、使用旋转矩阵与模型顶点相乘输出 v.vertexOS mul(M_rotateX,v.vertexOS); v.vertexOS mul(M_rotateY,v.vertexOS); v.vertexOS mul(M_rotateZ,v.vertexOS); 5、最终效果 五、最终测试代码
//平移变换
//缩放变换
//旋转变换四维
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{PenderPipelineUniversalPipelineRenderTypeOpaqueQueueGeometry}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.hlslstruct 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);//旋转变换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}}
}