obj の関数

obj には値だけでなく関数も用意されています。他アイテムの参照、ピクセル操作、 図形やテキストの生成、他エフェクトの適用などができます。座標などの値メンバーは obj オブジェクト を参照してください。

obj.getobject — 他アイテムの参照

obj.getobject(tag [, frame]) は、対象アイテムの「備考」欄に入力した文字列を tag として、 そのアイテムの描画情報を取得します。備考欄はプロパティエリアの上側にあります。 第 2 引数 frame を指定すると、そのタイムラインフレーム時点の値を取得します(省略時は現在フレーム)。 一致するアイテムが無い場合は nil を返します。

返り値は対象アイテム自身の座標・回転・拡大率であり、グループ制御・カメラ制御による変形は含みません。 同じタグのアイテムが複数あるときは、対象フレームで表示中のものが優先されます。 音声アイテム(合成音声等)も対象になり、座標・拡大率・回転・不透明度は字幕の表示情報を返します。

メンバー説明
exist対象フレームが表示期間内か(boolean)
x / y / z描画位置(ピクセル)
zoom / sx / sy拡大率(1.0 で等倍)。sxsyzoom と同じ値
rz / rzrZ 軸回転角(度 / ラジアン)
rx / ry / rxr / ryr常に 0(X・Y 軸回転は取得しません)
alpha不透明度(0.0 ~ 255.0)
layerレイヤー番号
lengthアイテムの長さ(フレーム数)
volume音量設定の現在値(音声アイテムのみ。他は 0)
characterキャラクター名(音声アイテムのみ。他は空文字列)
textセリフまたは表示テキスト(音声・テキストアイテムのみ。他は空文字列)
kindアイテムの種別名(例:VoiceItem, TextItem, ImageItem)
length / volume / character / text / kind は AviUtl に存在しない YMM4 向けの独自拡張です。従来エンジンと高速ランタイムの両方で動作します。

キャラクター名で演出を分ける

local v = obj.getobject("voice")
if v and v.character == "魔理沙" then
    obj.effect("単色化", "強さ", 100, "color", 0xffee55)
end

発射元の座標に合わせる

local src = obj.getobject("routersys")
if src then
    obj.x = src.x
    obj.y = src.y
end

発射元へ向かって移動する

local target = obj.getobject("routersys")
if target then
    local p = anim.ease_in_out(obj.t)
    obj.x = anim.lerp(obj.x, target.x, p)
    obj.y = anim.lerp(obj.y, target.y, p)
end

表示中のときだけ追従する

local target = obj.getobject("routersys")
if target and target.exist then
    obj.x = target.x
    obj.y = target.y
end

発射時の座標に固定する

弾の発射フレーム(弾アイテムの開始フレーム)は timelineframe - frame で求まります。 そのフレーム時点の発射元座標を取得すれば、発射元が動いても原点は発射位置に固定されます。

local fire = timelineframe - frame
local src = obj.getobject("routersys", fire)
if src then
    obj.x = src.x
    obj.y = src.y
end

ピクセル操作

obj.getpixel / obj.setpixel / obj.getpixeldata は画像を直接読み書きします。 座標・チャンネル・アルファの扱いといった詳細は ピクセル操作 を参照してください。 ここでは関数の概要だけ示します。

関数戻り値説明
obj.getpixel(x, y)r, g, b, a指定座標のピクセルを取得(各成分 0 ~ 255)
obj.setpixel(x, y, r, g, b [, a])なし指定座標へ書き込み(a 既定 255)
obj.getpixeldata()プロキシ全ピクセルへ直接アクセスするプロキシを返す
obj.putpixeldata()なしAviUtl 互換用の空実装(呼ぶ必要はない)

obj.rand — 整数の安定した乱数

obj.rand(a, b [, seed [, frame]])ab の範囲の整数を返します (端点を含みます)。同じ seedframe の組では常に同じ値になります。 seed の既定値は 0、frame の既定値は現在フレームです。

関数戻り値用途
obj.rand(a, b)整数毎フレーム変わる乱数
obj.rand(a, b, seed)整数シードで固定。レイヤー番号などを渡す
obj.rand(a, b, seed, frame)整数フレームも固定して完全に決定的にする
小数を含む乱数や、ベクトル・色のゆらぎが欲しいときは anim.randanim.noise が便利です。obj.rand は整数を返す AviUtl 互換の乱数です。

