「左目」じゃなくて「左目先」の座標を使わなくちゃいけなかったんだ
0.354159 と 0.62 だから倍近く違うしー。ちゃんと絵面で確認しておけばよかった。まあ杯動画出力する前に気づいて良かった。
いや、parallax.py
# -*- 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. 好きに流用してください。
の話ですが。これの
BETWEEN_EYES = 0.354159 # 初音ミクモデルの目の間隔 / 2
が
BETWEEN_EYES = 0.62 # 初音ミクモデルの瞳の間隔 / 2
になるのが正しい、と。
でもこれだと立体感が過剰になりすぎるかも。
リアル人間での瞳孔間隔の標準が 6.5cm*1ですから必要な値は(顔の中央からの距離を計算に使っているから)その半分 = 3.25cm になるので 3.25cm = 0.62mmd で換算すると 1mmd = 5.24cm になってしまいます。まあ初音ミクモデルの頭でっかちぶりから考えてこれくらいになるのが妥当ではあるのですが。やはり瞳の間隔ではなくて身長から換算した方が順当でしょうか。
それだと
MMDでよく基準に使われるのは、標準付属ミクの身長を160センチとして換算した1MMD距離=8センチ。
Twitter / @ダサツマP/penciler: MMDの現在の表示限界距離はカメラの中心からMMD数 ...
だそうなので、3.25cm = 0.4mmd という値が妥当になります。
大雑把な見た目だと顔の大きさよりも身長の方が重要ですから、とりあえずこちらの値を採用した方が無難かも。