2

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 に送信する準備をしなければならないということですか?

4

1 に答える 1