Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenGL-渲染纹理茶壶-.obj面和法线_Python_Opengl_Texturing - Fatal编程技术网

Python OpenGL-渲染纹理茶壶-.obj面和法线

Python OpenGL-渲染纹理茶壶-.obj面和法线,python,opengl,texturing,Python,Opengl,Texturing,我有一个.obj文件,其中只有v和f参数 我有一个任务,把它“包围”在一个长方体中(由每个轴上的最大和最小顶点定义),计算它的中心,然后将茶壶顶点的空间坐标与中心坐标分开,这样我就得到了一个向量,开始在茶壶的中心,结束在茶壶的表面,然后找到这些向量的位置(光线)与外长方体的表面相交。长方体的每个面都必须模拟一个图像。然后,我必须计算每个顶点的纹理坐标-只需从3D交点获取2D参数,然后对结果进行规格化,使其位于0和1之间(在二维中) 因此,我用一些适当的代码行打开.obj文件,然后进行所有描述的计

我有一个.obj文件,其中只有vf参数

我有一个任务,把它“包围”在一个长方体中(由每个轴上的最大和最小顶点定义),计算它的中心,然后将茶壶顶点的空间坐标与中心坐标分开,这样我就得到了一个向量,开始在茶壶的中心,结束在茶壶的表面,然后找到这些向量的位置(光线)与外长方体的表面相交。长方体的每个面都必须模拟一个图像。然后,我必须计算每个顶点的纹理坐标-只需从3D交点获取2D参数,然后对结果进行规格化,使其位于0和1之间(在二维中)

因此,我用一些适当的代码行打开.obj文件,然后进行所有描述的计算以找到vt参数,然后使用一个函数,该函数允许我使用一个索引顶点列表来获取法线,该列表生成三角形(面属性)和一个顶点列表

看起来是这样的(它实际上由两个函数组成,在两个不同的文件中):

(一)

其中self.arrs[0]是取自.obj的v属性列表,tind是构成面的顶点的3个元素列表

(二)

其中“范数”是线性代数NumPy集合中的函数

之后,我创建一个VOB对象:

self.vob = VOB(arrs = [vert, point, normals],indx=self.obj.indx)
简而言之,我使用VOB对象将其发送到GPU

vert-取自.obj的顶点列表 点-以上述方式计算的纹理坐标列表 法线-使用上述函数计算的法线向量列表 self.obj.indx-由.obj中的f属性组成的列表

我使用的纹理图像:

当我试图用经典的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

可能是面顶点的缠绕方向不一致,导致一些法线向内,扰乱了照明计算。理想情况下,模型文件中的数据具有正确定向的面,但可以从种子面开始重新定向面,然后从种子面开始工作。此问题已在此处介绍:

快速修复方法是实现双面照明模式;基本上,如果基本体背面朝
…*,则会否定照明点积的结果!正面的-1:1
,然后夹紧到正值

至于纹理坐标生成:从技术上讲,您可以实现立方体贴图纹理坐标映射,该映射将一张图片用于立方体的所有6个面,并将顶点位置用作纹理坐标。或者,只需将同一图像加载到立方体贴图的6个子图像中,并直接使用“位置”属性作为纹理查找的坐标

self.vob = VOB(arrs = [vert, point, normals],indx=self.obj.indx)
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 )