代码拉出一个没有类型pyglet的对象

问题描述

这是我知道出错的代码

    self.scale_loc = glGetUniformlocation(shader,b"scale")

    self.rotate_loc = glGetUniformlocation(shader,b"rotate")

    self.scale = pyrr.Matrix44.identity()
    
    self.rot_y = pyrr.Matrix44.identity()

def rotate(self):
    self.scale = pyrr.Matrix44.from_scale(pyrr.Vector3([0.2,0.2,1.0])).flatten()
    
    self.rot_y = pyrr.Matrix44.from_y_rotation(time.perf_counter() * 2).flatten
    
    #self.rot_y = [y for x in self.rot_y for y in x]
    c_scale = (GLfloat * len(self.scale))(*self.scale)
    c_rotate_y = (GLfloat * len(self.rot_y))(*self.rot_y)

    gluniformMatrix4fv(self.scale_loc,1,GL_FALSE,c_scale)
    gluniformMatrix4fv(self.rotate_loc,c_rotate_y)

错误

   c_rotate_y = (GLfloat * len(self.rot_y))(*self.rot_y)
   TypeError: object of type 'builtin_function_or_method' has no len()

我不知道它是否已过时或什么。我正在学习 4 年前的教程系列。如果您需要更多信息,请告诉我

解决方法

Pyrr - Matrices 由二维 NumPy 数组表示。要将 NumPy 数组转换为 ctypes,您必须flatten 它。数组中的元素个数可以从size属性中获取:

self.scale = pyrr.Matrix44.from_scale(pyrr.Vector3([0.2,0.2,1.0])).flatten()
self.rot_y = pyrr.Matrix44.from_y_rotation(time.perf_counter() * 2).flatten()

c_scale = (GLfloat * self.scale.size)(*self.scale)
c_rotate_y = (GLfloat * self.rot_y.size)(*self.rot_y)

glUniformMatrix4fv(self.scale_loc,1,GL_FALSE,c_scale)
glUniformMatrix4fv(self.rotate_loc,c_rotate_y)