关于矩阵的知识可以说多如牛毛,但大都十分抽象,即使勉强看懂,也很难将其熟练的运用到工作之中。在这篇文章中我会尝试用简单的方法解释关于齐次向量、四元数和变换矩阵的相关知识。并在houdini vop中将其重构出来。

如果说向量代表的是有向线段、或是空间中的点的话,那么矩阵代表的就是空间到空间的映射。

在这里定义对行向量v={xyz}v=\begin{Bmatrix}x&y&z\end{Bmatrix}v={x​y​z​}右乘矩阵F:

{f11f12f13f21f22f23f31f32f33}\begin{Bmatrix} f_{11} & f_{12} & f_{13}\\ f_{21} & f_{22} & f_{23}\\ f_{31} & f_{32} & f_{33}\\ \end{Bmatrix} ⎩⎨⎧​f11​f21​f31​​f12​f22​f32​​f13​f23​f33​​⎭⎬⎫​
所得到的结果为v′={x′y′z′}v'=\begin{Bmatrix}x'&y'&z'\end{Bmatrix}v′={x′​y′​z′​}。

其中:

x′=f11x+f21y+f31zy′=f12x+f22y+f32zz′=f13x+f23y+f33zx'=f_{11}x+f_{21}y+f_{31}z\\ y'=f_{12}x+f_{22}y+f_{32}z\\ z'=f_{13}x+f_{23}y+f_{33}z\\ x′=f11​x+f21​y+f31​zy′=f12​x+f22​y+f32​zz′=f13​x+f23​y+f33​z
由此不难看出,在向量与矩阵的乘法中,矩阵中每个元素只参与一次运算。

其中:

f11是分量x对分量x’影响的权重;

f12是分量x对分量y’影响的权重;

f33是分量z对分量z’影响的权重。

所以在这里可以把矩阵表示为:

