第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017

▉生命是华丽错觉,时间是贼偷走一切。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】

█所谓现实只不过是一个错觉,虽然这个错觉非常持久<爱因斯坦>

表面上看到的不一定是你以为你看到的,我们经常被自己的眼睛所欺骗,被表象所蒙蔽。

  你以为是青铜的,可能是王者。你以为山穷水尽,没有希望,毫无可能时,可能成功就隔着一层纸。这可能是生活对我们的一种考验。

所以不要因上天的恩泽迟迟未降临,萌生被遗弃的错觉,再坚持一下,一定会柳暗花明,别有洞天的。

今天这节内容:

模仿半色调印刷风格用阵列球组成一张图像

这一节要实现的效果

.....

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第1张图片

▉今天是42岁第018天周一

这是写给houdini的

第044封“情书”

我是geo流程图

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第2张图片

我是pointvop流程图

vop实现二维空间的半色调印刷效果

vop实现三维空间半色调印刷效果

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第3张图片
第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第4张图片

我是pointwrangle代码

实现二维空间半色调印刷效果

int resx = chi("Resolution_X");

float sizex = chf("Size_X");

//计算每个点的最大尺寸

float size = sizex / float(resx);

vector col = @Cd;

//--转成亮度值--

float grey = (col.r+col.g+col.b)/3.0;

//粒子大小反比,因为是半径所以减半

f@pscale = (1 - grey)*size*0.5;

实现三维空集岸的半色调印刷效果

//--1 相机变量:campos---

vector campos = chv("Cam_position");

//--2 种子变量seed:来决定点离camera的距离的随机性--

float seed = chf("Seed");

//--3 幅度变量amp:决定粒子沿z轴所允许向相机移动的范围--

float amp = chf("Amplitude");

//--4 当前位置变量pos--

vector pos = @P;

//--5 距离变量zdist : 某点到camera距离--

float zdist = pos.z - campos.z;

//--6 移动变量zoffset : 某点移动随机距离--

float zoffset = rand(@ptnum + seed)*amp;

//--7 x,y偏移变量xyoffset:z轴偏移越大,离相机越近,xy偏移越小,所以反比关系 --

float xyoffset = fit(zoffset,0,0,zdist,0.0,1.0);

//--8 当前位置变量v@P:使用set函数--

v@P = set(pos.x*xyoffset,pos.y*xyoffset,pos.z-zoffset);

//--9 当前粒子尺寸变量pscale--

f@pscale *= xyoffset;

本节需要注意的知识点:

======使用pointwrangle实现半色调======

1

如何实现二维空间半色调印刷效果 

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第5张图片

1)grid贴图;旋转;

2)add只保留点;

3)pointwrangle创建一个粒子半径的属性pscale=(1-亮度信息grey)*粒子尺寸size*0.5

4)color边黑色。

5)最后copytopoint。

2

如何实现三维空间印刷半色调效果

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第6张图片

1)首先 到相机的z偏移变量

a)建立三个滑动条变量:相机位置campos;决定随机变量seed;移动幅度变量amp;

    b)得到点到相机距离变量zdist:前点位置pos-campos;

    C)z轴偏移量zoffset=rand(@ptnum + seed)*amp;

2)xy偏移量与z偏移量反比;x,y偏移变量xyoffset=fit(zoffset,0,0,zdist,0.0,1.0);;

     最后输出点的位置v@P:x,y都乘xy偏移量,z轴等于z减z轴偏移;

3) 粒子最终大小=@pscale*xy偏移量  

======使用pointwrangle实现半色调======

3

pointvop实现2d平面半色调 

1)使用avgcomp节点:计算cd平均值,求1-avgcomp。

2)使用divide节点:外置参数关联size和resolution。

3)使用multiply节点把前两个与0.5相乘。

4)最后bind节点:输出pscale属性。

4

pointvop实现三维口控件半色调

 -------第一部分:点到相机的距离zdist--------

1)vectofloat1 //点位置转浮点

2)vectofloat2 //参数外置seed=2,关联相机位置

3)subtract命名zdist//上面求差值<11-1>-<11-2>

-------第二部分:点到相机偏移幅度zoffset--------

第4步:

4)multiply命名zoffset  // 外置参数:amp=1

5)random  // 随机化

6)add  // 外置参数seed

-------第三部分:点到相机偏移幅度zoffset--------

7)fit 命名xyoffset //重新映射z偏移值: val连接zoffset;srcmax连接zdist

-------第四部分:输出p点新位置--------

8,9)multiply两个名米x,y:各自连接x,y分量xyoffset

10)subtract:连接z分量zoffset

11)floattovect:合并分量输出P。

-------第五部分:输出pscale-------

12)bind1:输入pscale

13)multiply:乘xyoffset

14)bindexport:输出pscale  

接下来

理论部分

1:实现空间半色调印刷效果用到的两种原理

(一)报纸印刷的经典手法:

    01)半色调透视Perspective Halftone(点点点):

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第7张图片

构成图像的亮度值在0~1之间

    02)使用亮度驱动点的大小,指定的像素越暗,表示该像素的球体就越大。

这是一种很传统的印刷技术,在平面上实现很简单,但是要在三维空间如何堆叠这些球体形成灰度图呢?接下来就用到:

