在矩阵中数据定位
本教程将讨论如何获取矩阵的一部分数据,放到另一个矩阵中不同位置。要重新定位数据的原因可能有很多。这里讨论的技巧主要为了生成各种视觉效果,但对于其他目的也适用。
我们将展示如何分离矩阵的一个区域,将其放到另一个矩阵中的指定位置,调整大小(对于拉伸、像素化和模糊等视觉效果非常有用)并动态移动它。
jit.window
打开 Window_options 子 patch
在 patch 左下角有一个教程 3 介绍过的 jit.window
对象。它创建一个单独的窗口来显示矩阵内容。在大多数其他教程章节中都使用 jit.pwindow
。
jit.window
和 jit.pwindow
非常相似 - 除了一个是打开单独的窗口而另一个使用 Patch 中的矩形区域 - 它们有许多相同的属性和消息。但也有一些差异,这将使用 jit.window
来展示一些特性。
你可能看不到 jit.window
打开的 Display 窗口,因为它隐藏在 Patch 窗口后面。我们可以让 Display 窗口浮动 - 一直在浮动在 Max 每个窗口之上,同时仍然与 Patch 窗口交互。为此要用 floating 1
消息打开 jit.window
的浮动属性(默认为 0)。
打开 Window_options 子 patch ,单击标记为 Display as floating window
开关,将 floating 1
消息发送到 jit.window
。
使窗口“浮动”在其他窗口前面
输入到 jit.window
的屏幕坐标 - 450 60 770 300
- 指定了 320 像素宽,240 像素高的显示区域。(如何为 jit.window
指定屏幕坐标,请参阅本章后面的说明和/或教程 3)
从一个 jit.matrix 到另一个
现在加载图片并尝试修改。
单击消息框 importmovie sunset.jpg
将图片加载到 patch 顶部的 jit.matrix
中。打开标有 Display On/Off
的 metro
,开始向 jit.matrix
发送 bang。
用 jit.window
显示图像之前,bang 将矩阵(通过 jit.hue
)发送到第二个 jit.matrix
。在那里能够修改属性以指定显示矩阵的哪个部分。
发送矩阵给另一个 ``jit.matrix``,然后到 ``jit.window``
我们已经在 patch 中间的 preset
中为 UI 对象保存了几个配置。
选择 preset
中的配置 1 会发送 dim 16 12
消息将下方的 jit.matrix
的尺寸更改为 16x12。
dim 消息改变``jit.matrix``的维度
输入矩阵的尺寸是 320x240,但是接收 jit.matrix
的尺寸仅为 16x12,它尽可能显示接收的矩阵,但必须丢弃大部分信息。这会导致图像像素化(指用低分辨率 - 较小的像素 - 来显示图像时产生的马赛克效果)。即使 jit.window
能够显示全分辨率 320x240 的图像,它接收的矩阵现在只有 16x12。出于显示目的,它按需复制像素,将 16x12 矩阵「扩展」为 320x240。
拖动标有 “Change actual matrix dimensions” 的两个数字框,查看不同的像素化效果。
插值
现在将数字框设置回 16 和 12,然后单击标记为 Interpolate in window to smooth pixelation
的开关将 interp 1
消息发送到 jit.window
。
在 ``jit.window`` 中打开插值
现在由 jit.window
在输入矩阵和扩展到 320x240 之间插值,而不是复制 16x12 像素来制作一堆 20x20 像素块。也就是说,当它扩展图像时,在每个单元格值与其输入矩阵中的相邻值之间,创建平滑的颜色渐变,因此 320x240 矩阵中从一个单元到另一个单元的所有变化都尽可能渐进发生。插值会产生极大的模糊,因为输入和输出矩阵的大小差异很大。
再次点击开关,发送 interp 0
消息给 jit.window
设置 interp 的属性为 0(关闭)。在标记为 Change actual matrix dimesions
的数字框中输入新的矩阵尺寸,减少图像像素化:例如,80 和 60(现在像素化块每个只有 4x4)。点开关重新开启插值。请注意,在这种情况下模糊减轻了,因为插值只发生在 4 个像素上。再次关闭插值。
现在点击标记为 Interpolate in matrix to smooth pixelation
的开关,打开 jit.matrix
(而不是 jit.window
)的插值。
减小矩阵的大小时,插值就不明显
这没有太大变化。因为 jit.matrix
仍然只能发送 80x60 矩阵。在这种情况下的插值(缩小而不是放大矩阵时)可以忽略不计。
再次点开关关闭 jit.matrix
的插值。
隔离矩阵的一部分
在 preset
中,选择配置 2。现在只能看到图片的一小部分。
这个配置将 jit.matrix
的尺寸恢复为 320x240。但是仍然可以使用一些属性来隔离矩阵的特定部分而不改变整个矩阵的实际尺寸: srcdimstart
,srcdimend
和 usesrcdim
。
向 jit.matrix
发送三条新消息来设置这三个属性:dimstart 40 150
,dimend 119 209
和 usesrcdim 1
。这些消息指定输入矩阵的子集,并将这些值作为全尺寸(在本例中为 320x240)矩阵发送出去。输入矩阵的这个子集在 jit.matrix
「扩展」(按需复制单元格),以填充输出矩阵的大小。srcdimstart
和 srcdimend
属性被忽略。
设置 srcdimstart
和 srcdimend
属性的消息中,单词紧跟的是描述每个维度内起点和终点的单元索引。dimstart 40 150
和 dimend 119 209
消息告诉 jit.matrix
在水平维度中使用来自单元格 40~119 的特定 80x60 区域,在垂直维度中使用单元格 150~209。
本章中讨论了三种指定矩形区域的方法!关键要明确每种情况下指定的内容。
在
jit.window
中输入显示区域的坐标。在计算机的操作系统中,屏幕坐标原点在左上角,是 0,0; 往右两个像素(左起第三个像素)是 2,0; 该点向下 5 个像素(向下的第六个像素) 是 2,5。输入矩形的左-上-右-下的参数坐标描述屏幕的矩形区域。
jit.matrix
dim 属性指定维度大小(单元格数量)。
srcdimstart
和srcdimend
属性指定单元格索引(包含)。单元格索引从 0 到单元格数量 - 1(平面的索引也类似)。对于 320x240 矩阵,第一维中单元格索引从 0~319,第二维索引从 0~239。对于jit.matrix
的维度,用srcdimstart
后跟起始单元格索引,来指定每个维度的起点,用srcdimend
后跟结束单元格索引,来指定终点。
输入矩阵仅有 80x60 像素,而目标矩阵为 320x240。较小矩阵扩展为较大矩阵会导致像素化。但是现在扩展发生在 jit.matrix
内部(即在它的“源”区域和“目标”大小之间),而不是在 jit.matrix
和 jit.window
之间(正如之前减小 jit.matrix
尺寸)。如果想通过插值来平滑像素化,必须在 jit.matrix
中完成。在 jit.window
中启用插值没有意义,因为它已经从 jit.matrix
接收到 320x240 矩阵。
要验证这一点,请打 interpolate in window...
开关发送 interp 1
到 jit.window
。因为我们试图将 320x240 矩阵插入到 320x240 显示区域,因此不会发生任何变化。关闭开关,将 jit.window
差值属性设置回 0。现在用另一个开关将 interp 1
消息发送到 jit.matrix
。现在得到了我们想要的平滑效果。
尝试输入新值来更改 srcdimstart
和 srcdimend
属性的参数。这样可以将图片的任何特定区域隔离为“源”区域。为源区域选择的尺寸将决定图片在扩展到填充 320x240 输出矩阵时的失真程度。
翻转图像
你可能认为 srcdimend
属性的参数(源区域的终点单元索引)应该大于 srcdimstart
。并非如此。
选择 preset
的配置 3 垂直翻转图片。
顶部和底部在第二维中翻转
如果在垂直维度中指定小于起始索引的结束单元格索引,jit.matrix
仍将这些索引与目标矩阵的垂直维度中的起点和终点相关联,从而有效地反转值的方向。
可以在水平维度中进行翻转以水平翻转图像。如果在两个维度上翻转源区域,会得到将图像旋转 180° 的视觉效果。
选择 preset
的配置 4。
这个例子在两个维度上翻转了源区域,将大小减小到 160x120 ,并打开 interp 属性来平滑像素化。
调整输出矩阵的大小
既然可以指定矩阵的源区域,那么也可以指定目标区域。这仍然不会改变输出矩阵的大小,dim 属性为 320x240。但是会更改源区域所在的区域。输入矩阵的源区域,将被放置在输出矩阵的目标区域中(按需扩展/收缩)。位于目标区域之外的输出矩阵的单元将保持不变。
选择 preset
的配置 5。整个输入矩阵被挤压到输出矩阵中心的 80x60 矩形中。
首先要注意的是 usesrcdim
属性已被关闭,因此我们再次使用整个输入矩阵作为源(现在忽略 srcdimstart
和 srcdimend
属性)。usedstdim
属性已打开,输入将被放在输出矩阵的任意指定部分。dstdimstart
和 dstdimend
属性指定矩阵中间的单元为目的地:dstdimstart 120 90
和 dstdimend 199 149
。我们关闭了 interp 属性,因为现在正在收缩图像。
另外,我们已打开标记为 Erase previous image
的开关。这将数字 1 发送到 if $2 then clear
对象。该语句的 if 部分现在为 true ,因此每次对象在左入口处收到消息时,将发送 clear
消息。这会在显示图像后立即清除 jit.matrix
对象的内容,为将要接收的下一个 jit.matrix
准备。这样可以确保目标区域外的所有单元格的值都为 0,输出矩阵的未使用区域将显示为黑色。
更改指定目标尺寸的数字框中的值,在 Display 窗口中移动(并调整尺寸)图片。
关闭标记为 Erase previous image 的开关停止 clear
消息。更改 dstdimstart
和 dstdimend
的参数,注意这次有什么不同。之前的目标区域仍然在 Display 窗口中绘制,因为矩阵中的那些单元格尚未清除,如果它们位于新目标区域之外,将保持不变。这样产生了前面图像的残留效果,可进一步获得特定的视觉效果。
image
在矩阵中移动图像数据
自动设置 dstdimstart
和 dstdimend
属性过程,我们可以在矩阵中移动数据,使图像看起来在实时移动。
选择 presets
的配置 6。
这将启动 move_around
子 patch 内部的自动过程,持续提供新的参数给 dstdimstart
和 dstdimend
属性。用 patch 上方的开关启动,数字框为每次移动到新目的地指定时间(以毫秒为单位)。
双击 patch move_around
查看子 patch 内容。目前为止我们只使用了子 patch 的右半部分。
子 patch [``move_around``] 中的目标移动过程
右入口中的 rate 值是 metro
的时间间隔。定期触发 4 个 random
对象,随机选择新的左-上-右-下索引。这些目标点与时间值一起发送到 line
对象,再以每 50 毫秒间隔发出,把目标区域逐步转移到这些新的随机点(显示图像的速率)。在子 patch 之外,这些值用作 jit.matrix
的 dstdimstart
和 dstdimend
属性的参数。
这个子 patch 包含一些值得注意的技巧。第一个技巧我们已经实现过,它让 dstdimend
的参数可以超过矩阵的 320x240 范围。例如,使用 random 640
对象作为水平维度,然后从结果中减去 160,得到从 -160~479 的结束单元格索引。这样做是为了增大目标区域,以便图像变化时看到较大的视图,这也意味着图像将更频繁地移动到窗口边缘。值得注意的是,可以指定超出矩阵实际单元格的目标边界,jit.matrix
能够在该区域内完整显示图像(当超出矩阵尺寸时裁剪)。
第二个技巧比较细节:使用 sel 0
对象来检测 metro
何时关闭,用它来触发每个 line
对象的 stop
消息,以便它们在自动流程关闭后不会继续发送值。
关闭 [move_around]子 patch 窗口。
更改,调整大小和移动源图像
现在我们也将更改源图像自动化。
选择 presets
的配置 7。
与设置目标区域的方式大致相同,现在需要不断改变图像的源区域。我们现在看到源矩阵的一些矩形子集的动画视图(使用 srcdimstart
和 srcdimend
),不断调整该视图的大小并在窗口中移动它(使用 dstdimstart
和 dstdimend
)。由于[move_around
]子 patch 随机选择源矩形和目标矩形,因此图像有时也会被翻转。jit.matrix
的插值属性已经打开,平滑源图像被拉伸时出现的像素化。
要更清楚看到变化,打开标记为 Erase previous image
开关。
关于尺寸的更多信息
本教程介绍了如何更改 jit.matrix
的维度,以及如何在对象中指定源和目标区域。为了便于讨论和可视化,我们在二维矩阵内指定源矩形和目标矩形。这也可以用于任意维度的矩阵。(srcdimstart
,srcdimend
,dstdimstart
和 dstdimend
的参数个数对应于 jit.matrix
的维度)。 例如,如果有一个三维矩阵,这些参数可用于指定矩阵的虚拟 3D 空间中的六面体。
注意:某些专门处理 2D 矩阵的 Jitter 对象(例如
jit.movie
),源和目标区域将始终为矩形区域。在这些对象中,源区域和目标区域在名为 srcrect 和 dstrect 的单个属性中定义,这些属性用四个参数来指定矩形的边界(左上角和右下角)单元格。
Hue Rotation
为了增添一点多样性,在两个 jit.matrix
中间增加 jit.hue
对象。(教程 9 详细介绍了 jit.hue
)
选择 presets
配置 8 并查看正在运行的 jit.hue
。
修改色调角度
这个配置关闭 usedstdim
但打开 usercdim
,并在 jit.matrix
中启用插值以模糊扩展的图像。rotate 子 patch 自动旋转 jit.hue
的色相角度。
双击打开 rotate 查看子 patch。
[rotate]子 patch
右入口的值指定完成 360° 色调旋转的时间(以毫秒为单位)。当 1 进入左入口时,数字 360 与该时间值组合,指示 line
对象在该时间内从 0 到 360,每 50 毫秒发出一个新的值。
请注意,line
的第一个 typed-in 参数包含一个小数点,说明 line
发送浮点数而不是整数以提高精度(而且 jit.hue
的 hue_angle 消息接收浮点数)。当line
到达 360,右出口发出 bang。用它将 line
设置回 0,然后 re-bang pack
对象开始下一个旋转。当左入口处接收到 0 时,sel 1
对象直接将其传递到 line
停止重置色调角度为 0。
关闭[rotate]子 patch。
选择 preset
配置 9。它基本上整合了 patch 中所有自动化和图像处理技巧。这次 jit.matrix
的目标尺寸变化设置为 200 毫秒,以更快的速率产生效果。
全屏显示
当你用 Max patch 创建了想要的图像,并想以更优雅的方式显示结果时,可以让 jit.window
全屏。它的 fullscreen
属性打开时,jit.window
使用整个屏幕作为显示区域。如果不勾选 inspector 中的 fsmenubar 属性,将隐藏菜单栏。
关于 jit.window
全屏功能,有几点需要注意。
首先,一旦全屏(特别是隐藏了菜单栏时),无法再使用鼠标退出全屏。所以需要在 Max patch 中设置让全屏属性恢复为 0 的方法。
其次,只有一个 jit.window
可以全屏。如果有多个 jit.window
对象争夺全屏访问权限,则最近将全屏属性设置为 1 的对象将填满屏幕。
此外,即使 jit.window
全屏,其分辨率也由其实际尺寸(即其 rect 属性的参数)决定。例如,如果 rect 属性指定了 320x240 的矩形,那会作为图像的分辨率,即使屏幕尺寸远大于此。
在 Window_options 子 patch 中,包含了使用空格键打开和关闭 jit.window
全屏属性的功能。jit.window
将 fsmenubar 设置为 0。这在全屏时隐藏顶部菜单栏(Mac)。
使用空格键切换到全屏显示
尝试使用空格键打开和关闭全屏。
要获得更抽象的视觉效果,请将 colorswatch.pict 图像导入到 patch 顶部的 jit.matrix
中,然后尝试不同的配置。
本教程使用静止图像作为源素材,以便查看演示效果,当然也可以使用视频。
小结
隔离和重新定位矩阵中的某些数据有不同的方法。jit.matrix
的 dim 属性设置矩阵的实际尺寸。打开 jit.matrix
的 usesrcdim
和 usedstdim
属性,可以使用输入和输出矩阵的指定区域,它们被称为源(source)和目的(destination)区域。
使用 srcdimstart
和 srcdimend
属性指定这些区域的单元格边界(将起始和结束单元格设置为源区域的角点)和 dstdimstart
和 dstdimend
属性(用于目标区域)。
这些属性不会改变矩阵的实际大小,当 usercdim
和 usedstdim
打开时,它们指定输入矩阵的某部分将显示在输出矩阵的哪个部分。如果源区域和目标区域的形状(大小)不同,jit.matrix
将扩展或收缩源区域以适合目标区域。这会导致重复或丢失数据,但可以产生有趣的拉伸或像素化效果。源区域和目标区域可以使用 Max patch 的其他部分的数字来动态更改,以便交互式或自动修改图像的大小、形状和位置。
interp 属性打开时,如果目标区域的尺寸大于源区域,jit.matrix
在它们之间插值(提供中间值)。这可以平滑像素化效果,并模糊相邻单元格的变化。
jit.window
用已经指定的 rect 属性大小的矩形区域,显示它接收的任何尺寸的矩阵。如果输入矩阵的大小与显示区域的大小不同,图像将被 jit.window
扩展、缩小或扭曲。这也可以用于拉伸和像素化效果。 打开 jit.window
interp 时,可平滑拉伸和像素化。
要使用图像填充整个屏幕,可以打开 jit.window
全屏属性,并用 fsmenubar 0
消息隐藏菜单栏。(要留下一些方法让 Patch 窗口回到前台)
我们已经演示了调整矩阵数据的大小、重新定位、翻转和插值以生成视觉效果(如拉伸,扭曲,模糊和像素化)的技巧。
作者:Kidult
链接:https://www.jianshu.com/p/6bba9958f9b8