obj.load — 図形・テキスト・画像・動画・シーン・模様の読み込み

obj.load(種類, ...) は、対象の画像バッファを生成した内容で置き換えます。 読み込み後は obj.w / obj.h などの寸法も更新されます。

呼び出し説明
obj.load("figure", name, color, size [, line [, aspect]])図形を生成。color0xRRGGBBsize は大きさ(px)、line は 0 以下で塗りつぶし・正で輪郭の太さ、aspect は -1.0 ~ 1.0
obj.load("text", str)文字列を描画。フォントは obj.setfont の設定を使う
obj.load("image", path)画像ファイルを読み込む
obj.load("movie", path [, time])動画の指定時刻のフレームを読み込む(既定は現在時刻)
obj.load("scene", name [, time])プロジェクト内の別シーンを指定時刻で描画して読み込む(既定は現在時刻)
obj.load("brush", name [, w, h])YMM4 の模様(ブラシ)で塗り潰した画像を読み込む(既定サイズは現在の obj.w / obj.h
"scene""brush" は AviUtl に存在しない YMM4 向けの独自拡張です。 シーン名と模様名には、それぞれ YMM4 のシーン一覧と模様一覧に表示される名前を指定します。 現在のオブジェクトが乗っているシーン自身は読み込めず、シーン描画の中からさらにシーンを読み込むこともできません。 シーンを読み込んだフレームは描画キャッシュを使わず毎回再実行されます。 模様はブラシプラグインで追加したものも使えますが、パラメータは既定値で描画されます。 パラメータを変更したいときは obj.brush を使います。

obj.brush — 模様のパラメータ指定付き描画

obj.brush(模様名 [, 幅, 高さ] [, パラメータ名, 値, ...]) は、YMM4 の模様(ブラシ)を パラメータ指定付きで描画してオブジェクトの画像を置き換えます。描画は obj.load("brush", ...) と同じで、 加えて obj.effect と同じ「名前と値の組」で模様のパラメータを変更できます。 AviUtl に存在しない YMM4 向けの独自拡張です。

引数説明
模様名模様一覧に表示される名前
幅, 高さ生成サイズ(px)。省略時は現在の obj.w / obj.h。両方を数値で並べたときだけサイズとして解釈する
パラメータ名, 値模様の設定項目の表示名または内部のプロパティ名と、その値の組。値は数値・真偽値・文字列で、色は 0xRRGGBB の数値
obj.brush("縞模様", "Angle", 45, "Color1", 0xff3366)
指定しなかったパラメータは既定値で描画されます。組をすべて省略した呼び出しは obj.load("brush") と同じです。

obj.load("figure", ...) で指定できる図形名は次のとおりです。

図形名前
円・楕円 / 楕円 / circle / ellipse
三角形三角形 / triangle
五角形五角形 / pentagon
六角形六角形 / hexagon
星形星形 / star
四角形上記以外の名前(既定)
obj.load("figure", "star", 0xFFCC00, 200, 0, 0)

obj.setfont — フォント設定

obj.setfont(name [, size [, type [, color]]]) は、続く obj.load("text", ...) で使う フォントを設定します。type はビットフラグで、ビット 0 が太字、ビット 1 が斜体です (太字+斜体は 3)。既定の大きさは 34、既定色は 0xFFFFFF です。

obj.setfont("Yu Gothic UI", 48, 1, 0xFFFFFF)
obj.load("text", "サンプル")

AviUtl 互換の描画・効果関数(上級)

次の関数は AviUtl のスクリプト制御に近い使い勝手で用意されています。 obj.effect は AviUtl/AviUtl2 のエフェクト名とパラメータ名で、対応する YMM4 の映像エフェクトを適用します。

関数説明
obj.effect(name, key1, val1, ...)AviUtl/AviUtl2 のエフェクト名で YMM4 の映像エフェクトを適用する。key, val の組は AviUtl のパラメータ名で指定し、互換マップを通じて YMM4 のプロパティへ変換される
obj.draw([ox, oy, oz, zoom, alpha, aspect])現在のバッファをオフセット・拡大率・不透明度を指定して描画する
obj.drawpoly(x0,y0,z0, x1,y1,z1, x2,y2,z2, x3,y3,z3 [, u0,v0, ... ,u3,v3] [, alpha])4 頂点のテクスチャ付きポリゴンを描画する。UV を省略すると画像全体を使う
obj.copybuffer(dst, src)バッファ間でコピーする。ID は obj(作業画像)・tmpcache:名前frm(コピー元のみ・仮想フレームバッファ)。書き込み先が obj のときのみ作業画像を置き換える
obj.pixelshader(name, target, resources [, constants, blend, sampler])スクリプト内に定義した HLSL のピクセルシェーダーを GPU で実行する。詳細は下記の「ピクセルシェーダー」を参照
obj.fill(r, g, b [, a, x, y, w, h])作業画像を指定色で塗りつぶす。色は 0〜255 のストレート RGBA。矩形を省略すると画像全体。YMM4 独自拡張
obj.getpixelregion(x, y, w, h)矩形領域の画素をストレート RGBA の配列(1 始まり・r,g,b,a の順)で取得する。YMM4 独自拡張
obj.putpixelregion(x, y, w, h, data)obj.getpixelregion と同じ並びの配列を矩形領域へ書き戻す。YMM4 独自拡張
obj.convolve(kernel, size [, divisor, offset])作業画像へ size×size の畳み込みを適用する(ぼかし・シャープ・輪郭抽出等)。YMM4 独自拡張
obj.resize(w, h [, filter])作業画像を指定サイズへ拡大縮小し、obj.wobj.h 等も更新する。filter"nearest" か省略で線形補間。YMM4 独自拡張
obj.setoption(name [, value])オプションを設定する。antialiasobj.draw で参照される。blendobj.drawobj.drawpoly の合成モードを番号で指定する。番号は下記の「合成モード」を参照。draw_state は真偽値で、true なら作業画像を出力し、false なら入力をそのまま通す。drawtargetobj.drawobj.drawpoly の描画先を "framebuffer""tempbuffer" で切り替える。詳細は下記の「描画先」を参照
obj.getoption(name)設定したオプションを取得する
obj.getvalue(name)obj の数値メンバーを名前で取得する
obj.getaudio(buf, file [, type, size])音声データを取得する。詳細は下記の「音声データ」を参照
obj.getinfo(name)各種の環境情報を名前で取得する。詳細は下記の「環境情報」を参照
obj.pixeloption(name [, value])ピクセル処理向けのオプションを設定する
obj.setanchor(name, count [, option, ...])プレビュー上にドラッグ可能なアンカーポイントを表示し、その座標を name の Lua 変数へ格納する。設置数を返す。詳細は下記の「アンカーポイント」を参照

合成モード

obj.setoption("blend", 番号)obj.drawobj.drawpoly の描画に合成モードを設定します。 番号は YMM4 のプロパティパネルにある「合成モード」のドロップダウンと並び順が同じで、0 から始まります。 範囲外の値や数値以外を指定したときは通常モードになります。

obj.setoption("blend", 3)
obj.draw()
番号合成モード
0通常
1ディザ合成
2比較(暗)
3乗算
4焼き込みカラー
5焼き込み(リニア)
6比較(明)
7スクリーン
8覆い焼きカラー
9覆い焼き(リニア) - 加算
10加算
11オーバーレイ
12ソフトライト
13ハードライト
14ビビッドライト
15リニアライト
16ピンライト
17ハードミックス
18差分
19除外
20減算
21除算
22色相
23彩度
24カラー
25輝度
26カラー比較(明)
27背景
28カラー比較(暗)
29削除
30背景でクリッピング
31重ならない部分のみ
32色反転マスク

描画先

obj.setoption("drawtarget", 先)obj.drawobj.drawpoly の描画先を切り替えます。 "framebuffer"(既定)ではフレームバッファへ合成します。 "tempbuffer" では作業用の tmp バッファへその場で合成します。 obj.setoption("drawtarget", "tempbuffer", w, h)w, htmp バッファを初期化するサイズで、省略すると初期化しません。 tmp へ描いた結果は obj.copybuffer("obj", "tmp") で作業画像へ戻せます。

tempbuffer への合成は通常(ソースオーバー)で、blendframebuffer への描画に適用されます。 描画先の切り替えは両エンジンで動きます。 MoonSharp では tempbuffer への合成を GPU で実行し、GPU を利用できない環境では CPU の合成へ自動的に切り替わります。 丸めの違いにより、合成の結果はエンジン間でごく僅かに異なることがあります。

obj.setoption("drawtarget", "tempbuffer", obj.w, obj.h)
obj.draw()
obj.setoption("drawtarget", "framebuffer")
obj.copybuffer("obj", "tmp")

ピクセルシェーダー

obj.pixelshader は、スクリプト内に AviUtl ExEdit2 と同じ記法で定義した HLSL のピクセルシェーダーを GPU で実行します。 シェーダーは --[[pixelshader@登録名: で始まる複数行コメントに記述し、登録名がエントリーポイントになります。

--[[pixelshader@ps:
Texture2D src : register(t0);
cbuffer constant0 : register(b0) { float strength; }
float4 ps(float4 pos : SV_Position) : SV_Target
{
    float4 c = src[uint2(floor(pos.xy))];
    return float4(c.rgb * strength, c.a);
}
]]
obj.pixelshader("ps", "object", "object", { obj.track0 / 100 })
引数説明
name定義したシェーダーの登録名。エントリーポイントの関数名と一致させる
target出力先のバッファ名。"object""tempbuffer""cache:名前""framebuffer" に対応する。"framebuffer" はシーンサイズの仮想フレームバッファへ描画し、結果でオブジェクト画像を置き換える
resources参照するバッファ名の配列で、シェーダーリソース t0t7 に設定される。1 つの場合は文字列で直接指定できる。"random" は 0.0~1.0 の乱数値の 256x256 領域(R32_FLOAT)になる。"framebuffer" はオブジェクトを現在位置に合成したシーンサイズの仮想フレームバッファになる
constants数値の配列で、定数バッファ(b0)へ float の配列として設定される
blend出力先への合成方法。"copy"(そのまま・既定)・"mask"(α値のみ乗算)・"draw"(アルファブレンド)・"add"(加算)に対応する。obj.setoption("blend", 番号) と同じ番号を数値で指定すると、シェーダーの出力を YMM4 の合成モードで出力先へ合成する
samplerSamplerStates0)の種別。"clip""clamp""loop""mirror""dot" に対応し、省略時は未設定になる

ピクセルシェーダーの入力は次のどちらかのシグネチャを使用できます。 uv は描画範囲が 0.0~1.0 になるように設定されます。

float4 名前(float4 pos : SV_Position) : SV_Target
float4 名前(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target

obj.pixelshader は両エンジンで動作し、シェーダーの実行自体はどちらのエンジンでもホスト側の GPU で行われます。 YMM4 は背景を参照できないため、"framebuffer" の初期内容は透明なシーンサイズ領域へオブジェクトを合成した仮想の画像です。 HLSL のコンパイルエラーはエディターの診断へ表示されます。 GPU を利用できない環境では呼び出しはスキップされ、画像は変化しません。

画像加工(YMM4 独自拡張)

obj.fillobj.getpixelregionobj.putpixelregionobj.convolveobj.resize は、作業画像を直接加工する YMM4 独自の関数です。 色は obj.getpixelobj.setpixel と同じ 0〜255 のストレート RGBA で扱い、いずれも従来エンジンと高速ランタイムの両方で動作します。

obj.getpixelregion(x, y, w, h) は矩形領域の画素を長さ w*h*4 の配列で返します。並びは画素ごとに r, g, b, a で、索引は (行*w+列)*4+1 から始まります。範囲外の画素は 0,0,0,0 です。 obj.putpixelregion は同じ並びの配列を書き戻し、画像の範囲外へはみ出した画素は書き込みません。

-- 左右反転
local w, h = obj.w, obj.h
local src = obj.getpixelregion(0, 0, w, h)
local dst = {}
for y = 0, h - 1 do
  for x = 0, w - 1 do
    local s = (y * w + (w - 1 - x)) * 4
    local d = (y * w + x) * 4
    for c = 1, 4 do dst[d + c] = src[s + c] end
  end
end
obj.putpixelregion(0, 0, w, h, dst)

obj.convolve(kernel, size [, divisor, offset])size×size の畳み込みを適用します。kernel は行優先で 1 始まりの係数配列、size は奇数です。divisor を省略するとカーネルの合計(合計が 0 のときは 1)で割ります。offset は除算後に各成分へ加算します。端の画素は最も近い画素で補い、r, g, b, a すべてに適用されます。

obj.convolve({ 1,1,1, 1,1,1, 1,1,1 }, 3)          -- 平均ぼかし
obj.convolve({ 0,-1,0, -1,5,-1, 0,-1,0 }, 3)      -- シャープ
obj.convolve({ -1,-1,-1, -1,8,-1, -1,-1,-1 }, 3, 1, 0)  -- 輪郭抽出

obj.resize(w, h [, filter]) は作業画像を指定サイズへ拡大縮小し、obj.wobj.hobj.cx などの寸法も更新します。filter"nearest"(最近傍)か、省略で線形補間です。高速ランタイムでは結果が最大画像サイズを超える場合は変更しません。

obj.fillobj.convolveobj.resize は、処理量がしきい値以上で GPU の結果が CPU と一致すると確認できたとき、自動で GPU へ委譲します。呼び出しの直前(単独行でも同一行でも可)に [fast] を置くと、このしきい値を無視して強制的に GPU へ委譲します。GPU が使えない環境や GPU の結果が CPU と一致しない環境では、[fast] を付けても CPU へ自動的に戻ります。処理量が小さいときは、GPU への委譲自体の往復コストが CPU 実行を上回ることがあり、[fast] を付けるとかえって遅くなる場合があります。詳細は 拡張構文 を参照してください。

アンカーポイント

obj.setanchor(name, count [, option, ...]) は、プレビュー上にドラッグ可能なアンカーポイントを表示します。 ドラッグで調整した座標はプロジェクトへ保存され、name で指定した Lua 変数へ格納されます。 変数は pos={x0,y0,x1,y1,…} の並びで、"xyz" を指定すると {x0,y0,z0,x1,y1,z1,…} になります。 座標はオブジェクトの中心が原点です。個数は最大 32 個です。

オプション意味
"line"アンカーポイントを線で結ぶ
"loop"アンカーポイントを線で結び一周させる
"star"各アンカーポイントとオブジェクトの中心を線で結ぶ
"arm"オブジェクトの中心から各アンカーポイントへ順に線で結ぶ
"xyz"アンカーポイントを 3D 座標で扱う。既定は 2D

戻り値は設置したアンカーポイントの数です。両エンジンで動きます。 name"track" を指定した場合も対応し、個数 0 は 1 個として設置します。選択中のアンカーは「アンカー」グループの X / Y / Z スライダーで数値調整できます。

num = obj.track0
obj.setanchor("pos", num, "loop")
for i = 0, num - 1 do
  obj.draw(pos[i * 2 + 1], pos[i * 2 + 2])
end

音声データ

obj.getaudio(buf, file [, type, size]) は音声データを取得します。 buf に渡したテーブルの buf[1]buf[n] へデータを格納し、取得したデータ数とサンプリングレートを返します。 bufnil を渡すと、テーブルを 3 番目の戻り値として返します。 file には音声ファイルのパスを指定します。"audiobuffer" を指定すると、編集中のシーン全体の音声(タイムライン上の全アイテムを合成した音声)を取得します。 YMM4 独自の拡張として "itembuffer" も指定でき、このエフェクトを付けたアイテム自身の音声(音量・パン・フェード・音声エフェクト適用後)を取得します。

type内容
"pcm"16bit スケール基準(-32768~32767)のモノラル PCM
"spectrum"周波数帯ごとの音量データ(0~32768 目安)。size は分割する帯域の数で、最大 512、省略時は 32
"fourier"離散フーリエ変換の振幅データ(0.0~1.0 目安)。周波数範囲は 1/2048~1/2 で、省略時は 1024 個
"xxxx.l" / "xxxx.r"上記種別の左 / 右チャンネル版。無指定のときは左右の平均

読み取り位置は、"audiobuffer" はタイムラインの現在の再生位置、それ以外はオブジェクトの現在の再生位置(obj.time)です。 "pcm" は現在位置から連続したサンプルを返し、"spectrum""fourier" は現在位置からの区間を解析して返します。 1 回で取得できるデータ数は最大 1024 個で、取得できた数が指定より少ないことがあります。 取得できない場合はデータ数 0 を返し、エラーにはなりません。両エンジンで動きます。 "itembuffer" は音声を持たないアイテム(画像や図形等)ではデータ数 0 になります。

local buf = {}
local n = obj.getaudio(buf, "audiobuffer", "spectrum", 32)
for i = 1, n do
  obj.draw((i - n / 2) * 8, -buf[i] / 200)
end

環境情報

obj.getinfo(name) は、name で指定した環境情報を返します。対応していない名前を指定したときは nil を返します。 "image_max" は幅と高さの2値を返し、"bpm" はテンポと拍子と基準時間の3値を返します。両エンジンで動きます。

name戻り値
"script_path"プラグインの設置フォルダのパスを返す。末尾には区切り文字が付く
"filter"フィルタ効果として処理中かどうかを返す。本プラグインでは常に true になる
"saving"動画を出力中のときだけ true を返す
"image_max"最大画像サイズを幅と高さで返す
"bpm"BPMグリッドのテンポと拍子と基準時間を返す。基準時間の単位は秒とする。BPMグリッドを設定していないときはテンポが 0 になる
"clock"YMM4の起動からの経過時間を秒で返す
"script_time"スクリプトの実行開始からの経過時間をミリ秒で返す
"version"本体のバージョンを major×10000+minor×100+build の数値で返す
if obj.getinfo("saving") == false then
  obj.drawpoly(-100,-100,0, 100,-100,0, 100,100,0, -100,100,0)
end

互換マップ

obj.effect は二段階で解決します。 まず互換マップを参照し、AviUtl/AviUtl2 の名前として宣言したエフェクトは、 パラメータ名の対応と値の変換を経て YMM4 のプロパティへ反映します。 互換マップに宣言が無い名前は、YMM4 のエフェクト名やキーワードでそのまま解決します。 たとえば ウェーブクリッピング のように、YMM4 やコミュニティのエフェクトを 名前で呼ぶ使い方もそのまま動きます。

互換マップでは、パラメータの値を AviUtl と同じ尺度で渡すと、 マップに定義した倍率とオフセットの変換を経て、YMM4 のプロパティへ反映します。 たとえば ぼかし範囲 は YMM4 の Blur へ 0.5 倍で対応し、 AviUtl と同じ見た目になります。 この互換マップは、YMM4 自身が AviUtl の .exo へ書き出す変換を逆向きにたどって作っているため、 往復しても結果が一致します。

対象のエンジンは指定子 --!aviutl または --!aviutl2 で切り替えます。 指定子を書かないときは --!aviutl として扱います。 各エントリは対応するエンジンを AviUtl・AviUtl2・両方のいずれかとして保持し、 対象に一致するエントリだけを解決します。

--!aviutl
obj.effect("ぼかし", "範囲", 20)
obj.effect("方向ブラー", "範囲", 16, "角度", 45)

現在マップが宣言している AviUtl のエフェクト名は次のとおりです。

エフェクト名主なパラメータ
ぼかし範囲, サイズ固定
境界ぼかし範囲
方向ブラー範囲, 角度, サイズ固定
放射ブラー範囲, X, Y, サイズを固定
閃光範囲, X, Y, サイズを固定
クロマキー色相範囲, 境界補正
クリッピング上, 下, 左, 右, 中心の位置を変更
斜めクリッピング中心X, 中心Y, 角度, ぼかし, 幅
領域拡張上, 下, 左, 右
座標X, Y, Z
回転X, Y, Z
リサイズ拡大率, X, Y, 補間なし
画像ループ横回数, 縦回数
極座標変換中心幅, 渦巻
グラデーション強さ, 中心X, 中心Y, 角度, 幅
単色化強さ, 輝度を保持する
縁取りサイズ, ぼかし
反転
モザイクサイズ
ディスプレイスメントマップぼかし
動画ファイル合成X, Y, 拡大率
色調補正明るさ, コントラスト, 色相, 輝度, 彩度
色ずれずれ幅, 角度, 強さ
対象のエフェクトが YMM4 やコミュニティプラグインに読み込まれていないとき、または適用に失敗したときは、 そのフレームでは元の映像をそのまま使います。このときログへ警告を一度だけ出します。 色調補正色ずれ はコミュニティプラグインのエフェクトに対応します。
← obj オブジェクト anim ライブラリ →