在vop中重构transform节点(一)
关于矩阵的知识可以说多如牛毛,但大都十分抽象,即使勉强看懂,也很难将其熟练的运用到工作之中。在这篇文章中我会尝试用简单的方法解释关于齐次向量、四元数和变换矩阵的相关知识。并在houdini vop中将其重构出来。
如果说向量代表的是有向线段、或是空间中的点的话,那么矩阵代表的就是空间到空间的映射。
在这里定义对行向量v={xyz}v=\begin{Bmatrix}x&y&z\end{Bmatrix}v={xyz}右乘矩阵F:
{f11f12f13f21f22f23f31f32f33}\begin{Bmatrix} f_{11} & f_{12} & f_{13}\\ f_{21} & f_{22} & f_{23}\\ f_{31} & f_{32} & f_{33}\\ \end{Bmatrix} ⎩⎨⎧f11f21f31f12f22f32f13f23f33⎭⎬⎫
所得到的结果为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′=f11x+f21y+f31zy′=f12x+f22y+f32zz′=f13x+f23y+f33z
由此不难看出,在向量与矩阵的乘法中,矩阵中每个元素只参与一次运算。
其中:
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={100}ey={010}ez={001}
因此向量v={xyz}v=\begin{Bmatrix}x&y&z\end{Bmatrix}v={xyz}的实际意义即是将点v从原点处向x轴正方向移动距离x,再向y轴正方向移动距离y,最后向z轴正方向移动距离z之后所得的结果,即:
v=exx+eyy+ezzv=e_xx+e_yy+e_zz v=exx+eyy+ezz
在这里我们尝试对基底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′={f11f12f13}ey′={f21f22f23}ez′={f31f32f33}
然后将原向量v={xyz}v=\begin{Bmatrix}x&y&z\end{Bmatrix}v={xyz}应用这组新的基底,可得到其在原基底下的坐标:
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′=f11x+f21y+f31zy′=f12x+f22y+f32zz′=f13x+f23y+f33z
通过观察不难发现,以这种方式得到的向量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节点(一)相关推荐
- 删除单链表中的重复节点(c语言版本)
这是一道经典的面试题,下面是我的研究和举一反三,特整理如下: 分为三种情形: (1)删除有序链表的重复节点,重复节点一个都不留 (2)删除有序链表的重复节点,重复节点只留一个 (3)删除无序链表的重复 ...
- 使用Blender中的几何节点创建程序对象
大小解压后:2.4G 持续时间3h 30m 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 使用Blender中的几何节点按程序创建对象 信息: 使用Blender中的几 ...
- Nat. Mach. Intell. | 基于深度强化学习寻找网络中的关键节点
今天给大家介绍哈佛大学Yang-Yu Liu课题组和加利福尼亚大学洛杉矶分校Yizhou Sun课题组发表在nature machine intelligence上的一篇文章"Finding ...
- 编写代码,移除未排序的链表中的重复节点
2019独角兽企业重金招聘Python工程师标准>>> 解法一:如果不得使用临时缓冲区,该怎么解决? 要想移除链表中的重复节点,我们需要设法记录有哪些是重复的.这里只需要使用到一个简 ...
- Linux文件系统中的inode节点详细介绍
一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统 ...
- 求一颗二叉树中两个节点的最低公共父节点
题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...
- zTree实现单独选中根节点中第一个节点
zTree实现单独选中根节点中第一个节点 1.实现源代码 <!DOCTYPE html> <html> <head><title>zTree实现基本树& ...
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
文章目录 一.setParent 方法中设置父节点与子节点关系 二.完整代码示例 1.MyBuilderSupport 生成器代码 2.使用 MyBuilderSupport 生成器创建 Xml 代码 ...
- CSS3中的transform变形
在CSS3中,用Transform功能可以实现文字或图像的旋转.缩放.倾斜.移动这四种类型的变形,这四种变形分别使用rotate.scale.skew和translate这四种方法来实现.将这四种变形 ...
最新文章
- DIRECTDRAW 1:创建一个简单的DIRECTDRAW程序
- Jmeter常见问题(转)
- 解决Dynamic Web Module 3.0 Requires Java 1.6 or newer
- Windows下用FFmpeg+nginx+rtmp搭建直播环境 实现推流、拉流(超简单教程)
- BigData之Hive:Hive数据管理的简介、下载、案例应用之详细攻略
- centos7命令记录
- boost::hana::front用法的测试程序
- 【渝粤教育】国家开放大学2018年秋季 1398T分析化学(本) 参考试题
- 织梦dedecms小说网站源码|带采集+搭建方式
- Shell命令-文件及内容处理之sort、uniq
- Mysql之drop、delete、truncate的区别
- emacs(考场+平时)配置方案
- C/C++ debug(二)
- tensorflow tensorboard summary的工作特点
- 三网物联卡的优缺点有哪些
- PowerPhotos:Mac照片库管理软件
- C语言习题答案【3】(仅参考)
- 【VSLAM学习记录2】初识cmake
- 字符常量与字符串常量
- Halcon学习---毛刺凸点检测
热门文章
- 近日onedrive突然消失问题的解决
- CSR867x — 实现SPP数据收发
- 单片机c语言idata什么意思,单片机C语言中的data,idata,xdata,pdata,code
- 一位期货人的总结:大道至简,悟者大成
- 接入支付宝电脑网站支付实现JAVA版
- 服务器无限指令箱子,我的世界箱子无限指令 | 手游网游页游攻略大全
- 派森编程软件python有什么用_派森Python下载
- dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 用户设备上不存在 Arial 字体将导致应用闪退...
- EtherCAT主站SOEM在Ubuntu上的移植
- 使用负载均衡技术建设高负载的网络站点(经典文章)