制作日記: 年末年始

2017/12 ~ 2018/01 上旬の作業記録。

年末からリギングの動画とトポロジの写経という沼に落ちています(現在進行系

やったこと

リギングの勉強

Sergio Mucinoさんの教則動画「Character Rigging Course」で引き続き勉強中です。

▼ Episode30までで学んだこと

  • ガイド用のリグの作成
  • メインとなるリグの作成
  • IK/FK リグとコントローラ作成
  • IK/FK ブレンディング
  • 鎖骨とか足の凝ったリグ作成
  • 首・腕・背骨のねじれ用リグ作成
  • リグのモジュール化

Episode64のうち30が終了。約17時間。

前まではリグというと、ボーン一組とIKゴールがいくつかあるだけみたいなイメージだったので、アニメーション用の様々なコントローラを用意したり、ノードでジョイントの連動や制限を行ったり、モジュール化を行って再利用しやすくしたり、やることのすべてが目新しくて勉強になります。小難しいことを抜きにして一言で一番の大きな成長点を挙げるなら、スケマティックへの恐怖心がなくなったことです。

f:id:cignoir:20180117012036p:plain:w300

こんな感じで一見いい感じに出来てきたなぁと思ってたんですが、ガイドのジョイントの位置がずれてたり、回転軸が関節の曲がる方向と違ったり、IKとFKを切り替えたときにジョイントが大幅にずれたり、色々と細かいところで崩れていました。コンストレイントが張り巡らされているために修正がなかなか面倒だったので最終的に、作ったロケータを流用しつつまたEp1からやり直すことにしました(3回目

動画を追うことに必死になって確認しないといけないポイントを見ることができていなかったので次こそは!

トポロジの写経

少し前にtwitterで「このCMで使われてるローポリモデル風のワイヤーフレームモデラーから見ると気持ち悪い!」みたいなツイートが流れてきてたのでその画像を見たんですが、自分の能力不足で何が気持ち悪いかわからなかったんですよね。むしろ自分が作るトポロジより綺麗に感じましたw

こういう美的センスは「良いモノ」にたくさん触れることで培われるだろうと思い、トポロジの勉強になるような何かを探していたところArtStationで素敵な投稿が見つかったので、トポロジをパク……写経(模写)することにしました。リギング動画がそろそろスキニングの作業に入っていく流れだったのでその前に作業用のモデルを見直したかったというのも理由の一つです。

https://www.artstation.com/artwork/eNq43

素晴らしいですね。素晴らしいと思うんですけど、今の自分には何がどう素晴らしいのか力不足でちゃんと認識出来てないんだろうと思います。本当はもうちょっとポリゴン数が少ない方がわかりやすくていいんですが、ローポリはそれはそれでチューニングされすぎて思考の跡が省略されてたりするのでやるならとことんやるかと思い、お手本そのままの解像度で素体にポリゴンを貼り直してみてます。

f:id:cignoir:20180117013442p:plain:w300

f:id:cignoir:20180117013452p:plain:w300

ZOZO SUITできた

実際に手を動かしてやってみると、やっぱり単純なコピー作業にはならなくて、「あれ枚数が狂ってる?どこで間違えた?試しにループ選択してみよう。螺旋状に想定外の大量のポリゴンが選択された!逆に要点のループをちゃんと抑えておけばループの間はブリッジで埋めればそれなりにみえる。画像でここは確認できないから推測しないと」みたいな試行錯誤を繰り返していました。

過去に見かけた「エッジループやポリゴンループが大事だよ」「ZRemesher(ZBrushの自動リトポ)するときは螺旋が出来ないようにしないとつらいよ」という先人の言葉の意図が今までよくわかってませんでしたが、やっと点と点が繋がってきた気がします。

  • よく修正しそうな場所のループ選択がしやすい
  • ループが螺旋になっておらず閉じている
  • 人体の流れに沿っている

とりあえずこの3つがちゃんと出来ていればマシなトポロジになるのではないかなぁと思いました。ループ選択がしやすいと部分的な修正がやりやすいし、ループが閉じていることで修正の影響範囲を小さく出来ますし、人体の流れに沿っているとアニメーションで破綻しにくくなるのかなぁというあたりが理由です。

リギング動画は大きな手戻りも発生していてまだまだ先が長いですが、FacialRigを組むのを楽しみに頑張ります。それではまたしばらく沼へ。

そういえば明けましておめでとうございます。今年もよろしくお願いします!

制作日記: テキスト起こしの続き/字幕化

昨日、GCPのSpeech APIを使用して、動画の音声をテキストに起こしましたが、csvから字幕用のsrt形式に変換することで動画と一緒に再生することが出来ましたのでメモを残しておきます。

f:id:cignoir:20171202013904p:plain:w300

フォーマット変換

  • 昨日吐き出した変換前 csv ※srtへの変換スクリプトは長いので最後に載せておきます。
00:22:33,00:23:44,Hello
00:24:10,00:24:15,Fuck
  • 変換後 srt
1
00:22:33,000 --> 00:23:44,000
Hello

2
00:24:10,000 --> 00:24:15,000
Fuck

字幕対応のプレイヤーで再生

VLC Media Playerの例

f:id:cignoir:20171202014418p:plain:w300

メニューから変換後のsrtファイルを読み込むだけです。 設定画面から字幕位置やフォントの変更なども出来ます。

f:id:cignoir:20171202014544p:plain:w300

srt変換 rubyスクリプト

require 'csv'

dir_path = 'D:\result\\'

def wrap(s, width = 80)
  s.gsub(/(.{1,#{width}})(\s+|\Z)/, "\\1\n")
end

csv_files = Dir.entries(dir_path).select{ |filename| filename.end_with?('.csv') }
csv_files.each do |file|
  blocks = []

  csv = CSV.read(dir_path + file, headers: false)
  csv.each_with_index do |row, index|
    start_time = row[0]
    end_time = row[1]
    body = row[2].strip

    block = <<"EOS"
#{index + 1}
#{start_time},000 --> #{end_time},000
#{wrap(body, 120)}
EOS
    blocks << block
  end

  srt = blocks.join
  File.binwrite(dir_path + file.split('.').first.gsub('audio_', '') + '.srt', srt)
end

約35時間分の動画の非同期音声認識にかかった料金

f:id:cignoir:20171202024811p:plain:w300

4327円

登録時のおまけのクレジットで余裕で支払うことができます。

制作日記: 動画でRiggingのお勉強

f:id:cignoir:20171201011020p:plain:w300

ちょっと前から上のジーナさんモデルを作っていて、ACSでリギングを行っていたのですが、独自のボーンを追加したいときはどうすれば……フェイシャルリグってどう組めばいいんだ……と、標準機能の知識が不足しすぎてて迷走していました。

そんな中、コメントで Character Rigging Course というチュートリアル動画(有料・35時間)が勉強になると教えていただきました。英語の文章は少しわかるのですが、動画となると自信ないなぁと思いつつ思い切って購入してみました。現在、35時間中の6時間分ほど見終わったのですがもう本当に目から鱗がぽろぽろ落ちる感じです。ヒアリングはあまり出来ないので操作を真似して盗むスタイルの勉強になるのですが、それでも十分といっていいほど勉強になってます。

ただ、やっぱり解説とかが聞き取れないのはもったいないなぁと思い始め、 GoogleCloudPlatform(GCP) の Speech API を利用しての自動テキスト起こしを試してみました。

twitterでのしげぽんさんとの会話で思いつきました💡

下準備

動画から音声ファイル抽出

GCP 関連

GCP のことはよくわかっていないので他のサイト様の解説におまかせします。本当は今日発表された AWS の Transcribe を試したかったんですが申請が必要だったので……

音声認識スクリプト実行

必要な情報

  • プロジェクトID
  • 認証情報(json)のファイルパス
    • サービスアカウント作成時にダウンロードしたファイル
  • 音声ファイルのCloudStorage上のパス(gs://~)

gem インストール

$ gem install google-cloud-speech

スクリプト

require "google/cloud/speech"
require 'csv'

# 音声認識結果の整形用(適当
class Google::Cloud::Speech::Result
  def start_time
    Time.at(@words.first.start_time).utc.strftime('%X')
  end

  def end_time
    Time.at(@words.last.end_time).utc.strftime('%X')
  end

  def simplify
    [start_time, end_time, @transcript]
  end
end

project_id = "***" # プロジェクトID
credentials = "/path/to/credentials.json" # 認証情報のファイルパス
src_audio_file = "gs://~" # CloudStorage上の音声ファイルパス
dst_csv_file = "result.csv" # CSV出力ファイルパス
encoding = :flac # 音声ファイルの形式
language = "en-US" # 音声の言語

speech = Google::Cloud::Speech.new(project_id: project_id, credentials: credentials)
audio = speech.audio(src_audio_file, encoding: encoding, language: language)

response = audio.process(words: true)
response.wait_until_done!

result = response.results.map(&:simplify)

CSV.open dst_csv_file, "w" do |csv|
  result.each{ |row| csv << row }
end

結果

こんな感じで概ねうまく認識出来ていました。非同期の音声認識をやってる人やRubyの例が少なかったので参考になれば幸いです。料金は見積もりが間違っていなければ35時間分の動画で$50ぐらいみたいです。メリットを考えたら全然安いですね。

師走

年内は動画のお勉強で終わりそうです。ジーナさんの続きの制作は年明けになると思いますが成果を発揮できるように勉強を頑張ります。

制作日記: 妲己

f:id:cignoir:20171024010715p:plain:w400

原作ファンの方すみませんすみません、モンストの獣神化妲己の二次創作です。

今回は本当に色々と学びが多くて大きく成長出来たと思うし、いつにも増して楽しい制作となりました!

出来たこと

  • 比較的短い制作期間
    • 平日3時間 * 14日ほど。今までは最低2ヶ月ぐらいかかってた。
  • テクスチャの手塗りに挑戦
  • 厚みのある髪のワークフローが自分の中で整理出来てきた

出来なかったこと

  • 表情付け
  • 口内・舌
  • 炎や煙のいい感じのエフェクト
  • 狐の制作
    • 動物の制作経験がないので是非リベンジしたい

あとは、イラストに近づけようとするほど、魅力を引き出す力が圧倒的に不足していることも感じました。精進します。

次に頑張ること

表情作り。

簡単な1つのモーフマップを使用した表情作りは出来るのですが、複数連携させるフェイシャルリグでやりたいです。やり方がさっぱりなので調べるところから地道にやっていこうと思います。

習作: #ハロウィン

f:id:cignoir:20171006013226p:plain:w400

もうすぐハロウィンということで、2,3週間前からお題をもとに制作に取り組んでみました。3Dモデルを用いた絵作り自体をまともにやったことがなかったため、いろんな困難を体験することが出来て勉強になりました。

言葉で説明するのが難しいのですが、今までは造形面しか見えてなかったんですが、光と影を操るライティングの重要性を今回初めて認識しました。

  • 色や質感について掘り下げる
  • 髪のワークフロー整理
  • スキニングの問題を解決するべく素体新調

課題が無限に噴出しますが、ざっくりここらへんに取り組んで、次作で成果が出せればと思います。

制作日記: SyFlex for Modo を触る

髪とスカートの物理シミュレーションは自分の環境や用途で出来るのだろうか、出来るにしても出来ないにしてもそれらを知った上でセットアップ作業をするのが段取りが良いだろうということでソフトボディとSyFlexを触ってみました。

ソフトボディ

SyFlex for Modo

クロスシミュレータ界(?)で有名らしいプラグインModoにも対応してるみたいだったので試してみました。金額は$200 ぐらいです。まずはスカートをクロスに設定するためにAddClothし、身体にCollideMeshを設定していきました。しかし、何度やっても身体がスカートを突き破ってしまい、丸一日設定をいじって調整してたんですが、うまくいかず。最終的に原因は設定ではなく、ローポリすぎたことだとわかりました。動作が重いイメージがあったのでポリゴン数減らしていたのがまずかったようです。CollideMeshの仕様や形状が可視化されていればもっと早く原因を特定出来た気がしますがまぁ盲点でした……

スカートを再分割してやり直すとデフォルトの設定ですんなり動いてくれました!

Pinのテスト

www.youtube.com

クロスシミュレータならではの美しいドレープを作ることができました。これだけで結構感動的です。スカートを手でつまむ挙動はスカートのつまむ部分に設定したPinに手を触れさせて無理矢理吸着させています。ただし、これだと手以外の部分(手首など)がスカートに触れてもそことスカートのPinが吸着してしまったり、太ももにくっついてしまったり色々な問題があります。

Nailのテスト

www.youtube.com

Pinの問題を解決するために、Nailを使用してみました。Nailを使うことでスカートの一部を空間に固定し、それをロケータと連動させ、Pinでやったのと同様の動作を実現できました。こちらの方が色んな用途に使いやすそうです。ついでにこれらの作業をやる過程で、ACSのバインドメッシュに後からメッシュを追加してウェイトを手付けで設定する方法を学び、ビスチェを身体に含めました。

髪にも適用してみる

スカートとは別に髪にもClothを追加して試してみました。

www.youtube.com

お、惜しい。

身体との衝突の挙動や動きは良い感じなんですが、髪同士が雑に絡まっています。おそらく自己のメッシュとの衝突を考慮しないといけない気がするので、後日その線で調査してみます。

f:id:cignoir:20170821015937p:plain:w300

しかしこの、雑に髪をふわっとした状態を作る用途だけでも便利そうな気がしますね。SyFlexすごい。

制作日記: MODOのACSで追加で衣服をバインドしたい

前回までCharacterBoxでセットアップを行っていましたが、ACSを用いたセットアップも試してみました。裸の状態でバインドしうまくセットアップ出来たのですが、最近バストアップの静止画を撮影したいと思うことが増えたのでそろそろ服を着せたいと思い、既存のバインドメッシュに新しいメッシュを追加する方法を調べていたところ、2013年頃フォーラムにてACS開発者のLukaszさんが下のように回答しているのを見つけました。

Clothed character in ACS
https://community.foundry.com/discuss/topic/77748

要約すると

  • ACSが1つのバインドメッシュしか扱えないこと
  • 複数のレイヤーにわけて作業を行い、最後に一つのメッシュレイヤーにまとめる必要があること
  • 面倒だけど最初に身体だけウェイトを設定し、ウェイト調整ツールで衣服に身体と同じウェイト値を設定するとうまくいくという提案

上のようなこと書いてあり、諦めて1つのメッシュにまとめてからバインドするかと思ってたんですが、2016年頃の別の投稿を見つけました。投稿者は同じくLukaszさんです。関連部分のみ意訳した文章を載せておきます。

New to ACS a couple of questions
http://community.foundry.com/discuss/topic/120397

(意訳)

衣服のウェイトは分けて設定することができます。
衣服に本体と同じウェイトマップ名を使用しているという条件で、
メインのACSバインドメッシュに衣服のメッシュをコピー&ペーストすればうまくいくでしょう。
私はモデリング時は衣服のメッシュを分けて管理し、最後にACSバインドメッシュレイヤーにコピー&ペーストします。

もし衣服がボディラインにぴったりと追従する場合は、最初に本体と一緒にバインドしてから、
バインドされたジオメトリを新しいメッシュレイヤーにコピー&ペーストし、
それを衣服としてモデリングし、バインドメッシュのレイヤーにコピー&ペーストして戻すということも出来るでしょう。

本体同様に衣服を変形させるための別のスケルトンは必要ないと思います。
MODOではひとつのデフォーマで複数のメッシュを駆動できますので、
別々の衣服のメッシュを直接デフォーマに接続する方がおそらく簡単です。
別々のメッシュレイヤーに衣服メッシュを保持したい場合はこの方法でやります。
衣服に影響を与えるすべてのデフォーマに衣服のメッシュを接続するだけです。

身体本体と同じウェイトマップ名を使用していれば、一つのデフォーマで複数の別レイヤーのメッシュを動かせる、らしいです。文中のコピペの操作がどういう操作かいまいちわからなかったんですがやるべきことはわかったので試しにやってみました。MODO歴まだ3ヶ月ぐらいの初心者なので見当はずれのことを書いてしまっている可能性がありますので間違ってたらごめんなさい。もし何かあればご指摘いただけるとありがたいです。

環境

下準備

現在、身体だけをバインドした状態です。ここから胸部のボーンに肩紐が追従するように設定してみます。

f:id:cignoir:20170812004737p:plain:w300

ウェイトマップ作成

1. 肩紐用ウェイトマップ作成

ACSがChestのボーンに自動で設定したウェイトマップ名と同じ名前で、肩紐のメッシュレイヤーに新規ウェイトマップを作成します。 キャラクタ名に「Doll」と付けていたので「Doll__Chest (Bind)」となっていました。

f:id:cignoir:20170812004822p:plain:w300

2. 肩紐メッシュのプロパティでウェイトマップに新規作成したマップが設定されていることを確認

f:id:cignoir:20170812004844p:plain:w300

3. ウェイト調整ツールで適当にウェイトを設定

f:id:cignoir:20170812004908p:plain:w300

4. Chestのデフォーマ(Influence)に肩紐メッシュを関連付け

f:id:cignoir:20170812004949p:plain:w300

スケマティックビューで見るとこういう状態です。

f:id:cignoir:20170812005051p:plain:w300

5. ACSの胸部のコントローラを動かして確認

f:id:cignoir:20170812005118p:plain:w300

ちょっとわかりにくいですが、身体と一緒に別メッシュレイヤーにある肩紐が動かすことができました。

ただし、今回はメッシュとデフォーマとボーン(ロケータ)がすべての1つずつのケースだったのでうまくいきましたが、複数のボーンの影響をうけるメッシュをうまく設定出来るのか疑問です。1つのデフォーマに複数のメッシュを関連付けたところで、メッシュには1つのウェイトマップしか設定出来ない(?)からです。こちらは何かわかったら追記しておきます。

おまけ

X座標が負の頂点を選択するスクリプトをTD SDKで書き直しました。eval祭りな実装よりはるかにシンプルに記述出来て拡張もしやすいし便利。

import modo

with modo.Mesh().geometry as geo:
    for v in geo.vertices:
        if v.position[0] < 0:
            v.select()