OBJファイル読み込み

問題

  1. 以下のデータを読み込んで、頂点の位置データをリストにして返すPythonの関数を作成してください。
    OBJデータ をファイルに保存して、実行時にそのファイル名で読み込む関数にしてください。
    実行方法
    # python スクリプト名.py データファイル名
    関数とその使い方
    import sys
    
    def readVertex(filename):
    	.
    	.
    	return 頂点のリスト
    
    vers = readVertex(sys.argv[1])
    print vers
    
    返り値
    頂点のリスト
    返り値のサンプル
    [[-0.5, -0.5, 0.5], [0.5, -0.5, 0.5], [-0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [-0.5, 0.5, -0.5], [0.5, 0.5, -0.5], [-0.5, -0.5, -0.5], [0.5, -0.5, -0.5]]
  2. 以下のデータを読み込んで、ポリゴンのデータをリストまたは辞書にして返すPythonの関数を作成してください。
    OBJデータ をファイルに保存して、実行時にそのファイル名で読み込む関数にしてください。
    実行方法
    # python スクリプト名.py データファイル名
    引数
    def readObj(入力ファイル名):
    
    関数とその使い方
    import sys
    
    def readObj(filename):
    	.
    	.
    	return ポリゴンのデータの入ったリストまたは辞書
    
    vers = readObj(sys.argv[1])
    print vers
    
    返り値
    ポリゴンデータ
    返り値サンプル
    (リストのリスト)
    [[[-0.5, -0.5, 0.5], [0.5, -0.5, 0.5], [-0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [-0.5, 0.5, -0.5], [0.5, 0.5, -0.5], [-0.5, -0.5, -0.5], [0.5, -0.5, -0.5]], [[0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, -1.0], [0.0, 0.0, -1.0], [0.0, 0.0, -1.0], [0.0, 0.0, -1.0], [0.0, -1.0, 0.0], [0.0, -1.0, 0.0], [0.0, -1.0, 0.0], [0.0, -1.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.0, 0.0], [-1.0, 0.0, 0.0], [-1.0, 0.0, 0.0], [-1.0, 0.0, 0.0], [-1.0, 0.0, 0.0]], [[0.375, 0.0], [0.625, 0.0], [0.375, 0.25], [0.625, 0.25], [0.375, 0.5], [0.625, 0.5], [0.375, 0.75], [0.625, 0.75], [0.375, 1.0], [0.625, 1.0], [0.875, 0.0], [0.875, 0.25], [0.125, 0.0], [0.125, 0.25]], [[[0, 1, 3, 2], [2, 3, 5, 4], [4, 5, 7, 6], [6, 7, 1, 0], [1, 7, 5, 3], [6, 0, 2, 4]], [[0, 1], [1, 3], [3, 2], [2, 0], [2, 3], [3, 5], [5, 4], [4, 2], [4, 5], [5, 7], [7, 6], [6, 4], [6, 7], [7, 1], [1, 0], [0, 6], [1, 7], [7, 5], [5, 3], [3, 1], [6, 0], [0, 2], [2, 4], [4, 6]]]
    (辞書でまとめたリスト)
    {'vertex':[[-0.5, -0.5, 0.5], [0.5, -0.5, 0.5], [-0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [-0.5, 0.5, -0.5], [0.5, 0.5, -0.5], [-0.5, -0.5, -0.5], [0.5, -0.5, -0.5]], 'texture':[[0.375, 0.0], [0.625, 0.0], [0.375, 0.25], [0.625, 0.25], [0.375, 0.5], [0.625, 0.5], [0.375, 0.75], [0.625, 0.75], [0.375, 1.0], [0.625, 1.0], [0.875, 0.0], [0.875, 0.25], [0.125, 0.0], [0.125, 0.25]], 'normal':[[0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, -1.0], [0.0, 0.0, -1.0], [0.0, 0.0, -1.0], [0.0, 0.0, -1.0], [0.0, -1.0, 0.0], [0.0, -1.0, 0.0], [0.0, -1.0, 0.0], [0.0, -1.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.0, 0.0], [-1.0, 0.0, 0.0], [-1.0, 0.0, 0.0], [-1.0, 0.0, 0.0], [-1.0, 0.0, 0.0]], 'face':[[[0, 1, 3, 2], [2, 3, 5, 4], [4, 5, 7, 6], [6, 7, 1, 0], [1, 7, 5, 3], [6, 0, 2, 4]], [[0, 1], [1, 3], [3, 2], [2, 0], [2, 3], [3, 5], [5, 4], [4, 2], [4, 5], [5, 7], [7, 6], [6, 4], [6, 7], [7, 1], [1, 0], [0, 6], [1, 7], [7, 5], [5, 3], [3, 1], [6, 0], [0, 2], [2, 4], [4, 6]]]}
  3. 上の問題で読み込んだポリゴンのデータをOBJデータとしてファイルに書き込むPythonの関数を作成してください。
    実行方法
    # python スクリプト名.py 入力データファイル名 出力データファイル名
    引数
    def writeObj(ポリゴンデータ, 出力ファイル名):
    
    返り値
    無し
    関数とその使い方
    import sys
    
    def writeObj(data, filename):
    	.
    	.
    
    data = readObj(sys.argv[1])
    writeObj(data, sys.argv[2])
    

Obj ファイルフォーマット

#
# から行末までコメントです。
mtllib マテリアルファイル名
マテリアルデータを記述したファイル名です。
g グループ名
グループの名前です。
次のg、またはファイル末尾までが1つのグループです。
グループ名が無いと、全体が一つのグループになります。
usemtl マテリアル名
このグループが使用するマテリアル名を指定します。
マテリアル名は、マテリアルファイルに記述してあります。
v X Y Z
頂点の座標値です。
vt U V
テクスチャの座標値です。
vn X Y Z
法線ベクトルの値です。
f 頂点座標値番号/テクスチャ座標値番号/頂点法線ベクトル番号 ...
フェイスの情報です。
3つの数値が / を区切りとして並びます。 この3つの数値が、フェイスの数だけ並びます。
各番号は、1 から始まります。
テクスチャ座標値番号頂点法線ベクトル番号は、省略可能です。

Contents