ごちゃまぜドロップスでLive2Dモデルを投げ込めるようにしよう
AviUtlには、神プラグインとしてoovさん作のごちゃまぜドロップスが挙げられます!
基本的な機能としてブラウザからテキスト、画像をドラッグ&ドロップなどなどあります。
更にLuaで独自の処理を作ることでドラッグ&ドロップに対応できるファイルを増やせます!
(正しくは「.exo」オブジェクトファイルを自動作成し読み込めるようにしているだけです)
で‥
今回はごちゃまぜドロップスにLive2D Drawer for Aviutlで扱えるファイルのドラッグ&ドロップ対応してみたいと思います。
Live2D Drawer for AviutlとはAviUtl上でLive2Dモデルを操作、レタリングできるプラグインです!
Live2Dとは超噛み砕いて説明するとイラストを立体的に動かす技術です。Vtuberの2Dアバターとしても主流ですね。
詳しくは、「」こちらを確認してください!(2回目) 説明部分とか特別複雑なところはないので完成品はこちら「」 以下の画像が今回作ったものサンプル画像です。
https://scrapbox.io/files/63959970d97e0f001d10815c.png
中身の説明に入るんですが、基本的にはごちゃまぜドロップスのPSDとWAVを読み込むやつを真似しただけです。
Live2Dモデルを読み込むには、model3.jsonファイルを指定する必要があります。
なので「model3.json」で引っかかるようにします。
今回は上手く作れなかったので文字数で無理やり切り取って確認してます。
code:lua
-- 実行優先度数が大きいほど優先されます
P.priority = 1000
function P.ondragenter(files, state)
for i, v in ipairs(files) do
-- 後ろから11文字目から切り取って小文字に修正
local ext = v.filepath:sub(-11):lower()
if ext == "model3.json" then
-- print関数はpatch.aulのコンソールでの動作確認用
print("Live2d")
print(ext)
-- ファイルの拡張子が model3.json のファイルがあったら処理できそうなので true
return true
end
end
return false
end
function P.ondragover(files, state)
-- ドラッグしたまま、拡張編集ウィンドウ上でマウスが動く度に呼ばれます。
return true
end
function P.ondragleave()
-- ドラッグしているマウスカーソルが拡張編集ウィンドウ上から離れた時や、ドラッグ自体が中断された時に呼ばれます
end
ファイルが読み込めそうなので「.exo」オブジェクトファイルを作成します。
code:Lua
function P.encodelua(s)
s = GCMZDrops.convertencoding(s, "sjis", "utf8")
s = GCMZDrops.encodeluastring(s)
s = GCMZDrops.convertencoding(s, "utf8", "sjis")
return s
end
function P.ondrop(files, state)
print("ondrop:")
dropflag = false
-- プロジェクト情報を取得
local proj = GCMZDrops.getexeditfileinfo()
-- 言語情報を取得
local jp = not GCMZDrops.englishpatched()
-- プロジェクト情報をセット
local exo = [[
width=]] .. proj.width .. "\r\n" .. [[
height=]] .. proj.height .. "\r\n" .. [[
rate=]] .. proj.rate .. "\r\n" .. [[
scale=]] .. proj.scale .. "\r\n" .. [[
length=64
audio_rate=]] .. proj.audio_rate .. "\r\n" .. [[
audio_ch=]] .. proj.audio_ch .. "\r\n"
-- 複数ファイルをドロップされたときに繰り返し処理する
for i, v in ipairs(files) do
-- 0から数えていく
objectCount = i-1
local ext = v.filepath:sub(-11):lower()
if ext == "model3.json" then
dropflag = true
-- ファイルの拡張子が json のファイルがあったら処理できそうなので
local filepath = v.filepath
-- ファイルを直接読み込む代わりに exo ファイルを組み立てる
math.randomseed(os.time())
exo = exo .. [[
[]] .. objectCount .. [[]
start=1
end=64
layer=1
overlay=1
group=2
camera=0
[]] .. objectCount .. [.0 _name=]] .. (jp and カスタムオブジェクト or Custom object) .. "\r\n" .. [[
track0=0.00
track1=0.00
track2=0.00
track3=0.00
check0=0
type=0
filter=0
name=Live2Dモデル登録@Live2d
-- ファイルパスをsjifでセットするため変換
param=file=]] .. P.encodelua(filepath) .. "\r\n" .. [[
[]] .. objectCount .. [.1 _name=]] .. (jp and 標準描画 or Standard drawing) .. "\r\n" .. [[
X=0.0
Y=0.0
Z=0.0
]] .. (jp and 拡大率 or Zoom%) .. [[=100.00
]] .. (jp and 透明度 or Clearness) .. [[=0.0
]] .. (jp and 回転\ or Rotation) .. [[=0.00
blend=0]]
end
これを応用すればSVGファイルを投げられたら。oovさんのbrowserで表示したりなどできます!(後で作る予定)
可能性が無限大ですね!!!
最後に…とりあえず動くものを記事にした感じなので…複数ファイルドラッグ&ドロップ対応できてなかったり。英語版に対応しきってなかったり…