vパラメータとfパラメータのみを含む.objファイルがあります。
直方体 (すべての軸の最大頂点と最小頂点によって定義される) でそれを「囲む」ことによってテクスチャを作成し、その中心を計算し、ティーポットの頂点の空間座標を中心座標から除算して、ベクトルを取得するタスクがあります。ティーポットの中心で開始し、その表面で終了し、これらのベクトル (光線) が外側の立方体の表面と交差する場所を見つけます。立方体の各面は、イメージをシミュレートする必要があります。その後、すべての頂点のテクスチャ座標を計算する必要があります。3D 交点から 2D パラメータを取得し、結果が 0 と 1 の間 (2 次元) になるように正規化するだけです。
そこで、いくつかの適切なコード行で .obj ファイルを開き、説明されているすべての計算を行って vt パラメーターを見つけ、三角形を作成するインデックス付き頂点のリストを使用して NORMALS を取得できる関数を使用します (面属性) と頂点のリスト。
次のようになります (実際には、2 つの異なるファイルにある 2 つの関数で構成されています)。
1)
def getNormals4Triangles(self):
tind = np.resize(self.indx,(len(self.indx)/3,3))
return VOB.getNormals(self.arrs[0],tind)
ここで、self.arrs[0] は .obj から取得した v 属性のリストであり、tind は面を構成する頂点の 3 つの要素リストのリストです。
2)
@staticmethod
def getNormals(verts,tinds):
print("Shape verts: ",verts.shape)
print("Shape tinds: ",tinds.shape)
if len(verts[0])==3:
xyz = verts
elif len(verts[0])==4:
xyz = verts[:,:3]/np.outer(1/verts[:,3],[1,1,1])
else:
raise Exception('No cross product defined')
txyz = xyz[tinds,:]
txy = txyz[:,2,:]-txyz[:,0,:]
txz = txyz[:,1,:]-txyz[:,0,:]
nrmls = np.cross(txy,txz)
len_nrmls = norm(nrmls,axis=1)
return nrmls/np.outer(len_nrmls,[1,1,1])
ここで、「ノルム」は線形代数 NumPy セットの関数です。
その後、VOB オブジェクトを作成します。
self.vob = VOB(arrs = [vert, point, normals],indx=self.obj.indx)
簡単に言えば、VOB オブジェクトを使用して GPU に送信します。
vert - .obj から取得した頂点のリスト point - 上記の方法で計算されたテクスチャ座標のリスト normals - 上記の関数を使用して計算された法線ベクトルのリスト
私が使用するテクスチャ画像:
従来の ligthing を使用して表示しようとすると、次のようになります。
gl.glShadeModel( gl.GL_SMOOTH )
gl.glEnable( gl.GL_LIGHTING )
gl.glEnable( gl.GL_LIGHT0 )
gl.glLightModeli( gl.GL_LIGHT_MODEL_TWO_SIDE, 0 )
gl.glLightfv( gl.GL_LIGHT0, gl.GL_POSITION, [4, 4, 4, 1] )
lA = 0.8
gl.glLightfv( gl.GL_LIGHT0, gl.GL_AMBIENT, [lA, lA, lA, 1] )
lD = 1
gl.glLightfv( gl.GL_LIGHT0, gl.GL_DIFFUSE, [lD, lD, lD, 1] )
lS = 1
gl.glLightfv( gl.GL_LIGHT0, gl.GL_SPECULAR, [lS, lS, lS, 1] )
gl.glMaterialfv( gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT, [0.9, 0.8, 0.7, 1] )
gl.glMaterialfv( gl.GL_FRONT_AND_BACK, gl.GL_DIFFUSE, [0.7, 0.8, 0.9, 1] )
gl.glMaterialfv( gl.GL_FRONT_AND_BACK, gl.GL_SPECULAR, [0.9, 0.9, 0.9, 1] )
gl.glMaterialf( gl.GL_FRONT_AND_BACK, gl.GL_SHININESS, 100 )
私はこのようなものを見ることができます:
しかし、Blinn と Phong シェーディング モデルを使用すると (おそらく誰かが同様の問題に遭遇したことを期待して、すべてを貼り付けることを回避します)、次のようになります。
どちらの状況でも、質感の良いティーポットが見えないのはなぜですか? 法線と vt 座標を取得した後、新しい f 属性を VOB に送信する準備をしなければならないということですか?