OBJファイル読み込み

rwobj.pyの関数

rwobj.pyに以下の関数を作成してOBJデータの読み書きができるようにしてください。 また、作ったスクリプトはモジュールとして使えるようにしてください。
以下のdataはすべて自分で作ったポリゴンデータとします。

データ入出力関数

data = readObj(filename)   
引数
filename : 入力OBJファイル名
返り値 : data
読み込んだOBJデータ(各自の独自フォーマット)
writeObj(data, filename)
引数
data : OBJデータ
filename : 出力ファイル名(OBJファイル)
返り値
無し

readObj()とwriteObj()のテストは以下のように行います。

import sys
data = readObj(sys.argv[1])
print data
writeObj(data, sys.argv[2])

各種データ取得関数

各種データをdataから取り出す関数

vs = getVertex(data)
引数
data : OBJデータ
返り値 : vs
頂点のリストのリスト[[x, y, z], ....]
ns = getNormal(data)
引数
data : OBJデータ
返り値 : ns
法線のリストのリスト [[x, y, z], ....]
uv = getUV(data)
引数
data : OBJデータ
返り値 : uv
UVのリストのリスト [[u,v], ....]
fs = getFace(data)
引数
data : OBJデータ
返り値 : fs
フェースを表す頂点番号のリストのリスト [[n1, n2, ...]...]
nn = getNormalNumber(data)
引数
data : OBJデータ
返り値 : nn
法線を表す番号のリストのリスト [[n1, n2, ...], ....]
es = getEdge(data)
引数
data : OBJデータ
返り値 : es
エッジを表す頂点番号のリストのリスト [[n1, n2], ...]

各種データ設定関数

各種データをdataに戻す関数

putVertex(vs, data)
引数
vs : 頂点のリストのリスト[[x, y, z], ....]
data : OBJデータ
返り値
無し
putNormail(ns, data)
引数
ns : 法線のリストのリスト [[x, y, z], ....]
data : OBJデータ
返り値
無し
putUV(uv, data)
引数
uv : UVのリストのリスト [[u,v], ....]
data : OBJデータ
返り値
無し
putFace(fs, data)
引数
fs : フェースを表す頂点番号のリストのリスト[[n1, n2, ...]...]
data : OBJデータ
返り値
無し
putEdge(es, data)
引数
es : エッジを表す頂点番号のリストのリスト[[n1, n2], ...]
data : OBJデータ
返り値
無し

モジュール

Pythonのライブラリのことをモジュールと言います。
Pythonのスクリプトを所定のフォルダに保存しておくとモジュールとしてインポートできるようになります。
例えば、test.pyとrwobj.pyを同じフォルダに保存しておくとtest.pyの中で以下のようにしてrwobj.pyをインポートできます。

import rwobj

data = rwobj.readObj(filename1)
...
rwobj.writeObj(data, filename2)

以下のif文がモジュール内にあるとモジュールとして使うときは実行されないので モジュールのテスト用スクリプトを書いておくことができます。

if __name__ == '__main__':
    # テスト用の命令

OBJ ファイルフォーマット

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

Tips


Contents