first commit
This commit is contained in:
commit
52c163021c
BIN
__pycache__/camera.cpython-35.pyc
Normal file
BIN
__pycache__/camera.cpython-35.pyc
Normal file
Binary file not shown.
BIN
__pycache__/obj_loader.cpython-35.pyc
Normal file
BIN
__pycache__/obj_loader.cpython-35.pyc
Normal file
Binary file not shown.
BIN
__pycache__/shaders.cpython-35.pyc
Normal file
BIN
__pycache__/shaders.cpython-35.pyc
Normal file
Binary file not shown.
30
camera.py
Normal file
30
camera.py
Normal file
@ -0,0 +1,30 @@
|
||||
from OpenGL.GLU import *
|
||||
import math
|
||||
class Camera:
|
||||
def __init__(self,x,y,z):
|
||||
self.x=x
|
||||
self.y=y
|
||||
self.z=z
|
||||
self.tx=0.0
|
||||
self.ty=0.0
|
||||
self.tz=0.0
|
||||
self.pitch=0.0
|
||||
self.roll=0.0
|
||||
def move(self,x,y,z):
|
||||
self.x+=x
|
||||
self.y+=y
|
||||
self.z+=z
|
||||
def moveTo(self,x,y,z):
|
||||
self.x=x
|
||||
self.y=y
|
||||
self.z=z
|
||||
def rotate(self,x,y):
|
||||
self.roll+=x
|
||||
self.pitch+=y
|
||||
self.tx=math.cos(self.roll)*math.sin(self.pitch)
|
||||
self.ty=math.cos(self.pitch)
|
||||
self.tz=math.sin(self.roll)*math.sin(self.pitch)
|
||||
def look(self):
|
||||
gluLookAt(self.x,self.y,self.z,self.x+self.tx,self.y+self.ty,self.z+self.tz,0,1,0)
|
||||
def getPos(self):
|
||||
return self.x,self.y,self.z
|
||||
BIN
camera.pyc
Normal file
BIN
camera.pyc
Normal file
Binary file not shown.
13
cube.mtl
Normal file
13
cube.mtl
Normal file
@ -0,0 +1,13 @@
|
||||
# Blender MTL File: 'None'
|
||||
# Material Count: 1
|
||||
|
||||
newmtl Material
|
||||
Ns 96.078431
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.640000 0.640000 0.640000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.000000
|
||||
d 1.000000
|
||||
illum 2
|
||||
map_Kd fasfas.png
|
||||
12
cube2.mtl
Normal file
12
cube2.mtl
Normal file
@ -0,0 +1,12 @@
|
||||
# Blender MTL File: 'None'
|
||||
# Material Count: 1
|
||||
|
||||
newmtl Material
|
||||
Ns 96.078431
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.640000 0.640000 0.640000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
Ni 1.000000
|
||||
d 1.000000
|
||||
illum 2
|
||||
26
cube2.obj
Normal file
26
cube2.obj
Normal file
@ -0,0 +1,26 @@
|
||||
# Blender v2.76 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib cube2.mtl
|
||||
o Cube
|
||||
v 1.000000 -1.000000 -1.000000
|
||||
v 1.000000 -1.000000 1.000000
|
||||
v -1.000000 -1.000000 1.000000
|
||||
v -1.000000 -1.000000 -1.000000
|
||||
v 1.000000 1.000000 -0.999999
|
||||
v 0.999999 1.000000 1.000001
|
||||
v -1.000000 1.000000 1.000000
|
||||
v -1.000000 1.000000 -1.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 1.000000 0.000000 0.000000
|
||||
vn -0.000000 -0.000000 1.000000
|
||||
vn -1.000000 -0.000000 -0.000000
|
||||
vn 0.000000 0.000000 -1.000000
|
||||
usemtl Material
|
||||
s off
|
||||
f 1//1 2//1 3//1 4//1
|
||||
f 5//2 8//2 7//2 6//2
|
||||
f 1//3 5//3 6//3 2//3
|
||||
f 2//4 6//4 7//4 3//4
|
||||
f 3//5 7//5 8//5 4//5
|
||||
f 5//6 1//6 4//6 8//6
|
||||
BIN
fasfas.png
Normal file
BIN
fasfas.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
20061
get-pip.py
Normal file
20061
get-pip.py
Normal file
File diff suppressed because it is too large
Load Diff
93
main.py
Normal file
93
main.py
Normal file
@ -0,0 +1,93 @@
|
||||
import pygame
|
||||
from pygame.locals import *
|
||||
|
||||
import glfw
|
||||
|
||||
import math
|
||||
|
||||
import time
|
||||
|
||||
from OpenGL.GL import *
|
||||
from OpenGL.GLU import *
|
||||
from OpenGL.arrays import vbo
|
||||
|
||||
import numpy as np
|
||||
from ctypes import *
|
||||
from camera import *
|
||||
from obj_loader import *
|
||||
from shaders import *
|
||||
|
||||
def main():
|
||||
pygame.init()
|
||||
display = (800,600)
|
||||
pygame.display.set_mode(display, OPENGL|DOUBLEBUF)
|
||||
i=0
|
||||
running=True
|
||||
cam=Camera(0,0,0)
|
||||
vsh=open("shader.vsh")
|
||||
fsh=open("shader.fsh")
|
||||
shader=Shader(vsh,fsh)
|
||||
rel=np.array([0,0])
|
||||
dpi=200.0
|
||||
rel2=np.array([0,0])
|
||||
pygame.mouse.set_visible(False)
|
||||
pygame.event.set_grab(True)
|
||||
glMatrixMode(GL_PROJECTION)
|
||||
gluPerspective(60,800.0/600.0,0.1,1000.0)
|
||||
glMatrixMode(GL_MODELVIEW)
|
||||
glEnable(GL_DEPTH_TEST)
|
||||
glEnable(GL_LIGHTING)
|
||||
glEnable(GL_LIGHT0)
|
||||
glEnable(GL_COLOR_MATERIAL)
|
||||
|
||||
glEnableClientState(GL_VERTEX_ARRAY)
|
||||
glEnableClientState(GL_NORMAL_ARRAY)
|
||||
|
||||
glLightfv(GL_LIGHT0,GL_DIFFUSE,(1.0,1.0,1.0,1.0))
|
||||
glLightfv(GL_LIGHT0,GL_AMBIENT,(0.2,0.2,0.2,1.0))
|
||||
|
||||
obj=Object("cube.obj",(0.0,0.0,-2.0),True )
|
||||
while running:
|
||||
ticks=pygame.time.get_ticks()
|
||||
pressed=pygame.key.get_pressed()
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
running=False
|
||||
glClearColor(0.0,0.0,0.0,1.0)
|
||||
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
|
||||
glPushMatrix()
|
||||
shader.use()
|
||||
cam.rotate(rel[0]/dpi,rel[1]/dpi)
|
||||
cam.look()
|
||||
obj.draw()
|
||||
glLightfv(GL_LIGHT0,GL_POSITION,cam.getPos())
|
||||
glPopMatrix()
|
||||
pygame.display.flip()
|
||||
rel=np.array(pygame.mouse.get_rel())
|
||||
pygame.mouse.set_pos(display[0]/2, display[1]/2)
|
||||
rel2=np.array(pygame.mouse.get_rel())
|
||||
ticks=pygame.time.get_ticks()-ticks
|
||||
if ticks>0:
|
||||
fps=math.floor(1000000.0/(ticks*1000.0))
|
||||
else:
|
||||
fps=1000000.0
|
||||
print(fps)
|
||||
dt=ticks/1000.0
|
||||
mx,my=math.sin(cam.roll),math.cos(cam.roll)
|
||||
if pressed[pygame.K_d]:
|
||||
cam.move(-mx*dt,0,my*dt)
|
||||
if pressed[pygame.K_a]:
|
||||
cam.move(mx*dt,0,-my*dt)
|
||||
if pressed[pygame.K_w]:
|
||||
cam.move(my*dt,0,mx*dt)
|
||||
if pressed[pygame.K_s]:
|
||||
cam.move(-my*dt,0,-mx*dt)
|
||||
if pressed[pygame.K_SPACE]:
|
||||
cam.move(0,dt,0)
|
||||
if pressed[pygame.K_LCTRL]:
|
||||
cam.move(0,-dt,0)
|
||||
if pressed[pygame.K_ESCAPE]:
|
||||
running=False
|
||||
pygame.quit()
|
||||
quit()
|
||||
main()
|
||||
118
obj_loader.py
Normal file
118
obj_loader.py
Normal file
@ -0,0 +1,118 @@
|
||||
from OpenGL.GL import *
|
||||
from ctypes import *
|
||||
import numpy as np
|
||||
from math import *
|
||||
class Object:
|
||||
file=None
|
||||
vertices=[]
|
||||
normals=[]
|
||||
faces=[]
|
||||
materials=[]
|
||||
lists=[]
|
||||
r=[0,0,0]
|
||||
texcoords=[]
|
||||
def __init__(self,filename,pos,smoothnormals):
|
||||
self.smoothnormals=smoothnormals
|
||||
self.pos=pos
|
||||
self.file=open(filename, 'r')
|
||||
for line in self.file:
|
||||
l=line.split()
|
||||
if len(l)>0:
|
||||
command=l[0]
|
||||
words=l[1:]
|
||||
if command=='v':
|
||||
self.vertices.append((float(words[0]),float(words[1]),float(words[2])))
|
||||
elif command=='vn':
|
||||
self.normals.append((float(words[0]),float(words[1]),float(words[2])))
|
||||
elif command=='vt':
|
||||
self.texcoords.append((float(words[0]),float(words[1])))
|
||||
elif command=='f':
|
||||
if len(words)==3:
|
||||
self.faces.append((int(words[0].split("/",2)[2])-1,\
|
||||
int(words[0].split("/",2)[0])-1,\
|
||||
int(words[1].split("/",2)[0])-1,\
|
||||
int(words[2].split("/",2)[0])-1))
|
||||
elif len(words)==4:
|
||||
self.faces.append((int(words[0].split("/",2)[2])-1,\
|
||||
int(words[0].split("/",2)[0])-1,\
|
||||
int(words[1].split("/",2)[0])-1,\
|
||||
int(words[2].split("/",2)[0])-1,\
|
||||
int(words[3].split("/",2)[0])-1))
|
||||
else:
|
||||
print("Only Quads and Triangles are supported")
|
||||
elif command=="mtllib":
|
||||
filen=words[0]
|
||||
f=open(filen, 'r')
|
||||
for lin in f:
|
||||
li=lin.split()
|
||||
if len(li)>=1:
|
||||
com=li[0]
|
||||
other=li[1:]
|
||||
if com=="newmtl":
|
||||
name=other
|
||||
else:
|
||||
continue
|
||||
self.file.close()
|
||||
if self.smoothnormals:
|
||||
nn=[]
|
||||
for i in range(len(self.vertices)):
|
||||
nn.append(None)
|
||||
for i in range(len(self.vertices)):
|
||||
vecX=0.0
|
||||
vecY=0.0
|
||||
vecZ=0.0
|
||||
num=0
|
||||
for face in self.faces:
|
||||
for vertex in face[1:]:
|
||||
if vertex==i:
|
||||
vecX+=self.normals[face[0]][0]
|
||||
vecY+=self.normals[face[0]][1]
|
||||
vecZ+=self.normals[face[0]][2]
|
||||
num+=1
|
||||
if num>0:
|
||||
vecX/=num
|
||||
vecY/=num
|
||||
vecZ/=num
|
||||
d=sqrt(vecX*vecX+vecY*vecY+vecZ*vecZ)
|
||||
if d>0:
|
||||
vecX/=d
|
||||
vecY/=d
|
||||
vecZ/=d
|
||||
nn[i]=(vecX,vecY,vecZ)
|
||||
self.normals=nn
|
||||
self.num=glGenLists(1)
|
||||
glNewList(self.num,GL_COMPILE)
|
||||
for face in self.faces:
|
||||
if len(face)==5:
|
||||
glBegin(GL_QUADS)
|
||||
glNormal3fv(self.normals[face[1]])
|
||||
glVertex3fv(self.vertices[face[1]])
|
||||
glNormal3fv(self.normals[face[2]])
|
||||
glVertex3fv(self.vertices[face[2]])
|
||||
glNormal3fv(self.normals[face[3]])
|
||||
glVertex3fv(self.vertices[face[3]])
|
||||
glNormal3fv(self.normals[face[4]])
|
||||
glVertex3fv(self.vertices[face[4]])
|
||||
glEnd()
|
||||
else:
|
||||
glBegin(GL_TRIANGLES)
|
||||
glNormal3fv(self.normals[face[1]])
|
||||
glVertex3fv(self.vertices[face[1]])
|
||||
glNormal3fv(self.normals[face[2]])
|
||||
glVertex3fv(self.vertices[face[2]])
|
||||
glNormal3fv(self.normals[face[3]])
|
||||
glVertex3fv(self.vertices[face[3]])
|
||||
glEnd()
|
||||
glEndList()
|
||||
def draw(self):
|
||||
glPushMatrix()
|
||||
glRotatef(self.r[0],1,0,0)
|
||||
glRotatef(self.r[1],0,1,0)
|
||||
glRotatef(self.r[2],0,0,1)
|
||||
glTranslatef(self.pos[0],self.pos[1],self.pos[2])
|
||||
glCallList(self.num)
|
||||
glPopMatrix()
|
||||
def rotate(self,x,y,z):
|
||||
self.r[0]+=x
|
||||
self.r[1]+=y
|
||||
self.r[2]+=z
|
||||
BIN
obj_loader.pyc
Normal file
BIN
obj_loader.pyc
Normal file
Binary file not shown.
2
shader.fsh
Normal file
2
shader.fsh
Normal file
@ -0,0 +1,2 @@
|
||||
void main() {
|
||||
}
|
||||
2
shader.vsh
Normal file
2
shader.vsh
Normal file
@ -0,0 +1,2 @@
|
||||
void main() {
|
||||
}
|
||||
12
shaders.py
Normal file
12
shaders.py
Normal file
@ -0,0 +1,12 @@
|
||||
from OpenGL.GL import shaders
|
||||
from OpenGL.GL import *
|
||||
class Shader:
|
||||
def __init__(self,vertexShader,fragmentShader):
|
||||
self.program=glCreateProgram()
|
||||
self.vertexShader=shaders.compileShader(vertexShader,GL_VERTEX_SHADER)
|
||||
glAttachShader(self.program,self.vertexShader)
|
||||
self.fragmentShader=shaders.compileShader(fragmentShader,GL_FRAGMENT_SHADER)
|
||||
glAttachShader(self.program,self.fragmentShader)
|
||||
glLinkProgram(self.program)
|
||||
def use(self):
|
||||
glUseProgram(self.program)
|
||||
Loading…
x
Reference in New Issue
Block a user