设想:

先从二维上来看直角坐标系。物体是由x,y两个轴向的数据组成的。少了其中一组数据物体就只能是分布在单一轴向上的点。

单独保留物体x、y情况下的点分布情况

现在将x、y加起来,可见在三维空间中形成了一个平面。

仅有x、y坐标的物体

从目前的情况上来看我们已经知道了后续再添加上z轴信息的物体情况。

因为坐标系是三个完全交叉相互垂直的平面,所以当只有两个轴向信息时物体只能组成一个平面。当我们添加第三个轴向时,物体开始突破平面变成三维物体。

物体从二维变为三维

以上,我们还原了物体的三维构建。

由此可以得到,三维物体组成的公式为:

P = ( P.x , 0, 0)+ ( 0, P.y, 0) + ( 0, 0, P.z);

在最后的动图中我们可以看到,物体加上z轴的向量的时候时笔直的朝着Z轴方向进行增加。

前面讲述过三个轴是相互垂直的,现在P.z上面储存的值是小数,且位于向量第三个位置,所以相对于是加上了(0,0,z),物体不会在x、y上面出现变化。

这就是这篇文章的重点,既然因为坐标系是直角,所以还原物体数据时只会相互垂直的相加形成,那我们把第三个轴向变形扰乱会怎样呢?物体是否就会因此而变形?

一、重映射曲线位置到模型。

想单独给物体的z轴添加信息首先需要保存一个物体的bound box局部的相对位置关系来记录物体的点排布顺序。

计算出物体的0到1的bound box
vector max, min;
getbbox(min, max);vector transZero = {0,0,0} - min; vector localP = @P + transZero; //Translate Object to coordinate origin.vector boundSize = max - min;
vector bbox = localP / boundSize;@Cd = bbox;
v@bbox = bbox;

曲线是有uv的,曲线上uv一般为(u,0.5),v向是没有数值的,这个u值记录了类似物体boundbox一样的0-1参数。

曲线的uv参数可视化

使用Geo的boundBox.z的0-1去匹配上曲线uv.u的0-1得到新的物体Z轴向量。

获取曲线pos代替原有z轴位置
操作效果
vector newP = @P;
newP.z = 0;vector curvePos=primuv(1,"P",0,v@bbox.z);@P = newP.xyz + curvePos.xyz;

二、效果修正

上述基本上已经完成了曲线变形的制作思路,但是还会涉及比较具体的一些问题没有讲到:

1.物体没有匹配到曲线上。

2.物体没有读取变形的旋转信息值读取了Position,没有rotate矩阵。

3.物体变形拉伸。

4.物体位移。

1.物体现在离曲线有一定的差距

因为不光在z轴加了curvePos,在xy轴也加上了curvePos,物体变形后的位置是本身对于original的位置再机上curvePos对于original的位置。

现物体变形pos的组成

解决方法很简单,把物体归零就好,然后物体的朝向一直设定为旋转到z轴(自己想想怎么做)

物体回归坐标原点

2.曲线的旋转信息

在编辑曲线使其弯曲后,发现物体对于弯曲的曲线只是在x轴向上进行了变化,是直直的向其他方向位移过去的,并没有弯曲变形的感觉。

比较直线和曲线效果

因此需要用到上一篇文章说得那样,给点定义一个自身的矩阵记录旋转信息。

这里我们用lookat函数来制作。

int npoints = primvertexcount( geoself(), int(@primnum));
vector up = normalize( chv("upVector"));
matrix3 localCoor = -1;for(int i = 0; i <= int(npoints-1); i++)
{if( i == int(npoints-1)){setpointattrib( geoself(), "localCoor", i, localCoor, "set");break;}localCoor = lookat( point(geoself(),"P",i+1), point(geoself(),"P",i), up); setpointattrib( geoself(), "localCoor", i, localCoor, "set");
}

有相对于曲线的旋转与没有旋转的对比

加上了旋转后,整个物体的变形才是正确的。

3.物体拉伸

因为直接用boundBox的0-1去适配长度不相同的曲线的uv0-1所以必然会出现拉伸。其实解决方法也很简单,用物体变形轴(Z Axis)的长度 / 曲线长度得到他们的缩放因子,乘以 boundBox.z。

newBbox = bbox * ( boundSize.z / curveLength);

物体现在保持原有的大小变形到曲线上
//---computer boundBox-----
vector max, min;
getbbox(min, max);vector transZero = {0,0,0} - min;vector localP = @P + transZero;vector boundSize = max - min;
vector bbox = localP / boundSize;@Cd = bbox;
//----deforme-------
//remap bbox.
float curveLength= prim( 1, "length", 0);
float newBbox = bbox.z * (boundSize.z / curveLength); // computer reduction scale factor.vector newP = @P;
newP.z = 0;vector curvePos = primuv( 1, "P", 0, newBbox);
matrix3 rot = primuv( 1, "localCoor", 0, newBbox);@P = newP.xyz  * rot  + curvePos.xyz;

4.物体位移

通过上面的缩放操作我们已经可以明白,想要控制物体在曲线上的缩放、位移,其实就是对于bbox值的一个重映射,缩放是*一个factor进行保持原物体0-1整个范围值内关系的映射。位移则是+上一个数值,进行整体的位移(这些都可以也可以使用在去曲线上不同的值去进行计算)。

位移的代码
最终效果

最终代码

