【第5回MMD杯本選】リリ子さん×2 でぽっぴっぽー(立体視)【リリリリ祭り】

MMD杯参加しました!
D
(立体視の方法を選べる YouTube版: 【MMD Cup V】Lily & Lily Rain PoPiPo Dance - つちのこ、のこのこ。(はてな番外地))
目玉、というか本題の立体視スクリプトですが、視線を水平から外せない*1という未完成品。とりあえずな代物ですが今回使ったものを貼っておきます。

# -*- coding: utf-8 -*-
u"""parallax カメラの PMD→CSV から立体視用データを作る

Python 2.6.5
"""
from __future__ import division
import math

BETWEEN_EYES = 0.354159  # 初音ミクモデルの目の間隔 / 2
FILENAME = 'camera'  # csv の主ファイル名

def parallax(distance):  # 視差の半分
    return math.degrees(
        math.atan2(BETWEEN_EYES, distance))

f = open(FILENAME + '.csv', 'rb')
data = f.readlines()
f.close()
keyframes = int(data[4])
print 'camera: %s, light: %s' % (keyframes, data[5 + keyframes])
RIGHT = data[:5]
LEFT = data[:5]
for i in range(keyframes):
    line = data[5 + i]
    (frame_no, distance,
     pos_x, pos_y, pos_z,
     axis_x, axis_y, axis_z,
     curve) = line.strip().split(',')
    p = parallax(abs(float(distance)))
    print frame_no, distance, p
    RIGHT.append(','.join(
        (frame_no, distance, pos_x, pos_y, pos_z, axis_x,
         str(float(axis_y) + p),
         axis_z, curve)) + '\n')
    LEFT.append(','.join(
        (frame_no, distance, pos_x, pos_y, pos_z, axis_x,
         str(float(axis_y) - p),
         axis_z, curve)) + '\n')
RIGHT.extend(data[5 + keyframes:])
LEFT.extend(data[5 + keyframes:])
f = open(FILENAME + '_R.csv', 'wb')
f.write(''.join(RIGHT))
f.close()
f = open(FILENAME + '_L.csv', 'wb')
f.write(''.join(LEFT))
f.close()

# Public Domain. 好きに流用してください。

実際に使用するには事前に VMDConverter*2使ってカメラのモーションVMDをCSVファイルに変換する必要があります。

"camera.vmd" という名前でカメラのモーションデータを保存、それを VMDConverter に読み込ませて "camera.csv" を作成。そこでこの Python スクリプトを動かすと "camera_R.csv" と "camera_L.csv" という 2つのファイルが出来るので、それをまた VMDConverter で "camera_R.vmd" と "camera_L.vmd" に逆変換。それを MikuMikuDance で読み込んでそれぞれ AVI 出力すれば右目用と左目用の動画が出来ます。あとは適当な手段で横並びに結合*3すれば裸眼立体視用の動画ができます。

実際に動画で使用した camera.csv をここに貼っておきます

Vocaloid Motion Data 0002,1296845642
カメラ・照明
0
0
49
0,-10,10,10,0,0,0,0,0x146B146B146B146B146B146B146B146B717F0018146B146B2D00000000
50,-10,10,16.65,0,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
618,-6.5,10,17.65,0,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
635,-6.5,10,17.65,0,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
800,-1000,10,17.65,0,0,0,0,0x146B146B146B146B146B146B146B146B532E007F146B146B2D00000000
1000,-10,-10,20.05,0,0,0,0,0x146B146B146B146B146B146B146B146B532E007F146B146B2D00000000
1285,-7,-10,20.05,0,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1308,-10,-10,20.05,0,0,-35,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1400,-7,-10,20.05,0,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1435,-10,-10,13.35,0,0,-6.87549,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1470,-20,-20,15,10,0,-65,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1490,-10,-20,15,10,0,-65,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1560,-20,20,15,10,0,45,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1585,-10,20,15,10,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1655,-40,0,15,10,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1685,-50,0,15,10,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1770,-70,0,15,10,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
1965,-60,-10,15,0,0,-50,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2060,-30,-10,15,0,0,-0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2135,-20,-10,15,0,0,-0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2180,-20,10,15,0,0,-0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2260,-20,10,15,0,0,40,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2270,-50,-10,15,0,0,60,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2300,-60,-10,15,0,0,30,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2352,-60,-0,15,0,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2444,-60,-0,15,10,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2550,-60,-0,15,20,0,-20,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2551,-40,-0,30,30,0,-50,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2553,-40,0,30,30,0,-40,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2557,-40,0,30,30,0,40,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2563,-20,-0,30,30,0,40,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2569,-20,0,30,30,0,-50,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2577,-20,0,30,30,0,-50,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2582,-20,0,30,30,0,40,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2587,-20,-0,30,30,0,40,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2588,-40,-0,30,30,0,-140,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2600,-40,-0,30,30,0,-220,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2609,-40,-0,30,30,0,-140,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2622,-40,-0,30,30,0,-220,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2623,-40,-10,15,-0,0,-0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2740,-10,-10,20,-0,0,-20,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2754,-50,10,17,-0,0,-50,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2770,-20,10,17,-0,0,-20,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2815,-10,10,17,-0,0,30,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2833,-30,0,17,-0,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2970,-60,0,17,-0,0,0,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2978,-10,10,17,-0,0,-10,0,0x146B146B146B146B146B146B146B146B146B146B146B146B2D00000000
2986,-10,10,17,-0,0,-10,0,0x146B146B146B146B146B146B146B146B647E0020146B146B2D00000000
3365,-1500,10,17,-0,0,-10,0,0x146B146B146B146B146B146B146B146B532E007F146B146B2D00000000
0

*1:横(Y軸)以外の回転には対応できない

*2:http://yumin3123.at.webry.info/200810/article_4.html]

*3:私は AviUtl で連番BMP にして自作スクリプトで 1フレームずつ結合、そして AviUtl で動画に戻して……とやったけれども、もっと楽な方法がこの世にはあるはず