(二)透视投影:

  A)首先第一个球:

    01)假设我们的球体离摄像机有一定的距离,球体有一定的直径。

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第8张图片

    02)当我们把球移到距离相机原来一半距离时,这个球看上去更大了,它的尺寸账号是原来的两倍。

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第9张图片

    03)所以为了使球跟以前的看起来差不多大,比例就要缩小一半;

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第10张图片

  A)首先第二个球:

04)它在第一个球上方,我们用Y表示它们间距

    05)第二个球,它在第一个球上方,我们用Y表示它们间距,当移动到距离相机一半距离时。感觉要出相机视角边界,而原来位置距离视觉边界却很远。

    06)所以距离第一个球的距离,y轴减半;

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第11张图片

接下来

开始正式制作

使用软件houdini16.5

问题2:如何用pointwrangle实现二维空间的半色调印刷效果

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第12张图片

1)grid1 // size:1*1;rows=100,columns=100

2)attribfrommap //  贴图mandril.pic

3)transform  // 旋转-90

4)add  // 只保留点

5)pointwrangle1  // 首先假设网格是正方形

    a)  关联grid的rows 和 设置的x分辨率可调参数进行:

int resx = chi("Resolution_X");

    b)关联grid的size x和设置的size x 可调参数

float sizex = chf("Size_X");

   c)  现在可以计算每个点的最大尺寸

float size = sizex / float(resx);

    d)接下来通过每个点的颜色,计算亮度值;

vector col = @Cd;

//--转成亮度值--

float grey = (col.r+col.g+col.b)/3.0;

     e) 亮度值跟粒子大小反比,因为是半径所以减半

f@pscale = (1 - grey)*size*0.5;

6)color  // 变成黑色

7)copytopoint  //  

8)sphere   //  

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第13张图片

问题3:如何使用pointwrangle实现三维空间中模拟半色调印刷效果

 camera   //  

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第14张图片

//  使球阵列在场景中正确的透视关系;

    a)  //---首先要知道点到相机的距离---

//--创建相机可调参数变量---

vector campos = chv("Cam_position");

然后关联复制camera的position:

9)pointwrangle2

//  如何确定一个点离摄像机有多远呢? 

     a) 到相机的z偏移变量

//--1 相机变量:campos---

vector campos = chv("Cam_position");

//--2 种子变量seed:来决定点离camera的距离的随机性--

float seed = chf("Seed");

//--3 幅度变量amp:决定粒子沿z轴所允许向相机移动的范围--

float amp = chf("Amplitude");

//--4 当前位置变量pos--

vector pos = @P;

//--5 距离变量zdist : 某点到camera距离--

float zdist = pos.z - campos.z;

//--6 移动变量zoffset : 某点移动随机距离--

float zoffset = rand(@ptnum + seed)*amp;

     b) x,y偏移变量;最后输出点的位置v@P


//--7 x,y偏移变量xyoffset:z轴偏移越大,离相机越近,xy偏移越小,所以反比关系 --

float xyoffset = fit(zoffset,0,0,zdist,0.0,1.0);

//--8 当前位置变量v@P:使用set函数--

v@P = set(pos.x*xyoffset,pos.y*xyoffset,pos.z-zoffset);

//现在粒子xyz的偏移已经解决

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第15张图片

     b) 粒子最终大小=原尺寸*缩小因子,也就是xy偏移值.

//--9 当前粒子尺寸变量pscale--

f@pscale *= xyoffset;

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第16张图片

问题4:如何使用pointvop实现二维空间半色调印刷效果

10)pointvop1  //  

--------第二部分:1-grey ---------

    10-1) Average vector component:连接Cd,计算一个向量Cd的平均值。

    10-2) constant :1

    10-3) subtract :<9-2> - <9-1>

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第17张图片

---------第二部分:grid尺寸/分辨率 ----------

    10-4)divide:    //中键外置两个参数,改完名字对应关联grid的column和sizex;

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第18张图片
第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第19张图片

     10-5) constant // 0.5

   10-6)multiply// 

   10-7)bind export  // name :pscle

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第20张图片

问题5:如何使用pointvop实现三维空间半色调印刷效果

11)pointvop2

 -------第一部分:点到相机的距离zdist--------

11-1)vectofloat1 //点位置转浮点

11-2)vectofloat2 //参数外置seed=2,关联相机位置

11-3)subtract命名zdist//上面求差值<11-1>-<11-2>

-------第二部分:点到相机偏移幅度zoffset--------

第4步:

11-4)multiply命名zoffset  // 外置参数:amp=1

11-5)random  // 随机化

11-6)add  // 外置参数seed

-------第三部分:点到相机偏移幅度zoffset--------

11-7)fit 命名xyoffset //重新映射z偏移值: val连接zoffset;srcmax连接zdist

-------第四部分:输出p点新位置--------

11-8,9)multiply两个名米x,y:各自连接x,y分量xyoffset

11-10)subtract:连接z分量zoffset

11-11)floattovect:合并分量输出P。

-------第五部分:输出pscale-------

11-12)bind1:输入pscale

11-13)multiply:乘xyoffset

11-14)bindexport:输出pscale   

今天就到这儿了,收功

教程翻译自entagma的网络教程

下一节:第045封Connect The Yarns<Entagma>Houdini 2017

第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第21张图片
第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017_第22张图片

     本文图片全部原创,版权归原作者所有

你可能感兴趣的:(第044封“情书”:错觉VEX / VOPs in Houdini: Perspective Halftone半色调透视<Entagma>Houdini 2017)