{fx→x′fx→y′fx→z′fy→x′fy→y′fy→z′fz→x′fz→y′fz→z′}\begin{Bmatrix} f_{x\rightarrow x'} & f_{x\rightarrow y'} & f_{x\rightarrow z'}\\ f_{y\rightarrow x'} & f_{y\rightarrow y'} & f_{y\rightarrow z'}\\ f_{z\rightarrow x'} & f_{z\rightarrow y'} & f_{z\rightarrow z'}\\ \end{Bmatrix} ⎩⎨⎧​fx→x′​fy→x′​fz→x′​​fx→y′​fy→y′​fz→y′​​fx→z′​fy→z′​fz→z′​​⎭⎬⎫​
理解了这一点后,就可以用相乘矩阵的方式,实现软件中十分常见的Scale(缩放)及Shear(切变)功能。

首先创建一个默认的zx平面,并在point vop中新建一个默认的矩阵与其每个点的坐标相乘。

这时会发现,在houdini中默认创建的三阶矩阵中,对角线上的每个元素都为1,其他元素为为0。回顾上面总结的内容,会发现这三个元素代表的分别是分量x对分量x’、分量y对分量y’和分量z对分量z’影响的权重。值为1就是表示为相乘后的结果中的每个分量都与对应的原分量相同。

因此如果将矩阵中右下角的元素值改为0.5,得到的结果与将原平面中每个点坐标中的z值乘0.5的所得的结果相同。

由此可见,通过更改矩阵中三个对角元素的值,便可以实现将向量沿x,y,z三个轴向缩放的功能。

而Shear(切变)的实现也和缩放相仿。相较于缩放是分量自身对自身影响的权重,切变则是分量对其他分量影响的权重。因此我们只需将矩阵中对角元素以外的元素值设为非零,即可完成切变的效果。

如上图所示,将矩阵中第三行第一列的元素设置为1之后,结果中每个点坐标中的x值都随着其原始z值的大小而发生了变化。并且其变化的权重为1,使得平面左右两边出现了两条45度的斜线(x=z+b)。

rotate(旋转)的实现则要相对复杂得多,在解决这个问题之前,先来明确一下关于向量基底的概念。

三维向量作为一个有序数对,之所以可以代表一个空间中点的位置,便是因为其中每一个分量都代表一个基底所乘的系数。而在软件中,基底ex、ey、eze_x、e_y、e_zex​、ey​、ez​会被默认为沿着x、y、z轴正方向,且长度为1的向量,即:
ex={100}ey={010}ez={001}e_x=\begin{Bmatrix}1&0&0\end{Bmatrix}\\ e_y=\begin{Bmatrix}0&1&0\end{Bmatrix}\\ e_z=\begin{Bmatrix}0&0&1\end{Bmatrix}\\ ex​={1​0​0​}ey​={0​1​0​}ez​={0​0​1​}
因此向量v={xyz}v=\begin{Bmatrix}x&y&z\end{Bmatrix}v={x​y​z​}的实际意义即是将点v从原点处向x轴正方向移动距离x,再向y轴正方向移动距离y,最后向z轴正方向移动距离z之后所得的结果,即:

v=exx+eyy+ezzv=e_xx+e_yy+e_zz v=ex​x+ey​y+ez​z
在这里我们尝试对基底ex、ey、eze_x、e_y、e_zex​、ey​、ez​右乘矩阵F,根据一开始的公式可以得到:

ex′={f11f12f13}ey′={f21f22f23}ez′={f31f32f33}e'_x=\begin{Bmatrix}f_{11}&f_{12}&f_{13}\end{Bmatrix}\\ e'_y=\begin{Bmatrix}f_{21}&f_{22}&f_{23}\end{Bmatrix}\\ e'_z=\begin{Bmatrix}f_{31}&f_{32}&f_{33}\end{Bmatrix}\\ ex′​={f11​​f12​​f13​​}ey′​={f21​​f22​​f23​​}ez′​={f31​​f32​​f33​​}
然后将原向量v={xyz}v=\begin{Bmatrix}x&y&z\end{Bmatrix}v={x​y​z​}应用这组新的基底,可得到其在原基底下的坐标:

x′=f11x+f21y+f31zy′=f12x+f22y+f32zz′=f13x+f23y+f33zx'=f_{11}x+f_{21}y+f_{31}z\\ y'=f_{12}x+f_{22}y+f_{32}z\\ z'=f_{13}x+f_{23}y+f_{33}z\\ x′=f11​x+f21​y+f31​zy′=f12​x+f22​y+f32​zz′=f13​x+f23​y+f33​z
通过观察不难发现,以这种方式得到的向量v’,和直接右乘矩阵F所得的v’完全一致。也就是说,矩阵F中每一行的几何意义,即是原基底ex、ey、eze_x、e_y、e_zex​、ey​、ez​通过映射后所到达的终点。

所以现在可以通过得知变换后基底的值,来构造变换矩阵。

回过头来看我们创建的zx平面。在定义几何体的旋转操作之前,首先要定义旋转的正方向。在houdini中,默认的坐标系为右手系:即将右手大拇指指向旋转轴正方向,四指环绕方向便为旋转的正方向。在明确了这一点之后,就可以通过简单的三角函数,获取原基底绕轴旋转后所得的新坐标。

如上图所示便是基底ex、eze_x、e_zex​、ez​绕y轴旋转θ°后所得的结果。这时用刚才得到的结论,就可以构造如下矩阵:

{cosθ0−sinθ010sinθ0cosθ}\begin{Bmatrix} cosθ&0&-sinθ\\ 0&1&0\\ sinθ&0&cosθ\\ \end{Bmatrix} ⎩⎨⎧​cosθ0sinθ​010​−sinθ0cosθ​⎭⎬⎫​
实际构建的节点网络如下:

(未完待续)

在vop中重构transform节点(一)相关推荐

  1. 删除单链表中的重复节点(c语言版本)

    这是一道经典的面试题,下面是我的研究和举一反三,特整理如下: 分为三种情形: (1)删除有序链表的重复节点,重复节点一个都不留 (2)删除有序链表的重复节点,重复节点只留一个 (3)删除无序链表的重复 ...

  2. 使用Blender中的几何节点创建程序对象

    大小解压后:2.4G 持续时间3h 30m 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 使用Blender中的几何节点按程序创建对象 信息: 使用Blender中的几 ...

  3. Nat. Mach. Intell. | 基于深度强化学习寻找网络中的关键节点

    今天给大家介绍哈佛大学Yang-Yu Liu课题组和加利福尼亚大学洛杉矶分校Yizhou Sun课题组发表在nature machine intelligence上的一篇文章"Finding ...

  4. 编写代码,移除未排序的链表中的重复节点

    2019独角兽企业重金招聘Python工程师标准>>> 解法一:如果不得使用临时缓冲区,该怎么解决? 要想移除链表中的重复节点,我们需要设法记录有哪些是重复的.这里只需要使用到一个简 ...

  5. Linux文件系统中的inode节点详细介绍

    一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统 ...

  6. 求一颗二叉树中两个节点的最低公共父节点

    题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...

  7. zTree实现单独选中根节点中第一个节点

    zTree实现单独选中根节点中第一个节点 1.实现源代码 <!DOCTYPE html> <html> <head><title>zTree实现基本树& ...

  8. 【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )

    文章目录 一.setParent 方法中设置父节点与子节点关系 二.完整代码示例 1.MyBuilderSupport 生成器代码 2.使用 MyBuilderSupport 生成器创建 Xml 代码 ...

  9. CSS3中的transform变形

    在CSS3中,用Transform功能可以实现文字或图像的旋转.缩放.倾斜.移动这四种类型的变形,这四种变形分别使用rotate.scale.skew和translate这四种方法来实现.将这四种变形 ...