//---computer boundBox-----
vector max, min;
getbbox(min, max);vector transZero = {0,0,0} - min;vector localP = @P + transZero;vector boundSize = max - min;
vector bbox = localP / boundSize;@Cd = bbox;
//----deforme-------
//remap bbox.
float curveLength= prim( 1, "length", 0);
float newBbox = bbox.z * (boundSize.z / curveLength); // computer reduction scale factor.newBbox += chf("offset");vector newP = @P;
newP.z = 0;vector curvePos = primuv( 1, "P", 0, newBbox);
matrix3 rot = primuv( 1, "localCoor", 0, newBbox);@P = newP.xyz  * rot  + curvePos.xyz;


总结:

以上基本实现了这个功能,其余的拓展功能(超过曲线的部分如何保持啊,怎么每个地方旋转不一样啊etc....)可以自己想想如何添加,基本上就是很简单的矩阵操作和逻辑问题。

Reference:

https://vimeo.com/247900360​vimeo.com

4变形物体_Houdini基础(二)曲线变形物体相关推荐

  1. Blender基础:曲线修改器、晶格修改器

    目录 1.曲线修改器 2.几个细节 3.半径与倾斜 4.练习锁链 5.晶格 6.晶格修改器 7.练习空间扭曲效果 形变类修改器,使物体产生形变.例如,曲线修改器.晶格修改器 1.曲线修改器 曲线函数修 ...

  2. html 曲线动画,Mugeda HTML5教程:插入曲线变形动画

    mugeda最新添加了一些新的功能中,还有一个曲线变形动画的功能,这一节我们来具体讲述怎么使用.所谓曲线变形动画指景物的形体变化,它是使一幅图像在多帧内逐步变化到另一幅完全不同图像的处理方法.这是一种 ...

  3. C4D动画,贴图不跟着物体动。贴图变形。贴图投射模式uvw和立方体

    <C4D的十万个为什么>首发于 公众号:苦七君 免费搜索查看更多问题:kuqijun.com 问题: C4D动画,贴图不跟着物体动.贴图变形.贴图投射模式uvw和立方体 答案: 最近群里总 ...

  4. 7y30 linux,基于酷睿M3-7Y30:CHUWI 驰为 发布 CoreBook 二合一变形本

    基于酷睿M3-7Y30:CHUWI 驰为 发布 CoreBook 二合一变形本 2017-10-31 17:51:05 4点赞 12收藏 13评论 在SurBook二合一变形本和LapBook Air ...

  5. 《土力学与地基基础(二)》在线平时作业3

    <土力学与地基基础(二)>在线平时作业3-00001 试卷总分:100  得分:100 一.单选题 (共 10 道试题,共 50 分) 1.大堤护岸边坡,当河水位骤降到低水位时,边坡稳定性 ...

  6. 《土力学与地基基础(二)》在线平时作业1

    <土力学与地基基础(二)>在线平时作业1-00001 试卷总分:100  得分:100 一.单选题 (共 10 道试题,共 50 分) 1.某场地自上而下的土层分布为:第一层粉土,厚3m, ...

  7. 《土力学与地基基础(二)》在线平时作业2

    <土力学与地基基础(二)>在线平时作业2-00001 试卷总分:100  得分:100 一.单选题 (共 10 道试题,共 50 分) 1.饱和粘性土的不固结不排水抗剪强度主要取决于 A. ...

  8. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)...

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形.方格取数2解法: ...

  9. Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装

    Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装 目录 Unity 基础 之 一个点(物体)绕另一个点(物体)旋转的简单封装 一.简单介绍 二.实现原理 三.注意事项 四.效果预览 ...

最新文章

  1. 帮AI摆脱“智障”之名,NLP这条路还有多远?
  2. kill 进程_Node.js 进程平滑离场剖析
  3. sklearn onehot
  4. java如何获取一个double的小数位数
  5. java语言程序设计第六章答案_Java语言程序设计(邵丽萍编著)第六章.doc
  6. 如何在一分钟内实现微服务系统下的架构可视化
  7. server接收dtu透传代码_ESP8266 STM32 HTTP json透传实验
  8. matlab2c使用c++实现matlab函数系列教程-sign函数
  9. docker镜像删除
  10. Java初级程序员面试中应该如何准备?一般公司对Java开发的要求有哪些?
  11. 世界著名汽车标志(大全)
  12. 不在同一局域网?组建家庭局域网的方案和踩坑
  13. 图神经网络(10)- knowledge graph(知识图谱)
  14. 信息与熵【上】生命以信息为食
  15. minio对象存储原理_使用MinIO在本地运行S3对象存储
  16. I2C driver编写指导二:编写i2c client driver指南
  17. 生物信息学笔记01-- 绪论
  18. html不同域名显示不同内容,前端基础面试题(HTML+CSS部分)
  19. 大数据相加_大数据如何快速求和 excel大数据批量求和
  20. day 1 学习MySQL数据库作业 - 创建员工表思考与表之间的关系

热门文章

  1. MySQL 常用运算符
  2. C语言fread和fwrite的用法详解
  3. r语言将百分数化为小数_「淮南师出」教师资格/招聘小学数学:《百分数与小数的互化》...
  4. centos下mysql 命令_CentOS下mysql数据库常用命令总结
  5. python-类思想-实现简单增删查改
  6. C语言-字符串处理函数strcmp
  7. C/C++混淆点-左移右移操作符
  8. 用python实现时间的动态(动态时钟)+ 算出某年某月星期几的所有日期
  9. 前端页面-不可编辑控制
  10. JS关键字和保留字汇总(小记)