4变形物体_Houdini基础(二)曲线变形物体

3955d9d0cc624f78f021150c3364e199.png

设想:

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

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

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

d31c8b7dab79bdf1cb177f26abf0dcd4.png
仅有x、y坐标的物体

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

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

d09d19cf667ecdb793e7e30814f48b0d.gif
物体从二维变为三维

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

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

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局部的相对位置关系来记录物体的点排布顺序。

9844913bf69b3d131e51e756640dac3f.png
计算出物体的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参数。

3917478b6f095e2dfebaa3c1a7a04723.png
曲线的uv参数可视化

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

045ec9dd7a0c8d16e49b00b9bac9452e.png
获取曲线pos代替原有z轴位置

63a0190e98718e9460e882046afca074.gif
操作效果

c15ea955856fb325e44dba663f5db7eb.png
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的位置。

bbc482d8c2bcc9d28f9be865a8c23e72.png
现物体变形pos的组成

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

2906b5f402cf1ad616933a61601bd913.png
物体回归坐标原点

2.曲线的旋转信息

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

2823e9558cdf8e3a81c621ef1ebad069.png
比较直线和曲线效果

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

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

9242722513b75dd25390ff1d1ceca5ba.png
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");
}

6a6d48d01b1f68016929b12f9ee73164.png
有相对于曲线的旋转与没有旋转的对比

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

3.物体拉伸

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

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

4bf1f678c16b9e4f0e2f982b3a0de893.png
物体现在保持原有的大小变形到曲线上

6ef80cceaf9538d03f75c4578d16ff0b.png
//---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整个范围值内关系的映射。位移则是+上一个数值,进行整体的位移(这些都可以也可以使用在去曲线上不同的值去进行计算)。

c6567a7029a9e3ac31660c476dab87a7.png
位移的代码

d0f7d59a267887ffcdfd573d2d24b38f.gif
最终效果

最终代码

//---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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis 映射成多个list_SSM:Mybatis架构与原理

MyBatis功能架构设计功能架构讲解&#xff1a;我们把Mybatis的功能架构分为三层&#xff1a;API接口层&#xff1a;提供给外部使用的接口API&#xff0c;开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层&…

10无法勾选隐藏的项目_Excel超好用的隐藏操作,不可多得

日常工作中&#xff0c;表格数据的展示与隐藏也是有大学问的&#xff0c;为了表格更加简洁明了、美观大气&#xff0c;实用的隐藏技巧就派上用场了。且听小翼慢慢分享~1、隐藏行列方法1&#xff1a;选中目标区域&#xff0c;右击鼠标选择“隐藏”即可。如图&#xff1a;方法2&a…

HTML5简略介绍

今天要说下 HTML5特有的一个元素 canvas &#xff0c;旨在让web页面上作矢量图不需要在依靠flash或是其他插件&#xff0c;在网页上使用canvas元素时&#xff0c;它会创建一块矩形区域&#xff0c;默认300*150&#xff0c;当然也是可以自定义的。Canvas中的坐标是从左上角开始的…

我的世界java和基岩版哪个好玩_我的世界:Java版本好玩还是基岩版好玩?老玩家看完后沉默了...

MC刚开始是在国外风靡了起来&#xff0c;传到中国的时候MC已经火了很久了&#xff0c;这时候外国已经出现了很多玩MC十分厉害的大神和主播&#xff0c;而在国外也有超多的服务器&#xff0c;其中有号称最强的原版生存服务器Scicraft&#xff0c;而在版本方面MC其实算下来大概有…

SQL Server简介

SQL Server是微软的一款关系型数据库。某些平台吹得天花烂坠&#xff0c;今天第一次在自己的项目中使用了下&#xff0c;感觉不是那么好&#xff0c;特别是SQL语句的支持度还是很欠缺&#xff0c;如limit等都不支持&#xff0c;还有特别单双引号都是需要特别注意的,下面是SQL S…

Windows下断言的类型及实现

一、内容综述 本文主要介绍Windows下断言assert的实现&#xff0c;并总结断言的不同应用准则。最后给出一个windows自定义断言的方法。 本文行文参考《Debugging Windows Programs》第三章相关内容&#xff0c;如果有兴趣的话建议读者可以深入阅读下。 二、断言的类型 1. ANSI…

linux右上角不显示网络连接_来体验下Linux吧

在前面的几期中我们从树莓派开始了解Linux&#xff0c;大家可能已经想来试一下手了。趁热打铁&#xff0c;本期我将介绍两种方便体验学习Linux的方法&#xff0c;在线体验或者安装虚拟机。1 在线体验Linux如果想快速的体验下Linux系统&#xff0c;我们可以选择云计算服务商提供…

python md5解密_python 生成文件MD5码

pymd5.py的代码如下&#xff1a; #-*-coding:utf-8-*-Created on 2012-5-25 author: kanpiaoxueimport hashlib import os import sys def printUsage(): print (Usage: [python] pymd5.py ) def createMD5(filePath): if not os.path.isfile(filePath): printUsage() else: tm…

