找回密码
 立即注册
查看: 514|回复: 0

Unity空间变换矩阵

[复制链接]
发表于 2021-11-24 21:25 | 显示全部楼层 |阅读模式
之前做一些效果的时候,被空间转换耽误了一些时间,在几个空间来回转换,确实比较容易晕。于是花了点时间,把各种转换都整理到一起了,下次再做类似需要各种转换空间的,就可以直接查表了,希望这样可以节约一点时间。大部分转换也都可以在Unity的UnityShaderVariables.cginc里查到对应关系,这里主要是分组列在一起方便查看。


从模型空间转换到裁剪空间

1. UNITY_MATRIX_MVP    //当前的模型*观察*投影矩阵,
                       //用于将顶点方向矢量从模型空间转换到裁剪空间
2. UnityObjectToClipPos 推荐用这个,优化
   o.pos = UnityObjectToClipPos(float4(Pos));
3. unity_MatrixMVP
   float4x4 unity_MatrixMVP = mul(unity_MatrixVP, unity_ObjectToWorld);


从裁剪(屏幕)空间变换到相机空间

unity_CameraInvProjection(注意:这个是把世界空间当作了右手空间来使用)
从相机(View)空间变换到世界空间

1. unity_MatrixInvV
2. UNITY_MATRIX_I_V
   float4 vertexworld = mul(UNITY_MATRIX_I_V, viewVertex);
3. unity_CameraToWorld(注意:这个是把世界空间当作了右手空间来使用)
   viewVertex.z*=-1;
   float3 worldPos = mul(unity_CameraToWorld, float4(viewVertex, 1)).xyz;
参考:https://blog.csdn.net/qq_35817700/article/details/94863234
从模型空间转换到观察空间

1. UNITY_MATRIX_MV //当前的模型*观察矩阵,用于将顶点/方向矢量从模型空间转换到观察空间
2. unity_MatrixMV
   unity_MatrixMV = mul(unity_MatrixV, unity_ObjectToWorld);
3. UNITY_MATRIX_T_MV   //UNITY_MATRIX_MV的转置矩阵
4. unity_MatrixTMV
   float4x4 unity_MatrixTMV = transpose(unity_MatrixMV);
从模型空间转换到观察空间(法线)

1. UNITY_MATRIX_IT_MV  //UNITY_MATRIX_MV的逆转置矩阵,
                       //用于将法线从模型空间转换到观察空间,
                       //也可以用于得到UNITY_MATRIX_MV的逆矩阵
   normal = mul((float3x3)UNITY_MATRIX_IT_MV,vNomral)
2. unity_MatrixITMV
   float4x4 unity_MatrixITMV = transpose(mul(unity_WorldToObject, unity_MatrixInvV));
从世界空间转换到观察空间

1. UNITY_MATRIX_V  //当前的观察矩阵,用于将顶点/方向矢量从世界空间转换到观察空间
2. unity_MatrixV
3. unity_WorldToCamera(注意:这个是把世界空间当作了右手空间来使用)
从观察空间转换到裁剪空间

1. UNITY_MATRIX_P  //当前的投影矩阵,用于将顶点/方向矢量从观察空间转换到裁剪空间
2. glstate_matrix_projection
3. unity_CameraProjection(注意:这个是把世界空间当作了右手空间来使用)
从世界空间转换到裁剪空间

1. UNITY_MATRIX_VP //当前的观察*投影矩阵,用于将顶点/方向矢量从世界空间转换到裁剪空间
2. unity_MatrixVP
从模型空间变换到世界空间

1. unity_ObjectToWorld(_Object2World)  //当前的模型矩阵,
                                       //用于将顶点方向矢量从模型空间变换到世界空间
2. UNITY_MATRIX_M
从模型空间变换到世界空间(法线)

1. UnityObjectToWorldNormal();
   o.normal = normalize(UnityObjectToWorldNormal(vNomral));

2. o.worldNormal =  mul(v.normal,(float3x3)unity_WorldToObject);
从模型空间变换到世界空间(方向向量)

UnityObjectToWorldDir(float3 dir)
从世界空间转换到模型空间

unity_WorldToObject(_World2Object)  //用于将顶点/方向矢量从世界空间转换到模型空间
从世界空间转换到模型空间(方向向量)

UnityWorldToObjectDir(float3 dir)
为什么法线(方向向量)的转换是特殊的








因为一般的顶点变换不像法线是向量,有方向,如果三角面不等比拉伸,法线方向就会倾斜,不再垂直于表面,所以要特殊处理。
参考:http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/
参考:
https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/CGIncludes/UnityShaderVariables.cginc
https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 02:50 , Processed in 0.090366 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表