▉生命是华丽错觉,时间是贼偷走一切。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】
█所谓现实只不过是一个错觉,虽然这个错觉非常持久<爱因斯坦>
表面上看到的不一定是你以为你看到的,我们经常被自己的眼睛所欺骗,被表象所蒙蔽。
你以为是青铜的,可能是王者。你以为山穷水尽,没有希望,毫无可能时,可能成功就隔着一层纸。这可能是生活对我们的一种考验。
所以不要因上天的恩泽迟迟未降临,萌生被遗弃的错觉,再坚持一下,一定会柳暗花明,别有洞天的。
今天这节内容:
模仿半色调印刷风格用阵列球组成一张图像
这一节要实现的效果
.....
▉今天是42岁第018天周一
这是写给houdini的
第044封“情书”
我是geo流程图
我是pointvop流程图
vop实现二维空间的半色调印刷效果
vop实现三维空间半色调印刷效果
我是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
如何实现二维空间半色调印刷效果
1)grid贴图;旋转;
2)add只保留点;
3)pointwrangle创建一个粒子半径的属性pscale=(1-亮度信息grey)*粒子尺寸size*0.5
4)color边黑色。
5)最后copytopoint。
2
如何实现三维空间印刷半色调效果
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(点点点):
构成图像的亮度值在0~1之间
02)使用亮度驱动点的大小,指定的像素越暗,表示该像素的球体就越大。
这是一种很传统的印刷技术,在平面上实现很简单,但是要在三维空间如何堆叠这些球体形成灰度图呢?接下来就用到:
(二)透视投影:
A)首先第一个球:
01)假设我们的球体离摄像机有一定的距离,球体有一定的直径。
02)当我们把球移到距离相机原来一半距离时,这个球看上去更大了,它的尺寸账号是原来的两倍。
03)所以为了使球跟以前的看起来差不多大,比例就要缩小一半;
A)首先第二个球:
04)它在第一个球上方,我们用Y表示它们间距
05)第二个球,它在第一个球上方,我们用Y表示它们间距,当移动到距离相机一半距离时。感觉要出相机视角边界,而原来位置距离视觉边界却很远。
06)所以距离第一个球的距离,y轴减半;
接下来
开始正式制作
使用软件houdini16.5
问题2:如何用pointwrangle实现二维空间的半色调印刷效果
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 //
问题3:如何使用pointwrangle实现三维空间中模拟半色调印刷效果
camera //
// 使球阵列在场景中正确的透视关系;
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的偏移已经解决
b) 粒子最终大小=原尺寸*缩小因子,也就是xy偏移值.
//--9 当前粒子尺寸变量pscale--
f@pscale *= xyoffset;
问题4:如何使用pointvop实现二维空间半色调印刷效果
10)pointvop1 //
--------第二部分:1-grey ---------
10-1) Average vector component:连接Cd,计算一个向量Cd的平均值。
10-2) constant :1
10-3) subtract :<9-2> - <9-1>
---------第二部分:grid尺寸/分辨率 ----------
10-4)divide: //中键外置两个参数,改完名字对应关联grid的column和sizex;
10-5) constant // 0.5
10-6)multiply//
10-7)bind export // name :pscle
问题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
本文图片全部原创,版权归原作者所有