Java数据结构、list集合、ArrayList集合、LinkedList集合、Vector集合

数据结构&#xff1a; 数据存储的常用结构有&#xff1a;栈、队列、数组、链表、红黑树。 栈&#xff1a;stack,又称堆栈&#xff0c;它是运算受限的线性表&#xff0c;其限制是仅允许在标的一端进行插入和删除操作&#xff0c;不允许在其他任何位置进行添加、查找、删除等操…

第11章 GUI Page436 使用缓冲DC, wxBufferedPaintDC

所谓“缓冲DC”&#xff0c;是指将所有图元都先划到一个人眼看不到的“设备上下文”之上&#xff0c;最后再一次性复制到真正的屏幕DC之上&#xff0c;这样我们就看不到中间画的过程了&#xff0c;也就不会感到闪烁了。 注意&#xff0c;这时不能解除ScrolledWindow1的背景擦除…

Tomcat+JSP经典配置实例

经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题&#xff0c;于是总结了一下如何tomcat下配置jsp、servlet和ben&#xff0c;希望对那些初学者有所帮助。    一、开发环境配置    第一步&#xff1a;下载j2sdk和tomcat&#xff1a;到sun官方站&#xf…

python海龟编辑器画小汽车_【海龟编辑器下载】海龟编辑器(Python编辑器) v1.3.4 官方免费版-趣致软件园...

海龟编辑器是一款专为广大少儿打造的Python编辑器&#xff0c;该软件功能强大且使用便利&#xff0c;可以帮助孩子们以搭积木的方式来学习Python&#xff0c;并且支持Python代码和图形化积木的双向互相转译&#xff0c;不但可以有效提升孩子的学习兴趣&#xff0c;而且还能够降…

微信小程序中组件的使用

微信小程序中组件的使用&#xff1a; 微信小程序中组件定义在项目根目录下components文件夹下&#xff0c;在页面使用的时候需要在页面的json文件中声明&#xff0c;如 父组件向子组件传值及子组件向父组件传值&#xff1a; 父组件wxml中&#xff1a;通过属性绑定值的方式向…

如何保证交叉表编译器和目标系统版本一致_嵌入式系统词汇表

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群AASIC(专用集成电路) Application-Specific Integrated Circuit. A piece of custom-designed hardware in a chip. 专用集成电路。一个在一个芯片上定制设计的硬件。address bus (地…

动态定义数组

首先&#xff1a;为什么需要动态定义数组呢&#xff1f; 这是因为&#xff0c;很多情况下&#xff0c;在预编译过程阶段&#xff0c;数组的长度是不能预先知道的&#xff0c;必须在程序运行时动态的给出 但是问题是&#xff0c;c要求定义数组时&#xff0c;必须明确给定数组的…

sql随机抽取数据50条_厉害!苏宁通过citus打造分布式数据库抗住DB高负载

2018-07-16 23:59内容来源&#xff1a;2017 年 10 月 20 日&#xff0c;苏宁云商IT总部资深技术经理陈华军在“PostgreSQL 2017中国技术大会”进行《苏宁citus分布式数据库应用实践》演讲分享。IT 大咖说&#xff08;微信id&#xff1a;itdakashuo&#xff09;作为独家视频合作…

java中Debug调试、异常的概念、异常体系、处理异常的关键字try/catch/finally/throw/throws、多个异常使用捕获并处理的方式、继承关系中处理异常、自定义异常类

Debug调试&#xff1a; bug指程序当中遇到的一些错误异常&#xff0c;Debug指调试bug,找到bug对其解决&#xff1b;debug可以让代码逐行执行&#xff0c;查看代码执行的过程&#xff0c;调试程序中出现的bug或异常。 public class DebugClass {public static void main(Strin…

densenet网络结构_FC-DENSENET用于图像分割学习笔记

近日使用FC Dense Net 做分割&#xff0c;记录学习使用过程。FC-DenseNet 原文链接&#xff1a;https://arxiv.org/abs/1611.09326 《The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation》初次使用此网络&#xff0c;第一眼是被这个名…

mongodb mysql资源占用_如何限制mongodb启动时占用过多内存

默认情况下&#xff0c;mongodb占用的内存大小为&#xff1a;Starting in 3.4, the WiredTiger internal cache, by default, will use the larger of either:50% of RAM minus 1 GB, or256 MB.下面我们来看一下限制mongodb启动时占用内存的方法&#xff1a;新增配置文件 /etc/…

js ...运算符_「 giao-js 」用js写一个js解释器

前言在这篇文章中,我们将通过 JS 构建我们自己的 JS 解释器,用 JS 写 JS,这听起来很奇怪,尽管如此,这样做我们将更熟悉 JS,也可以学习 JS 引擎是如何工作的!什么是解释器 (Interpreter) ?解释器是在运行时运行的语言求值器,它动态地执行程序的源代码。 解释器解析源代码,从源代…