TVMLチュートリアル May, 2016 1
チュートリアル これ以降は、実際にTVMLを入力して、再生して試す、チュートリアルです。 これは、http://tvmllab.comのダウンロードページからTVML Player Ver1.2.2をダウンロードして、それを使ってください。
TVMLの概要
TVMLとは? TV program Making Language の略 TVMLの台本:例 character: openmodel( model=modelA, filename=Characters/maiko/maiko) character: casting( name=A, model=modelA ) character: setvoice(name=A, voicetype=VoiceSommelier:Voice07) character: visible( name=A, switch=on ) TV program Making Language の略 テレビ番組を1本のテキストに記述できるテキストベースの言語 TVMLプレイヤーで即座に再生することが出来る ワープロなどでTVMLで台本を書くだけで、自分だけのテレビ番組を作れる TVMLプレイヤーには、番組作りに必要な要素が備わっている
TVMLプレイヤー TVMLの台本を読み込み、リアルタイムで番組を作り出すソフト
台本(スクリプト)の読み込みと実行 実行 ファイル選択 台本はどこに置いてもよい
TVMLの例 camera: closeup ( target=Bob ) CGキャラクタBobにカメラをクローズアップし「こんにちは」と言わせる camera: closeup ( target=Bob ) character: talk ( name=Bob, text = ”こんにちは” ) ・TVML はイベント駆動 ・上から順に実行 ・プログラミング言語ではない
TVMLのイベント書式 character: talk ( name = Bob, text = "Hello" ) イベントタイプ コマンド パラメータ character camera set prop light movie super drawing sound cgenv コマンド実行に必要な情報を記述 ・イベントの無いコマンドのみの「ダイレクトコマンド」がいくつかある 例: wait ( time=3.0 ) setcaption ( border=on )
オフィシャル版TVML言語仕様 TVML言語仕様Version 3.1 http://wjis76df.sakura.ne.jp/t2vlab/spec/tvmlspec31/ 9
TVMLの諸規則 camera: ( name = CamA, x=5.0, vangle=60.0 ) ・パラメータは順不同 ・パラメータを省略するとデフォルト値が採用される ・必須パラメータは必ず指定する ・コメントアウトは、// または /* */ が使える ・改行で区切られた一行がひとつのイベントに対応する(途中で改行を入れてはいけない)
TVML on Unityの座標系 y x z y z x 左手系です y z x 同じ y z こう考えた方が分かりやすい zが手前向き、xが左 x
TVML on Unityの回転系 左回り(反時計回り)です y 正の方向 x z
キャラクターの表示と動作
カメラの配置 x z camera:position(name=CamA, x=0.0, y=1.0, z=2.0, ry=180) camera:switch(name=CamA) キャラは基本z軸の方を向いている x カメラを180度回転させてキャラを捉えている 上面図 z
キャラクタの表示 スライドでは見やすさのために改行しているが、文の途中に改行コードを入れてはいけない character: openmodel( model=maiko , filename="Characters\maiko\maiko") character: casting( name=A, model=maiko ) character: setvoice(name=A , voicetype=VoiceSommelier:voice07) character: position(name=A, x=0.0, y=0.0, z=0.0) character: visible( name=A, switch=on )
照明の配置 light:ambient(name=LA, r=1.0, g=1.0, b=1.0) light:point(name=LP, x=0, y=1, z=1) light:point(name=LP, x=0, y=1, z=1) light:spot(name=LS, x=0.2, y=1, z=0.2 ,vx=-1, vy=-1, vz=-1)
セットの配置 set:openmodel( name=Set , filename="Setprops/RankingSet_cyber/cyberspace") set:position(name=Set, x=0, y=0, z=0)
キャラクターを喋らせる character: talk( name=A, text=“ひろめです” , caption=“ヒロメです")
キャラクターを動かす - 1 ・おじぎ character: action(name=A, action=bow) ・手を振らせる character: action(name=A, action=handwave) ・目を輝かせる character: action(name=A, action=brilliant) Character:action( )でどういうアクションが定義されているかはキャラクタごとに異なる (UnityのAssetsでキャラクタにあらかじめアタッチされているアニメーションが使える)
キャラクターを動かす - 2 ・右手で示す character: action(name=A, action=indicate_r) ・ジャンプ character:jump( name=A, x=0, y=0, z=0, mode=relative) Character:action( )でどういうアクションが定義されているかはキャラクタごとに異なる (UnityのAssetsでキャラクタにあらかじめアタッチされているアニメーションが使える)
課題1 カメラをキャラクターの胸から上を近くから 映すように、配置しよう キャラクターに 「こんにちは、私の名前はヒロメです。」 と喋らせましょう キャラクターに手を振らせよう
課題1(追加) カメラを動かしてみよう 複数カメラを設置して切り替えよう 複数キャラクターを用意しよう
答え - 1 camera:position(name=CamA, x=0.0, y=0.7, z=0.6, ry=180)
答え - 2 character: talk( name=A, text=“私の名前はヒロメです。" )
答え - 3 character: action(name=A, action="handwave", wrapmode=once, layer=1)
画像の表示や移動・音楽の再生
プロップ(小道具) 画像や3Dモデルなどを表示するためのイベント 大きさや位置を変更可能 prop: openmodel(name=block_cyber1, filename=Setprops/RankingSet_cyber/block_cyber) prop: position( name=block_cyber1 , x=1.3, y=1.0, z=0.0, scale=1.0)
プロップ(イメージプレート) prop: openimageplate(name=Pic , filename=“./datafiles/hadakadenkyu.jpg", hsize=1.0, vsize=1.0) prop: position( name=Pic, x=-1.3, y=1.0, z=-3.0, scale=1.0)
プロップの非表示 wait(time=2s) prop: visible( name=Pic, switch=off )
プロップの移動 prop: move(name=block_cyber1, x=1.2, y=0.7, z=-1.0, tspeed=1)
BGMの再生 sound:open( name=bgm, filename=“./datafiles/news.wav") sound:play( name=bgm) wait(time=5s) sound:stop( name=bgm )
動画の再生 movie:open(name=MOVIEDATA_0 , filename=“./datafiles/Salvador-Dali-Gala-Born-From-An-Egg.ogv ") prop:openmovieplate(name=MOVIEPLATE_0 , moviename=MOVIEDATA_0, hsize=2.0, vsize=1.5 ) prop:position(name=MOVIEPLATE_0, x=0, y=1.0, z=-3.0, scale=2.7 ) movie:play(name=MOVIEDATA_0, wait=no) prop:visible(name=MOVIEPLATE_0, switch=on) wait(time=60s) prop:visible( name= MOVIEPLATE_0, switch=off ) ムービー再生はprop:openmovieplate()でしか使えない
描画(ドローイング) drawing: openbase ( name=BASE, x=20%, y=20%, layer=99, color=000000 ) drawing: settext ( name=TEXT1, parent=BASE , text="<font r='1.0' g='1.0' b='1.0' size='30%'> <border r='1.0' g='0.0' b='0.0' width='2'>アートですね</border></font>" , x=0%, y=0%, refmode=center, height=50%, width=50% , overtext=clip, basecolor=transparent ) drawing: setimage(name=PICT1, parent=BASE, filename="./datafiles/book.jpg" , refmode=center, width=50%,height=50%, x=0%, y=0%, aspect=fit) drawing: display ( name=BASE, switch=on ) wait ( time=5.0) drawing: display ( name=BASE, switch=off )
課題2 3Dモデルをキャラクターの足元に表示させよう 左端に表示させた画像(dogs.png)を右端に 移動させよう(画像の高さは自由です)
答え - 1 prop:openmodel(name=block_cyber1, filename=Setprops/RankingSet_cyber/block_cyber) prop: position( name=block_cyber1, x=0, y=-0.01, z=0)
答え - 2 prop:openimageplate( name=pic1, filename="./datafiles/dogs.png", hsize=1.55, vsize=1.1) prop:position( name=pic1, x=1, y=1.3, z=-1,scale=1.5 ) prop: move(name=pic1, x=-1, y=1.3, z=-1, tspeed=1,wait=no)
答え - 3 prop:visible( name=pic1, switch=off ) prop:visible( name=block_cyber_stand, switch=off )
課題2 3Dオブジェクトを表示して移動させよう 3D画像を表示して移動させよう Drawingでテキストを表示して移動させよう 表示したテキストの色を変えよう
待機コマンドやコマンドの応用
コマンドの同時実行 character: talk( name=A, text=“バイバイ" , wait=no) character: action(name=A, action=handwave, wrapmode=once, layer=1, wait=yes)
待機コマンド (waitアンダーバーコマンド) character: talk( name=A, text=“それじゃあまた次回ね、バイバーーーイ", wait=no) wait( time=1.6s ) character: action(name=A, action=handwave) character: wait_talk ( name=A )
セットの変更 set:change( name=NULL ) prop:openimageplate(name=set, filename="./datafiles/set2.png", hsize=3, vsize=2, aspect=free) prop:position( name=set, x=0, y=1, z=-0.9, scale=1.5)
画像のattach prop:openimageplate( name=t1, filename="./datafiles/cat.png", hsize=0.4, vsize=0.6) prop: attach(name=t1, target=A, joint=Head, y=0.15 ,z=0.158,switch=on,scale=1)
ファイルの場所指定 画像ファイル、音声ファイル、ムービーファイルのパス指定は次の2種。 ・絶対バスでの指定 (例: C:\sozai\abc.jpg) ・TVMLスクリプトの場所からの相対パス (例:./datafiles/news.wav)
ファイルフォーマット ■サウンドファイル TVMLコマンド: sound:open() 使えるフォーマット: wav, ogg ■画像ファイル TVMLコマンド: prop:imageplate(), drawing:setimage() 使えるフォーマット: jpg, png ■ムービーファイル TVMLコマンド: movie:open() 使えるフォーマット: ogv 注意: ・https://convertio.co/ja/ogv-mp4/で変換したら音もOK ・ムービーはprop:openmovieplate()でしか使えない ・movie:play()はskipscriptの中では効かない(バグ) ■直接ファイル指定できないデータ(後述) キャラクタ、セット、プロップ、モーションキャプチャーデータ (character:mocap)
キャラクタ、セット、プロップデータ これらCGデータは外部ファイルとして参照できない。TVML Playerにあらかじめリソースとして含まれているものが利用できるだけである。以下にVer1.2.2にバンドルされているものをあげる。 キャラクタ: character:openmodel(filename="data_path") Characters/Bob/Bob Characters/bucchu/bucchu Characters/Justin/Justin Characters/maiko/maiko Characters/mamimi/mamimi Characters/marigo/marigo Characters/Mary/Mary Characters/Mia/Mia Characters/Mia_old/Mia_old Characters/news_caster/news_caster Characters/pooni/pooni Characters/pooni1/pooni1 Characters/pooni2/pooni2 Characters/pooni3/pooni3 Characters/pooni4/pooni4 Characters/pooni5/pooni5 Characters/pris/pris Characters/steward/steward Characters/yuruneko_black/yuruneko_black Characters/yuruneko_mike/yuruneko_mike Characters/yuruneko_white/yuruneko_white セット: set:openmodel(filename="data_path") Setprops/hall/hall Setprops/newnormal/newnormal Setprops/news_set/news_set Setprops/RankingSet_cyber/cyberspace Setprops/spaceship/spaceship プロップ: prop:openmodel(filename="data_path") Setprops/sofa/sofa Setprops/table/table Setprops/table/chabudai Setprops/book/book Setprops/leaf/leaf Setprops/RankingSet_cyber/block_cyber Setprops/RankingSet_cyber/videoboard_cyber Setprops/RankingSet_cyber/videoframe_cyber Setprops/RankingSet_cyber/messageframe_cyber Setprops/rankingframe_16x9/videoboard_cyber_16x9 Setprops/rankingframe_16x9/videoboard_simple_16x9 Setprops/rankingframe_16x9/videoframe_cyber_16x9 キャラクタリストはパワポの最後の付録を参照のこと。
モーションキャプチャーデータ character:openmocap(filename="data_path")でBVHフォーマットのモーションキャプチャーデータが利用できるが、現時点で外部ファイルとして参照できず、TVML Playerにあらかじめリソースとして含まれているものだけ利用できる。 BVHs/A13 BVHs/A24 BVHs/I05 BVHs/I07 BVHs/I08 BVHs/I09 BVHs/I12 BVHs/I13 BVHs/I14 BVHs/I17 BVHs/I21 BVHs/I25 BVHs/I26 BVHs/I29 BVHs/I34 BVHs/I35 BVHs/natoku_001 BVHs/ojigi_001 BVHs/Sasu_002 BVHs/Sasu_004 BVHs/sit_bow_nao BVHs/sit_byebye_nao BVHs/sit_default_nao BVHs/sit_talk00_nao BVHs/sit_talk01_nao BVHs/sit_talk02_nao BVHs/sit_talk03_cam_nao BVHs/talk_002 BVHs/talk_004
キャラクターを動かす (補足) アテレコ 歩く character: walk( name=A, x=1.0, z=0.0) 歩数指定 character: talkfile( name=A, filename=“./datafiles/konafuni.wav”, caption="こんな風に録音した音声でもしゃべれます" ) 歩く character: walk( name=A, x=1.0, z=0.0) 歩数指定 character: walk( name=A, step=3)
キャラクターを動かす (補足) 立つ・座る character: sit( name=A) wait(time=1.0) character: stand( name=A) ターン character:turn( name=A, d=-90)
キャラクターを動かす (補足) 見る character: look(name=A, target=camera ) 対象物 camera:move(name=CamA, x=1.0, y=1.0, z=2, ry=180) camera:move(name=CamA, x=0.0, y=3.0, z=2, ry=180, rx=40) camera:move(name=CamA, x=0.0, y=1.0, z=2, ry=180, rx=0) character: gaze( name=A, rx=-30, ry=70) 指定方向
キャラクターを動かす (補足) 震える character: shake( name=A, switch=on) wait(time=3.0) character: shake( name=A, switch=off) 口を開ける character:openmouth( name=A, switch=on) wait(time=1.0) character:openmouth( name=A, switch=off)
キャラクターを動かす (補足) 表情変化 character: expression( name=A, type=sad) wait(time=1.0) character: expression( name=A, type=happy) character: expression( name=A, type=neutral)
キャラクタを動かす: アクションを再生する キャラクタを動かす: アクションを再生する character: action(name=A, action=hop) character: action(name=A, action=shock) character: action(name=A, action=bye) Character:action( )で動かすときは、 UnityのAssetsでキャラクタにあらかじめアタッチされているアニメーションが使えるのみである。したがって、どういうアクションが定義されているかはキャラクタごとに異なる。 上述は、maikoとstewardで定義されているアニメーションの例である。
キャラクタを動かす: ポーズ character:definepose( name=A, pose=banzai キャラクタを動かす: ポーズ character:definepose( name=A, pose=banzai , joint=RightUpperArm, rx=-130, ry=20) , joint=LeftUpperArm, rx=-130, ry=-20) , joint=Chest, rx=-30) character:definepose( name=A, pose=upper , joint=Jaw, rx=30) character:pose( name=A, pose=banzai) wait(time=1.0) character:pose( name=A, pose=default)
音声ミキサー(レベル変え) sound: open( name=bgm , filename="./datafiles/Internationale-ru.ogg") sound: level( name=bgm, level=0.1) sound: play( name=bgm) wait(time=5.0) sound: level( name=bgm, level=0.5) sound: level( name=bgm, level=1.0)
音声ミキサー(フェード) sound: open( name=bgm , filename ="./datafiles/Internationale-ru.ogg") sound: play( name=bgm) wait(time=8.0) sound: fade( name=bgm, level=0.5 ) sound: fade( name=bgm, level=0.0 )
課題3 キャラクターの動作コマンド「brilliant」(目を輝 かせる)と「素晴らしい」というセリフを同時に実 行させた1秒後に、動作コマンド「ジャンプ」を実 行させよう 表示されているセットを消して、dogset.pngの 画像をキャラクターの後ろに大きく表示させよう キャラクターに犬のお面 dog.png をつけてみ よう
答え1 character: talk( name=A, text=“素晴らしい", wait=no) character: action(name=A, action=brilliant, wrapmode=once, layer=1, wait=yes) wait(time=1s) character:jump( name=A, x=0, y=0, z=0, mode=relative, wait=yes)
答え2 set:change( name=NULL ) prop:openimageplate(name=set, filename="./datafiles/dogset.png", hsize=3, vsize=2, aspect=free) prop:position( name=set, x=0, y=1, z=-0.9, scale=1.5)
答え3 prop:openimageplate( name=t1, filename= "./datafiles/dog.png", hsize=0.4, vsize=0.6) prop: attach(name=t1, target=A, joint=Head, y=0.15 ,z=0.158,switch=on,scale=1)
課題3 キャラクターをカメラ目線のまま歩かせる ジャンプに効果音をつけよう
キャラクタリスト(付録)
キャラクタリスト(付録)
キャラクタリスト(付録)