代码之家  ›  专栏  ›  技术社区  ›  SurvivalMachine

pyopengl:glvertexpointer()偏移问题

  •  4
  • SurvivalMachine  · 技术社区  · 16 年前

    我的顶点交错在一个numpy数组(dtype=float32)中,如下所示:时间单位,电视,nx,ny,nz,vx,vy,vz,…

    渲染时,我这样调用gl*pointer()(我以前启用过数组):

    stride = (2 + 3 + 3) * 4
    glTexCoordPointer( 2, GL_FLOAT, stride, self.vertArray )
    glNormalPointer( GL_FLOAT, stride, self.vertArray + 2 )
    glVertexPointer( 3, GL_FLOAT, stride, self.vertArray + 5 )
    glDrawElements( GL_TRIANGLES, len( self.indices ), GL_UNSIGNED_SHORT, self.indices )
    

    结果是没有渲染。但是,如果我组织我的数组,使顶点位置是第一个元素(…VX、VY、VZ、TU、TV、NX、NY、NZ等)我在渲染时得到了顶点的正确位置,但纹理坐标和法线没有正确渲染。

    这让我相信我没有将指针偏移设置正确。我应该如何设置?我在C++的其他应用程序中使用了几乎完全相同的代码。

    4 回复  |  直到 15 年前
        1
  •  3
  •   Xavier Ho    16 年前

    在Python中,不能进行指针算术。你想做的只是对C/C++进行工作。

    使用普通的python列表:

    >>> array = [1, 2, 3, 4]
    >>> array
    [1, 2, 3, 4]
    >>> array + 2
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    TypeError: can only concatenate list (not "int") to list
    

    使用numpy数组:

    >>> import numpy
    >>> a = numpy.array([1, 2, 3])
    >>> a + 2
    array([3, 4, 5])
    

    看看您想要的是什么:在某个位置启动数组。

    我认为你基本上有两种选择:

    1. 不要使用交错数组。这确实有一个优点:当您只需要更新顶点(如骨骼动画)时,不需要更新纹理坐标。
    2. 使用切片 可以 为你工作。

    这样地:

    >>> a = numpy.array(range(10))
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> a[3:]
    array([3, 4, 5, 6, 7, 8, 9])
    

    把这和正确的步伐结合起来,你可能会使它工作起来。

        2
  •  3
  •   Exide    15 年前

    我遇到了一个类似的问题,发现将偏移量 ctypes.c_void_p 做了这个把戏。

    from ctypes import c_void_p
    
    t_size = self.vertArray.itemsize * 2
    n_size = self.vertArray.itemsize * 3
    
    t_offset = c_void_p(0)
    n_offset = c_void_p(t_size)
    v_offset = c_void_p(t_size+n_size)
    
    glTexCoordPointer( 2, GL_FLOAT, stride, t_offset )
    glNormalPointer( GL_FLOAT, stride, n_offset )
    glVertexPointer( 3, GL_FLOAT, stride, v_offset )
    glDrawElements( GL_TRIANGLES, len( self.indices ), GL_UNSIGNED_SHORT, self.indices )
    
        3
  •  0
  •   SurvivalMachine    16 年前

    我在回答自己的问题,因为我找到了另一种方法来实现正确的结果。我没有调用gl*pointer(),而是调用了:

    glInterleavedArrays( GL_T2F_N3F_V3F, stride, self.vertArray )
    

    我仍然很想找到一个能与gl*pointer()一起工作的解决方案。

        4
  •  0
  •   Wiseman    16 年前

    根据此链接: http://www.opengl.org/sdk/docs/man/xhtml/glTexCoordPointer.xml

    步幅

    指定之间的字节偏移量 连续纹理坐标集。 如果stride为0,则数组元素为 应紧密包装。这个 初始值为0。

    你确定你的步幅是(2+3+3)*4吗?