Unity的unity_ObjectToWorld里的每一列分别代表什么意思?换个方向反向理解-更简单

官方关键UnityObjectToWorldNormal() 代码

从乐乐姐的书中得知,当我们在shader想获得法线,大概会这么些

o.wordDir = UnityObjectToWorldNormal(i.normal)

(这行代码就包含了官方对“unity_ObjectToWorld”的终极理解+极致应用)

也可以说,掌握了这行代码,就掌握了unity_ObjectToWorld

(这行代码的源码在楼下。。。)

这时候,肯定有一堆高人跳出来分析了, 这个很复杂,分两种情况,巴啦巴啦

我复杂个P,法线转世界坐标就复杂了??下面会一一展开说,甚至关键代码都是幼儿园数学,加减乘除而已

如下面代码,确实是if ... else .. ,也确实分两种“复杂”情况;

但是在大部分情况下,大部分的智商都差不多,所以都不要没搞懂一行代码逻辑,就if .. else ...去企图把两段代码都搞懂,反向一下逻辑很清楚的:如果两段代码是差不多,接近的,就会用一个方法传不同的参数解决。,而不是if .. else .. ;但既然用了if .. else ..解决, 也就是UnityObjectToWorldNormal()里的两段代码南辕北辙, 

那么问题来了?你是希望:

1.先把第一段代码搞懂,(而省下了读第两段代码时间,以至于有经历集中完全掌握关键代码?),

2.还是头铁,两段一起搞,每一段都搞不通,而且两段互调一起又加深混乱?

如楼下这段代码,我们只需要了解, 根本不用管第二种情况(有兴趣同学可课外自行研究)

normalize(mul (unity_objecttoWorld,dir))//这个方法即可

未知代码1

首先,请看下面代码,看不懂没关系的,(未知1)后面会补上幼儿园数学,加减乘除而已,只要上过小学就没问题,初中辍学也能懂,

这段1代码主要是要计算_19的结果,而输入的参数_7,我们从 layout(location ) _7大概就知道这是:法线(normal)

//代码1
layout(location = 1) in vec3 _7;
layout(set = 1, binding = 0, std140) uniform _23_25
{vec4 _m0[4];vec4 _m1[4];vec4 _m2[4];vec4 _m3;
} _25;void main()
{_16.x = dot(_7, _25._m1[0u].xyz);_16.y = dot(_7, _25._m1[1u].xyz);_16.z = dot(_7, _25._m1[2u].xyz);_19 = dot(_16.xyz, _16.xyz);_19 = inversesqrt(_19);
}

未知代码2

因为未知1,所以我们需要未知2,还是不懂没关系的,请接着往下看,

(会越说越简单的)

//代码2

矢量 - 大概是这么一个东西

        var pos = new Vector3(1, 1.5, 1);

矩阵 - 是大概这么一个东西(3个矩阵相乘)

这个图不是矩阵最终结果

根据某大牛说的:

矩阵:模型顶点从模型空间转换到世界空间用的矩阵,就是unity_ObjectToWorld,那么这个矩阵的内容是什么呢,没错,就是这个模型相对于世界空间原点的缩放,旋转和平移

矩阵最后一列代表的是模型中心点的世界坐标

M - local2World 的三列分别是:

1.最后一列,第4列代表的是模型中心点的世界坐标(明显的最后一列是tx,ty,tx,1)

2.另外第1,2, 3列后面再说

由于我们知道1列1列是有含义的(最后一列是世界坐标(真不需要说模型中心点的,世界坐标就是世界坐标,台湾省难道有任何可能会不是中国台湾省么))

我们知道了列的含义

所以楼上的代码_25[0u] _25[1u], _25[2u]就分别代表了,第1,2,3列,而不是代表行

