Houdini矩阵的理解3

最近有人问一些关于物体沿路径运动的问题,今天抽时间来整理一下,我自己的理解在这里插入图片描述
首先要理解一个关于uv的问题。
如下图,拿猪头举例来说,当一个立体的猪头展开为uv坐标的时候,其实就是是一个二维的平面坐标,也就是u方向和v方向,而我们一般会把物体放在uv 坐标中的第一象限所有他们的值范围分辨是U方向{0,1};V方向{0,1}。
在这里插入图片描述
其次就是要理解4*4矩阵中各个元素倒是在三维控件里面是干什么的。

matrix m = {   		1,0,0,0,
					0,1,0,0,
					0,0,1,0,
					0,0,0,1,
					}
//上诉是一个标准矩阵。

首先看矩阵第一行的(1,0,0,0)他表示控制物体x轴的缩放和旋转,其中第一个元素1,他值得放大和缩小代表着x轴得放。那么依次类都是同样得效果。到第四行得时候(0,0,0,1)他得前三个值的变化分表表示物体x,y,z的移动。(PS:每行的最后一个数值表示补位)
在这里插入图片描述

上述两个关键点就是物体沿着曲线运动的最关键的两个要素。
剩下的就在具体的代码节点里面解释吧。下面是节点的关系图。
节点关系图
然后要求出线的x(切线方向),y(垂直与x和N的方向),z(法线方向)
在这里插入图片描述
图中红线代表切线方向x,绿线代表垂直与x和N的y方向,蓝线代表着N方向

节点path里面就是自定义个叫f@path的属性,值的范围是0-1。
下面是主要节点curvematrix节点中的代码

vector goaluv;
//得到关联一个f@path属性0-1的范围
goaluv.x = f@path;
//通过goaluv.x得到线的uv上的各个属性的变化值,U代表线的切线方向,V代表线垂直与U跟N的方向
vector goal_P = primuv(1, "P" , 0, goaluv);
vector U = primuv(1, "tangentu" , 0, goaluv);
vector V = primuv(1, "tangentv" , 0, goaluv);
//通过得到的U V两个属性来叉乘出normal法线的方向
vector normal = cross(U, V );
//对法线进行一个矫正,即点乘小于零的方向给法线一个反转,也就是是跟自定义up轴方向夹角大于90度
if(dot(normal, chv("up")) <0 )
    normal *= -1;
//标准话三个轴的方向
V = cross(normal, U );

U = normalize(U);
V = normalize(V);

normal = normalize(normal);
//将三个值向量值分别放到矩阵m中
matrix m = set( U.x, U.y, U.z, 0,//对应着线的x轴,也就是切线方向
            	V.x, V.y, V.z, 0,//对应着线的y轴,也就是线的弧度方向
            	normal.x, normal.y, normal.z, 0,//对应着线的法线方向,也就是z轴
            	goal_P.x,  goal_P.y,  goal_P.z, 1//对应着线的点位置
           );

@P *= m;

然后就可得到物体延路径的运动。
关于沿路径的拉伸缩放大家可以自己试试看。也欢迎大神纠错.

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值