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

news2024/9/23 23:32:47

官方关键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.coloradmin.cn/o/1143611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频批量剪辑技巧:如何实现震撼的嵌套合并效果

随着视频制作需求的不断增长,视频批量剪辑技巧在提高制作效率和质量方面显得尤为重要。本文将介绍云炫AI智剪实现震撼嵌套合并效果的方法,帮助您在视频制作过程中更高效地完成任务。 视频批量剪辑技巧是一种利用计算机技术实现自动化视频剪辑的方法。通…

串口占用检测工具

串口占用检测工具 平时需要检测哪个程序占用了串口,下面介绍一款非常方便的工具,它的工具箱里包含一个串口占用检测工具,可以非常方便的检测出来哪个程序占用了串口,并给出程序名和PID。 官网下载地址:http://www.red…

2023枣庄麒瑞音乐嘉年华济南新闻发布会

2023枣庄麒瑞音乐嘉年华新闻发布会今日在济南市西元大厦隆重举行,演唱会主办方枣庄恒立城市发展投资有限公司副经理刘畅先生、枣庄麒瑞文化董事长孙振敏女士,演唱会冠名方滕州爱啤士精酿啤酒有限公司总经理周静女士等和国内及山东省近30家主流新闻媒体到…

命令模式——让程序舒畅执行

● 命令模式介绍 命令模式(Command Pattern),是行为型设计模式之一。命令模式相对于其他的设计模式来说并没有那么多条条框框,其实并不是一个很“规矩”的模式,不过,就是基于一点,命令模式相对于…

局域网内两台电脑共享文件夹(通过网线直连共享数据)

文章目录 2.设置共享文件夹3.访问共享文件夹 1.将两台电脑置于同一局域网下 用网线将两台电脑连接关闭两台电脑防火墙将两台电脑IP地址设置在同一局域网下 测试是否在同一局域网下,使用ping命令 ping 192.168.0.122.设置共享文件夹 选择想要共享的文件夹&#xff…

刷题学习记录

sql注入(bugkuctf) 打开显示一个登录框 照常用admin用户名登录,密码随便填一个,显示密码错误 接着用admin为用户名登录,密码照样随便填,结果显示用户名不存在 题目提示基于布尔的SQL盲注,猜测后端是判断用…

【torch高级】一种新型的概率学语言pyro(02/2)

前文链接:【torch高级】一种新型的概率学语言pyro(01/2) 七、Pyro 中的推理 7.1 背景:变分推理 引言中的每项计算(后验分布、边际似然和后验预测分布)都需要执行积分,而这通常是不可能的或计算…

静力触探数据智能预处理(4)

静力触探数据智能预处理(4) 前言 数据处理方式已由手工1.0、计算机辅助2.0向人工智能3.0的趋势发展。机器学习是人工智能的基础,本文尝试应用机器学习中K均值聚类算法对孔压静力触探数据进行土的分类,分类结果不理想&#xff0c…

buuctf_练[安洵杯 2019]easy_web

[安洵杯 2019]easy_web 文章目录 [安洵杯 2019]easy_web掌握知识解题思路代码分析正式解题 关键paylaod 掌握知识 url地址和源代码的信息捕捉;图片和base64之间转换;base64和十六进制编码的了解;代码审计,绕过正则匹配对关键字的…

简易但很实用的javaswing/gui音乐播放器

视频浏览地址 很实用的一个javaswing音乐播放器。可以展示歌名,上一曲下一曲。 源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制

Java八股文 ----Redis篇

问题大纲 缓存穿透 原因:入侵者大量查询不存在的数据 使得Redis不断去访问数据库 然而Redis也无法缓存,就导致每次都会查询数据库...数据库的并发度不高 就会宕机 解决办法 布隆过滤器:作用:拦截不存在的数据 布隆过滤器 原理:把数据的id通过多次哈希计算标记数组,新来个数…

Easex样式样式

eg1&#xff1a;线形样式和描边 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #define PI 3.14 // 1PI 180度 2PI 360度int main() {initgraph(800, 600);setorigin(400, 300);setaspectratio(1, -1);/*void setl…

基于Ubuntu20.04安装ROS系统

文章目录 一、ROS简介二、ROS安装三、ROS安装测试四、安装问题解决1. sudo rosdepc init&#xff1a;找不到命令2. ERROR: cannot download default sources list from...3. Command roscore not found...4. Resource not found: roslaunch... 一、ROS简介 ROS是用于编写机器人…

行业追踪,2023-10-27

自动复盘 2023-10-27 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

前后端分离不可忽视的陷阱,深入剖析挑战,分享解决方案,助你顺利实施分离开发。

不管你设计的系统架构是怎么样&#xff0c;最后都是你的组织内的沟通结构胜出。这个观点一直在组织内不断地被证明&#xff0c;但也不断地被忽略。 前后端分离的利与弊 近几年&#xff0c;随着微服务架构风格的引入、前后端生态的快速发展、多端产品化的出现&#xff0c;前后…

DevChat:VSCode中的AI黑马

前言 编程对于很多人来说&#xff0c;可能是一件复杂且耗时的事情。在结合当下各类AI产品层出不穷的情况下&#xff0c;我是有在认真的去拥抱AI来结合我们的工作&#xff0c;帮助我们的工作提升效率&#xff0c;尝试过我们的官方G P T&#xff0c;以及各类国产AI产品&#xff…

【Java基础】集合容器

集合容器 文章目录 集合容器1. 集合框架体系2. Collection子接口1&#xff1a;List3. Collection子接口2&#xff1a;Set3.1 Set主要实现类&#xff1a;HashSet3.1.1 HashSet概述3.1.2 HashSet中添加元素的过程&#xff1a;3.1.3 重写 hashCode() 方法的基本原则3.1.4 重写equa…

【Unity数据交互】JsonUtility的“爱恨情仇“

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

C++模拟实现-----日期计算器(超详细解析,小白一看就会!)

目录 一、前言 二、日期类计算器 三、日期计算器的实现 &#x1f34e;日期计算器各个接口的实现 &#x1f350;日期计算器的需求 &#x1f349;打印当前日期&#xff08;并检查日期是否合理&#xff09; &#x1f4a6;检查日期是否合理 &#x1f4a6;日期类构造函数&#x…

操作系统 (1)

进程的概念 进程同步/进程互斥 进程互斥的软件实现 进程互斥的硬件实现 信号量机制 生产者消费者问题 以下wei8最终情况,不可调换位置,否则会发生死锁 预防死锁 避免死锁