(后面证明是错了,0,1,2就是行的列,_25行[0,1,2]列,

是:

m1[1] m1[2] 25[3]

m2

m2

而不是
m[1] m2 m3

m[2]

m[3]

那么。。。localToWorld矩阵的第1,2,3列(行)到底是什么意思呢?

最简单的解释localToWorld

    _16.x = dot(_7, _25._m1[0u].xyz);_16.y = dot(_7, _25._m1[1u].xyz);_16.z = dot(_7, _25._m1[2u].xyz);

从楼上的代码(代码1)我们可知道

用法线 "_7" dot点乘 x 矩阵unity_objectToWorld "_25" 的第一列是什么意思呢

这里还做了3个dot

这里还做了3个dot

这里还做了3个dot

矩阵x 矢量(法线==矢量)数学含义

刚刚好,结果形成了新的矢量

//代码-2

点乘的数学含义

两个矢量的点乘,就是各自的分量.xyz相乘后,再相加

dot(vec a,  vec b)= x_1x_2 + y_1y_2 + z_1z_2;

凑巧,就是,矩阵的第一行,3个数分别乘以矢量的x,y,z,结果就是dot点乘的结果

对应楼上的代码:就是那么刚好,刚刚同学遇到凑巧同学,所以,

//形成新的矢量 ——16_16.x = dot(_7, _25._m1[0u].xyz);//如楼上伪代码,x==16_16.y = dot(_7, _25._m1[1u].xyz);//如楼上伪代码,y==4_16.z = dot(_7, _25._m1[2u].xyz);//如楼上伪代码,z==7

所以计算——16就是得出了法线——7的世界坐标(因为_7是从Localtion(2)声明,是从Vectex Shader传入,vertex为模型自身顶点坐标|法线也是自身坐标,还不是世界坐标)

未知代码3 - 法线归一

然后,这3行代码后面,还有2行代码:

下面——19这两行代码就太简单了,就是矢量的"归一化":

    //形成新的矢量 ——16_16.x = dot(_7, _25._m1[0u].xyz);//如楼上伪代码,x==16_16.y = dot(_7, _25._m1[1u].xyz);//如楼上伪代码,y==4_16.z = dot(_7, _25._m1[2u].xyz);//如楼上伪代码,z==7//这两行代码就太简单了_19 = dot(_16.xyz, _16.xyz);_19 = inversesqrt(_19);//法线的世界坐标的dir(_19)=nomalize(mul(法线,objectToWorld矩阵)

归一化是什么意思?我不打算解释了,总之上面代码

好了,说到这里,我们只需要掌握

  • 矢量基本加减乘除,法线也是矢量
  • 矩阵 = 
  • 矩阵相乘 = 3个,平移x旋转x缩放矩阵
  • Shader基础语法
  • 矩阵相乘后再乘以法线矢量
  • 矢量归一化

等同于文章最开始的截图(调转)

“”_19“”法线的世界坐标的dir = nomalize(mul(法线, objectToWorld矩阵));
//objectToWorld矩阵也可以是float4x4的,但是最后一列前面解释了,没什么数学含义
//所以,也就是Unity官方的写法
worldDir = normalize(mul((float3x3)unity_ObjectToWorld, dir));

所以, 你掌握了官方的这个函数方法,就能准确应用 unity_ObjectToWorld ,当你会用了自然就明白了,只是unity 本身写的太绕(太基础了,谁都不想解释)

那么现在,你知道unity_ObjectToWorld矩阵,每行每列是什么意思了吧?

参考:

(2 条消息) unity_ObjectToWorld里的每一列分别代表什么意思? - 知乎 (zhihu.com)

UnityCG.cginc源码之UnityObjectToWorldNormal之模型非等比缩放导致的法线不垂直问题解决分析_shader法向量非等比缩放-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171762.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Windows 用 Chrome System Settings 设置代理

在 Windows 用 Chrome System Settings 设置代理 贴心提示:在设置代理之前,请确保您已经安装了 浏览器。 🔧 设置代理的详细步骤如下: 打开 浏览器,输入 //settings/system 并回车。 在「系统和网络设置」页面中&am…

matlab Spongent算法

1、内容简介 略 5-可以交流、咨询、答疑 2、内容说明 Spongent 是一种轻量级 Hash 算法,其原理与“海绵”类似,分为“吸收” 和“榨取”两个阶段,所以又可以称之为“海绵结构”算法。 Hash 函数之所以有广泛的应用,是因为它具…

MySQL数据库#6

Python操作mysql 在使用Python连接mysql之前我们需要先下载一个第三方的模块 pymysql的模块,导入后再进行操作。 操作步骤:1. 先连接mysql host,port,charset,username password 库,等等。 import pymysql…

如何恢复u盘删除文件?2023最新分享四种方法恢复文件

U盘上删除的文件怎么恢复?使用U盘存储文件是非常方便的,例如:在办公的时候,会使用U盘来存储网络上查找到的资料、产品说明等。在学习的时候,会使用U盘来存储教育机构分享的教学视频、重点知识等。而随着U盘存储文件的概…

综合OA管理系统源码 OA系统源码

综合OA管理系统源码 OA系统源码 功能介绍: 编号:LQ10 一:系统管理 系统配置,功能模块,功能节点,权限角色,操作日志,备份数据,还原数据 二:基础数据 审批…

ExoPlayer架构详解与源码分析(7)——SampleQueue

系列文章目录 ExoPlayer架构详解与源码分析(1)——前言 ExoPlayer架构详解与源码分析(2)——Player ExoPlayer架构详解与源码分析(3)——Timeline ExoPlayer架构详解与源码分析(4)—…

Project Costs

/*** 初始化象棋的棋子,正常情况加载双方所有棋子,残局演示加载剩余棋子,按坐标位置摆放* * 【费用】* 因甲方要求产生工作量计算费用;新增、修改、删除需求* 因乙方生产缺陷工作量不计费用;缺陷、延误* * 来说个一个栗…

5 个编写高效 Makefile 文件的最佳实践

在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署。然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高我们的开发…

unocss和tailwindcss css原子引擎

第一种tailwindcss: tailwindcss官网 https://tailwindcss.com/docs/grid-column 基本介绍及优点分析 Tailwind CSS 中文文档 - 无需离开您的HTML,即可快速建立现代网站 PostCss 处理 Tailwind Css 基本流程 PostCSS - 是一个用 JavaScript 工具和插…

Postman —— 配置环境变量

PostMan是一套比较方便的接口测试工具,但我们在使用过程中,可能会出现创建了API请求,但API的URL会随着服务器IP地址的变化而改变。 这样的情况下,如果每一个API都重新修改URL的话那将是非常的麻烦,所以PostMan中也提供…

使用ControlNet生成视频(Pose2Pose)

目录 ControlNet 介绍 ControlNet 14种模型分别是用来做什么的 ControlNet 运行环境搭建 用到的相关模型地址 ControlNet 介绍 ControlNet 是一种用于控制扩散模型的神经网络结构,可以通过添加额外的条件来实现对图像生成的控制。它通过将神经网络块的权重复制到…

从入门到精通:深入了解CSS中的Grid网格布局技巧和应用!

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 📘 文章引言 一…

【tio-websocket】9、服务配置与维护—TioConfig

场景 我们在写 TCP Server 时,都会先选好一个端口以监听客户端连接,再创建N组线程池来执行相关的任务,譬如发送消息、解码数据包、处理数据包等任务,还要维护客户端连接的各种数据,为了和业务互动,还要把这些客户端连接和各种业务数据绑定起来,譬如把某个客户端绑定到一…

【shell】pis_monitor.sh

#!/bin/bashread -p "请输入要查询的PID:" pidecho "--------------------------------"echo "进程PID:$pid"p_arr("进程命令 11" "进程所属用户 1" "CPU占用率 2" "CPU内存占用率 4" "进程开始运…

深入浅出排序算法之简单选择排序

目录 1. 原理和执行流程 2. 代码实现 3. 性能分析 4. 双向选择排序(了解) 1. 原理和执行流程 选择排序包含了堆排序和简单选择排序。 每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后&#xff0…

Unity URP14.0 自定义后处理框架

目录 碎碎念一些基础CustomPostProcessing.csCustomPostProcessingFeature.csCustomPostProcessingPass.cs例子:BSC后处理shader(BSC)后处理cs脚本(BSC) 例子:ColorBlitPostProcessing.hlslColorBlit2.shaderColorBlit.cs文件 其他…

ab压力测试

标题相关概念 QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 互联网中,作为域名系统服务器的机…

Python时间序列分析库介绍:statsmodels、tslearn、tssearch、tsfresh

时间序列分析在金融和医疗保健等领域至关重要,在这些领域,理解随时间变化的数据模式至关重要。在本文中,我们将介绍四个主要的Python库——statmodels、tslearn、tssearch和tsfresh——每个库都针对时间序列分析的不同方面进行了定制。这些库…

亿图导出word和PDF中清晰度保留方法

步骤一 在亿图软件中画一个元件大小搭配合理的图。注意字体大小的安排,尤其是角标的大小要合适,示范如下 选中所有元器件,右键使用组合功能将电路图组合为一个整体 步骤二: 将亿图软件中的图保存为SVG格式。示范如下 在导出到…