最新文章

  1. DIRECTDRAW 1:创建一个简单的DIRECTDRAW程序
  2. Jmeter常见问题(转)
  3. 解决Dynamic Web Module 3.0 Requires Java 1.6 or newer
  4. Windows下用FFmpeg+nginx+rtmp搭建直播环境 实现推流、拉流(超简单教程)
  5. BigData之Hive:Hive数据管理的简介、下载、案例应用之详细攻略
  6. centos7命令记录
  7. boost::hana::front用法的测试程序
  8. 【渝粤教育】国家开放大学2018年秋季 1398T分析化学(本) 参考试题
  9. 织梦dedecms小说网站源码|带采集+搭建方式
  10. Shell命令-文件及内容处理之sort、uniq
  11. Mysql之drop、delete、truncate的区别
  12. emacs(考场+平时)配置方案
  13. C/C++ debug(二)
  14. tensorflow tensorboard summary的工作特点
  15. 三网物联卡的优缺点有哪些
  16. PowerPhotos:Mac照片库管理软件
  17. C语言习题答案【3】(仅参考)
  18. 【VSLAM学习记录2】初识cmake
  19. 字符常量与字符串常量
  20. Halcon学习---毛刺凸点检测

热门文章

  1. 近日onedrive突然消失问题的解决
  2. CSR867x — 实现SPP数据收发
  3. 单片机c语言idata什么意思,单片机C语言中的data,idata,xdata,pdata,code
  4. 一位期货人的总结:大道至简,悟者大成
  5. 接入支付宝电脑网站支付实现JAVA版
  6. 服务器无限指令箱子,我的世界箱子无限指令 | 手游网游页游攻略大全
  7. 派森编程软件python有什么用_派森Python下载
  8. dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 用户设备上不存在 Arial 字体将导致应用闪退...
  9. EtherCAT主站SOEM在Ubuntu上的移植
  10. 使用负载均衡技术建设高负载的网络站点(经典文章)