我是一个业余程序员,用python3从头开始创建RPG,我用Pygame处理图形。你知道吗
目前,我必须渲染不同的多边形,很快我还必须添加线。我的帧速率只是多边形是可怕的,约1 FPS,我无法想象它会下降到什么,一旦我添加线。你知道吗
问题是,在我渲染多边形之前,我还要做大量的计算,甚至要知道在屏幕上放置多边形的位置,因为我使用的是我自己编码的三维图形,所以这可能是低帧率的另一个原因。你知道吗
是的,很乱。。。你知道吗
class Obj:
def __init__(self, x, y, z, points, lines, surfaces):
self.x = x
self.y = y
self.z = z
self.points = points
self.lines = lines
self.surfaces = surfaces
#Mapper function
def drawObj(self, x, y, z, ha, va, screen, width, height):
drawOrder = []
#Draw points
'''for point in self.points:
n = [0, 0, 0]
nx = point[0] + self.x - x
nz = point[2] + self.z - z
n[0] = nx*m.cos(va) - nz*m.sin(va) + x
n[2] = nz*m.cos(va) + nx*m.sin(va) + z
ny = point[1] + self.y - y
nz = n[2] - z
n[1] = ny*m.cos(ha) - nz*m.sin(ha) + y
n[2] = nz*m.cos(ha) + ny*m.sin(ha) + z
if n[2] > z - zoom:
drawOrder.append([n[2], 'point', [m.floor((n[0] - x)*zoom/(n[2] - (z - zoom)) + width/2), m.floor((n[1] - y)*zoom/(n[2] - (z - zoom)) + height/2)], max(0, 255 - dist(n[0], n[1], n[2], X, Y, Z)*fog)])
'''
#Draw lines
for line in self.lines:
#Point 1
n1 = [0, 0, 0]
n1x = self.points[line[0]][0] + self.x - x
n1z = self.points[line[0]][2] + self.z - z
n1[0] = n1x*m.cos(va) - n1z*m.sin(va) + x
n1[2] = n1z*m.cos(va) + n1x*m.sin(va) + z
n1y = self.points[line[0]][1] + self.y - y
n1z = n1[2] - z
n1[1] = n1y*m.cos(ha) - n1z*m.sin(ha) + y
n1[2] = n1z*m.cos(ha) + n1y*m.sin(ha) + z
#Point 2
n2 = [0, 0, 0]
n2x = self.points[line[1]][0] + self.x - x
n2z = self.points[line[1]][2] + self.z - z
n2[0] = n2x*m.cos(va) - n2z*m.sin(va) + x
n2[2] = n2z*m.cos(va) + n2x*m.sin(va) + z
n2y = self.points[line[1]][1] + self.y - y
n2z = n2[2] - z
n2[1] = n2y*m.cos(ha) - n2z*m.sin(ha) + y
n2[2] = n2z*m.cos(ha) + n2y*m.sin(ha) + z
#Set coords for line
l = [(n1[0] - x)*zoom/(n1[2] - (z - zoom)), (n1[1] - y)*zoom/(n1[2] - (z - zoom)), (n2[0] - x)*zoom/(n2[2] - (z - zoom)), (n2[1] - y)*zoom/(n2[2] - (z - zoom))]
#Primitive rebound workaround
'''if n1[2] <= z - zoom:
l[0] = m.inf
l[1] = m.inf
if n2[2] <= z - zoom:
l[2] = m.inf
l[3] = m.inf'''
drawOrder.append([(n1[2] + n2[2])/2, 'line', [m.floor(l[0] + width/2), m.floor(l[1] + height/2), m.floor(l[2] + width/2), m.floor(l[3] + height/2)], max(0, 255 - dist((n1[0] + n2[0])/2, (n1[1] + n2[1])/2, (n1[2] + n2[2])/2, X, Y, Z)*fog)])
#Draw surfaces
for surface in self.surfaces:
f = []
drawOrder.append([0, 'surface', [], []])
for i in range(1,len(surface)):
p = surface[i]
n = [0, 0, 0]
nx = self.points[p][0] + self.x - x
nz = self.points[p][2] + self.z - z
n[0] = nx*m.cos(va) - nz*m.sin(va) + x
n[2] = nz*m.cos(va) + nx*m.sin(va) + z
ny = self.points[p][1] + self.y - y
nz = n[2] - z
n[1] = ny*m.cos(ha) - nz*m.sin(ha) + y
n[2] = nz*m.cos(ha) + ny*m.sin(ha) + z
f.append([n[0],n[1],n[2]])
if n[2] > z - zoom:
drawOrder[len(drawOrder)-1][2].append([m.floor((n[0] - x)*zoom/(n[2] - (z - zoom)) + width/2), m.floor((n[1] - y)*zoom/(n[2] - (z - zoom)) + height/2)])
ax = 0
ay = 0
az = 0
for p in f:
ax += p[0]
ay += p[1]
az += p[2]
ax /= len(f)
ay /= len(f)
az /= len(f)
drawOrder[len(drawOrder)-1][0] = az
drawOrder[len(drawOrder)-1][3] = [surface[0][0], surface[0][1], surface[0][2], max(0, surface[0][3] - dist(ax,ay,az,x,y,z)*fog)]
drawOrder.sort(key = lambda a: a[0], reverse = True)
for drawTopic in drawOrder:
if drawTopic[1] == 'point':
'''color = (255, 255, 255, drawTopic[3])
pyg.draw.circle(screen, color, (drawTopic[2][0], drawTopic[2][1]), 0)'''
elif drawTopic[1] == 'line':
color = (255, 255, 255, drawTopic[3])
pyg.draw.line(screen, color, (drawTopic[2][0], drawTopic[2][1]), (drawTopic[2][2], drawTopic[2][3]))
elif drawTopic[1] == 'surface':
color = (drawTopic[3][0], drawTopic[3][1], drawTopic[3][2], drawTopic[3][3])
pyg.draw.polygon(screen, color, drawTopic[2])
有什么想法吗?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