【修正版】猫リリアリスで Nostalogic MME立体視。【交差法】

D

の修正版。YouTube に上げた回転の滑らかさを訂正したものから更に回転の不連続を修正。あとは動画コメントに書いた通り猫村さんの動作の微調整を。

ついでで

のパラメータを

FRAME_MIX_NO = 2  # ミックスするフレームの数。
                  # 例えば 120fps のものに 4 を指定すると 120/4 = 30fps になる

ATTENUATION = 3  # 減衰率。1 で全てのフレームを等分に合成。
                 # 大きな値にするほど過去フレームが減衰する。(整数でなくても可)

から

FRAME_MIX_NO = 2  # ミックスするフレームの数。
                  # 例えば 120fps のものに 4 を指定すると 120/4 = 30fps になる

ATTENUATION = 2  # 減衰率。1 で全てのフレームを等分に合成。
                 # 大きな値にするほど過去フレームが減衰する。(整数でなくても可)

と ATTENUATION を 1減らして残像感を大きくしてみました。60→30fps だとこれくらいの方がいい感じ。



今回テストとしてHD画質の動画を扱ってみたのですが。4分半程のこの動画で MikuMikuDance からの出力に 3時間、aviutl での連番BMP出力 5分、それの framemixer.py での加工に 1時間、その後BMPを aviutil に読み込んで、それをAVI出力するのにまた 3時間、そしてつんでれんこするのに 1時間……。(マシンスペック: Celeron900 2.20GHz →http://toshibadirect.jp/pc/catalog/pxw_k/)

もう当分は素にプレイヤーサイズ、30fps の動画でいいや。試してみたところ aviutl のモーションブラーも framemixer.py と同等な感じなのでこれも aviutil でやった方が手早いし。(というか 30fps ならフレームミックスする必要も無いし)*1

MikuMikuDance 上の作業以後の創造性とは無関係の作業に手間と時間を取られるというのも馬鹿らしいので、一通りのテストも終わったことだしここらへんは手控えて……いよいよモーション弄る方に! ……って手間かかるんだろうなぁ。

おまけとしてまた使用したカメラのモーションを

(VMDEditor 0.2 による CSV 化データです。好きに流用して可)

Vocaloid Motion Data 0002
カメラ・照明
Motion,bone,x,y,z,rx,ry,rz,x_p1x,x_p1y,x_p2x,x_p2y,y_p1x,y_p1y,y_p2x,y_p2y,z_p1x,z_p1y,z_p2x,z_p2y,r_p1x,r_p1y,r_p2x,r_p2y
Expression,name,fact
Camera,d,a,x,y,z,rx,ry,rz,x_p1x,x_p1y,x_p2x,x_p2y,y_p1x,y_p1y,y_p2x,y_p2y,z_p1x,z_p1y,z_p2x,z_p2y,r_p1x,r_p1y,r_p2x,r_p2y,d_p1x,d_p1y,d_p2x,d_p2y,a_p1x,a_p1y,a_p2x,a_p2y
0,-50,45,0,10,5,6,0,-10,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107
7380,-40,45,0,10,0,10,2520.011,0,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107
7260,-40,45,0,10,0,10,2520.011,0,20,20,107,107,20,20,107,107,20,20,107,107,21,67,67,127,20,20,107,107,20,20,107,107
7500,-80,45,0,20,0,0,2520.025,0,65,0,70,127,65,0,70,127,65,0,70,127,65,0,70,127,65,0,70,127,65,0,70,127
1000,-48.62259,45,0,10,4.311295,6.196,123.465,-9.51,20,20,107,107,20,20,107,107,20,20,107,107,64,9,104,60,20,20,107,107,20,20,107,107
6260,-41.37741,45,0,10,0.688705,9.846,2423.116,-0.385,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107
6000,-41.73554,45,0,10,0.8677683,9.666,2309.445,-0.836,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107
5000,-43.11295,45,0,10,1.556473,8.972,1872.249,-2.57,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107
4000,-44.49036,45,0,10,2.245179,8.278,1435.053,-4.305,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107
3000,-45.86777,45,0,10,2.933884,7.584,997.857,-6.04,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107
2000,-47.24518,45,0,10,3.622589,6.89,560.661,-7.775,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107,20,20,107,107
Light,r,g,b,x,y,z
0,0.5859375,0.46875,0.46875,-0.91,-0.34,0.28
7260,0.5859375,0.46875,0.46875,-0.91,-0.34,0.28
7380,0.46875,0.390625,0.46875,-0.91,-0.34,0.28
7500,0.390625,0.390625,0.46875,-0.91,-0.34,0.28

更におまけとして立体視 ED テロップ作成に作った Python スクリプト

Python 使えない人には使い方が分からないでしょうけれども、Python 使える人なら解説不要でしょう。AS-IS なものとして置いておきます。

# -*- coding: utf-8 -*-
u'''EDテロップ作成

Python 2.6.5 + Pygame 1.9.1
'''
import pygame
from pygame.locals import *

TESTVIEW = True  # テストで見てみるだけなら True, 本番のBMP作成は False
OFFSET = 2  # 立体視セット対応。広げる(手前に見えるようにする)なら増やす

FONT = 'MEIRYO.TTC'  # 使用するフォントファイル名
COLOR = 255, 255, 255
SOURCEIMAGE = 'ending.bmp'  # テロップを重ねる元の画像ファイル
STARTFILENO = 7501  # 開始するファイル名の最初。0フィルされた8桁の数値として出力
SCALE = 2  # 倍率。横幅640なら1, 横幅1280なら2 

DEST = 'dest/'  # 連番BMPを出力するフォルダ
TIME = 30 * 3  # 1つのテロップを表示するフレーム数

##最初の行がタイトル
##最後の行がアドレス。この行だけ空白区切りで改行表示
##残りの中間がメインの文。ここだけ大きな文字で他より浮き上がって表示
data = (
u'''音楽
【ロリMEIKO】
Nostalogic (single edit)
【実写PV】
(yuukiss / rose)
http://www.nicovideo.jp/watch/sm9874560''',
u'''モーション
【Nostalogic】
Yumikoさんをトレースしてみた2
(最終回)【MMD】
(nori / Yumiko)
http://www.nicovideo.jp/watch/sm12968853''',
u'''モデル
「ハローキティといっしょ!」
猫村いろは(ボカロ) Ver.E
(ISAO / Windows100% / okama)
http://www.nicovideo.jp/watch/sm12958522 (UPDATEパッチ)''',
u'''モデル
「クイーンズゲイト」
門を開く者 アリス Ver.100914_1
(かこみき / Niθ)
http://www003.upp.so-net.ne.jp/kakomiki/''',
u'''モデル
「CosmicBreak x MMD Re」
リリレイン Ver.2.01
(るちる / CyberStep)
http://www.cyberstep.com/special/cbxmmd/''',
u'''ステージ
サイハテの場所
(アノマロかりんとう)
http://anomarokarintou.blog37.fc2.com/''',
u'''ツール
MikuMikuDance Ver.7.23
(樋口優)
http://www.geocities.jp/higuchuu4/''',
u'''ツール
MikuMikuEffect Ver0.11
(舞力介入P)
http://www.nicovideo.jp/watch/sm12149815''',
u'''ツール
立体視セット(MME)
(Furia)
http://www.nicovideo.jp/watch/sm12849049''',
u'''ツール
AviUtl version 0.99i8
(KENくん)
http://spring-fragrance.mints.ne.jp/aviutl/''',
u'''自作ツール
framemixer.py ver.1.1.0
http://d.hatena.ne.jp/kadotanimitsuru/ 20100717/framemixer''',
u'''Author

kadotanimitsuru
''')
def _escape():
    for e in pygame.event.get():
        if e.type == QUIT:
            return True
        elif e.type == KEYDOWN and e.key == K_ESCAPE:
            return True
    return False

def _render(surface, image, x, y, offset=OFFSET):
    surface.blit(image, (x / 2 - image.get_width() / 2 - offset * SCALE, y))
    surface.blit(image, (x * 1.5 - image.get_width() / 2 + offset * SCALE, y))
    
def textrender(surface, pos, text, font, bigfont):
    x, y = pos
    t = text.split('\n')
    title = font.render(t[0], True, COLOR)
    y += 12 * SCALE
    _render(surface, title, x, y, OFFSET - 1)
    y += font.get_linesize()
    y += 12 * SCALE
    for i in t[1:-1]:
        maintext = bigfont.render(i, True, COLOR)
        _render(surface, maintext, x, y)
        y += bigfont.get_linesize()
    for i in t[len(t)-1].split():
        url = font.render(i, True, COLOR)
        _render(surface, url, x, y, OFFSET - 1)
        y += font.get_linesize()

def main():
    image = pygame.image.load(SOURCEIMAGE)
    x, y = image.get_size()
    screen = pygame.display.set_mode((x, y))
    font = pygame.font.Font(FONT, 12 * SCALE)
    bigfont = pygame.font.Font(FONT, 16 * SCALE)
    file_no = STARTFILENO
    for text in data:
        work = image.copy()
        textrender(work, (x / 2, 0), text, font, bigfont)
        for n in range(TIME):
            pygame.display.set_caption('%08d.bmp' % file_no)
            if not TESTVIEW:
                pygame.image.save(work, '%s%08d.bmp' % (DEST, file_no))
            file_no += 1
            if _escape():
                return
            screen.blit(work, (0, 0))
            pygame.display.flip()
    return

if __name__ == '__main__':
    try:
        pygame.init()
        main()
    finally:
        pygame.quit()
## 好きに改造して使ってください。

*1:立体視もフレームミックスも自作スクリプト使う必要無くなったから自作もの全部お蔵入りか……