![0d19648dd097c68736a06dd63377a69b.png](https://i-blog.csdnimg.cn/blog_migrate/5de22eddf093dde20ba52e1b0fa93070.jpeg)
在图形中变换是最基础的一种操作,大多数的操作都是从中演变而出,做为一个萌新一定要学会。
首先变换,Transform可以分为最基础的三种类型,Translate、Rotate、Scale,我们一点 点的分开讲解。
一、Translate
从二维的坐标系统中来看如何将A(红点)移动到B(绿点)的位置
![d8a8e0c649901172ceb3a94f9cf5eb7c.png](https://i-blog.csdnimg.cn/blog_migrate/b1c61ee7954262228f9e0d5bf2a2c40f.jpeg)
在已知B的坐标下:用终点减去起点的坐标则可得到物体需要移动的向量。
B-A = (1,2) – (0,0) = (1,2)
A + (1,2) = B
在Hou中我们可以分解为这样的逻辑关系,我们想用一个点来控制物体的变换。所以我们需要一个点”Point_Pos”当做我们的点B,”Rest_PointPos”当作点A,这样就可以求出来物体跟随点位移的向量,之后让“Geometry_Input”加上这个向量就完成了效果。
![91ec98f986dcbc16e559964df9a4b7ef.png](https://i-blog.csdnimg.cn/blog_migrate/37ce893e29ae39cb76409310a6d94c2b.jpeg)
添加一个猪头,一个点{0,0,0}。
![102feb6142aaa5c060f0433fab436e1a.png](https://i-blog.csdnimg.cn/blog_migrate/e521f8f7185efdfcfadd69b127af5e4f.jpeg)
![baaf1c21dc16427f9935c0cc1ec771e1.png](https://i-blog.csdnimg.cn/blog_migrate/d3aa8a665e604553aeb92b845b224f8b.jpeg)
![1d1cb9f50bbb067272cb0318e547c5a2.gif](https://i-blog.csdnimg.cn/blog_migrate/215b4ef5ab400092a07d0c6b1601574d.gif)
二、Rotate
制作旋转时我们先要给我们的点添加三个属性来标记一下他的空间信息。
![68bbc4e3b1367ff41ce9b94244c90a82.png](https://i-blog.csdnimg.cn/blog_migrate/36f5c3ddb83eeb8b21d9723fe56b9b64.jpeg)
addattrib
Note:在默认创建的v@xxx,或者声明的vector xxx,这些都是完全单纯的向量信息,对物体进行操作几何(移动旋转缩放...)的时候他们都是完全不会改变的,如果想要创建的vvector会随着transform节点旋转而像法线一样跟着变换方向就需要使用setattribtypeinfo来设置向量的类型为“vecotr”,“normal”。
现在进行旋转时点上的vector也会跟着动起来。
![e667da157f08c86e1efdb95340dc9f2c.gif](https://i-blog.csdnimg.cn/blog_migrate/b808ed988dd6015b802afdc3ded5aa3b.gif)
这个时候我们就可以用这三个向量创建一个旋转矩阵了。
将B点的xyz三个属性调入组成一个3*3的矩阵。之后和物体的P先相乘,在把这个rotate过的P去和Translate向量相加。
![a2566e02bf76da7bdc653ac66bee68ef.png](https://i-blog.csdnimg.cn/blog_migrate/906e6808967e4545c3c1b1345c7e3a90.jpeg)
现在就完成了用点控制物体的位移与旋转。
![9d5a4932d5e78274cdc99a7f6945c349.gif](https://i-blog.csdnimg.cn/blog_migrate/98f6e87232985282440011ed3f5c2a0f.gif)
三、实际应用
自定义一个网格变形器。
![eed71b00d1c84fa835b14a001769892f.gif](https://i-blog.csdnimg.cn/blog_migrate/92dae8a8b09a9aebb1ffb43564314fac.gif)
需要用到的技术
(一)点云读取网格附件最近的控制点信息。
(二)向量和矩阵操作。
![da6366802a7ebec645616e39b54eda61.png](https://i-blog.csdnimg.cn/blog_migrate/d2b0457167be9312f003144ad35dbe2f.jpeg)
创建一个简化的网格(或者做max变形器拿着空间内n * n的晶格也可以)为现在的网格添加xyz坐标空间属性来为后续旋转做准备。
![caead4dad7016cb6ab756d4a947303c6.png](https://i-blog.csdnimg.cn/blog_migrate/d5ec607b9c1f339924f7e3767bf32eee.jpeg)
将物体分开,一边做为静止模型一边做为变形网格。之后合并xyz三个属性变成tor矩阵。
Note:最后的合并xyz三个属性的操作一定要放在edit/transform这种变换了网格的节点最后,不然xyz三个属性是不会跟着物体的变形而改变的。
![3f71a3cd71a6308924ada6c5112ef87c.png](https://i-blog.csdnimg.cn/blog_migrate/925024484668703aefc4902ac34716cd.jpeg)
matrix3 rot = set(v@x.x, v@x.y, v@x.z,
v@y.x, v@y.y, v@y.z,
v@z.x, v@z.y, v@z.z);
3@rotate = rot;
添加一个pointvop,用之前的方法用要移动到的终点位置减去起点得到translate,之后在获取旋转矩阵。
![26808f73cd8d6ae27aecbe60e24832fd.png](https://i-blog.csdnimg.cn/blog_migrate/60a850e9eabe14ada501992228e004c6.jpeg)
![035d395e172e0879f8559765860f8708.png](https://i-blog.csdnimg.cn/blog_migrate/9a8a08912a1c286083454bbb3319a6e1.jpeg)
最终我们就让静止的网格得到了实际上变形后会产生的信息,translate,rot。
下面开始最后的变形操作,这里将会涉及到之前单点变换物体没有使用到的“模型相对于点的局部位置”的保留。
新建一个pointvop,导入之前rest模型上面的三个信息。
![3aa700823d780a5ce02dc52b68364a2b.png](https://i-blog.csdnimg.cn/blog_migrate/f86d589b2ffee681a39b6d6e8856ff24.jpeg)
![5828ac244f91c8721b7d4f4ca9befc94.png](https://i-blog.csdnimg.cn/blog_migrate/ff4403f0c5319586f6700e10e7066506.jpeg)
按照之前的思路,我们直接先P * rot + translate。
![c8e1c4f708127c3b1460c5ee12ab1892.png](https://i-blog.csdnimg.cn/blog_migrate/9a350e6511063d21a8393c6e6cc35e23.jpeg)
看起来好像是没什么问题,但是我会喜欢在这个的基础上加一次计算。
![e9a3e8e74f6e713a3a4deb6dcd8b6837.png](https://i-blog.csdnimg.cn/blog_migrate/765e5d9cf9d0bfbe22bcdf9745fdd0c6.jpeg)
计算出Geo相对于rest模型位置的vector,之后用rest的Pos加上这个vector,最后才进行之前的操作。
相对于。
![3ec3c8907ae1dc6066d4bb251bd28abd.png](https://i-blog.csdnimg.cn/blog_migrate/960784c3f9a7f7da7e4845c23a4af6dd.jpeg)
最后可能会感觉rot矩阵在这个效果中没有太大的效果,但是我还是写了进去,因为一些其他情况总是会用到的。
Reference:
https://user.qzone.qq.com/935588727/infocenter 基础的数学在hou中的使用。
[图文]旋转矩阵三维清华课件 - 百度文库wenku.baidu.com