Added track ball controls
This commit is contained in:
parent
7f8e68fe96
commit
1eedef65ee
|
@ -17,6 +17,12 @@ class Vertex:
|
||||||
def __add__(self, other):
|
def __add__(self, other):
|
||||||
return Vertex(self.x + other.x, self.y + other.y, self.z + other.z)
|
return Vertex(self.x + other.x, self.y + other.y, self.z + other.z)
|
||||||
|
|
||||||
|
def __mul__(self, other):
|
||||||
|
return Vertex(self.x * other, self.y * other, self.z * other)
|
||||||
|
|
||||||
|
def __rmul__(self, other):
|
||||||
|
return self.__mul__(other)
|
||||||
|
|
||||||
def norm2(self):
|
def norm2(self):
|
||||||
return self.x * self.x + self.y * self.y + self.z * self.z
|
return self.x * self.x + self.y * self.y + self.z * self.z
|
||||||
|
|
||||||
|
@ -45,6 +51,9 @@ class Vertex:
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '(' + ", ".join([str(self.x), str(self.y), str(self.z)]) + ")"
|
return '(' + ", ".join([str(self.x), str(self.y), str(self.z)]) + ")"
|
||||||
|
|
||||||
|
def dot(self, other):
|
||||||
|
return self.x * other.x + self.y * other.y + self.z * other.z
|
||||||
|
|
||||||
Normal = Vertex
|
Normal = Vertex
|
||||||
TexCoord = Vertex
|
TexCoord = Vertex
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import ctypes
|
||||||
import pygame
|
import pygame
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
|
import math
|
||||||
|
|
||||||
from pygame.locals import *
|
from pygame.locals import *
|
||||||
from OpenGL.GL import *
|
from OpenGL.GL import *
|
||||||
|
@ -12,6 +13,7 @@ from OpenGL.GLU import *
|
||||||
from OpenGL.GLUT import *
|
from OpenGL.GLUT import *
|
||||||
|
|
||||||
from conv3d.loadmodel import load_model
|
from conv3d.loadmodel import load_model
|
||||||
|
from conv3d.model import Vertex
|
||||||
|
|
||||||
|
|
||||||
WINDOW_WIDTH = 1024
|
WINDOW_WIDTH = 1024
|
||||||
|
@ -22,15 +24,55 @@ y = 0.5
|
||||||
width = 1
|
width = 1
|
||||||
height = 1
|
height = 1
|
||||||
|
|
||||||
|
class TrackBallControls:
|
||||||
|
def __init__(self):
|
||||||
|
self.vertex = Vertex()
|
||||||
|
self.theta = 0
|
||||||
|
|
||||||
|
def apply(self):
|
||||||
|
glRotatef(self.theta * 180 / math.pi, self.vertex.x, self.vertex.y, self.vertex.z)
|
||||||
|
|
||||||
|
def update(self, time = 10):
|
||||||
|
|
||||||
|
if not pygame.mouse.get_pressed()[0]:
|
||||||
|
return
|
||||||
|
|
||||||
|
coeff = 0.001
|
||||||
|
move = pygame.mouse.get_rel()
|
||||||
|
|
||||||
|
dV = Vertex(move[1] * time * coeff, move[0] * time * coeff, 0)
|
||||||
|
dTheta = dV.norm2()
|
||||||
|
|
||||||
|
if abs(dTheta) < 0.01:
|
||||||
|
return
|
||||||
|
|
||||||
|
dV.normalize()
|
||||||
|
|
||||||
|
cosT2 = math.cos(self.theta / 2)
|
||||||
|
sinT2 = math.sin(self.theta / 2)
|
||||||
|
cosDT2 = math.cos(dTheta / 2)
|
||||||
|
sinDT2 = math.sin(dTheta / 2)
|
||||||
|
|
||||||
|
A = cosT2 * sinDT2 * dV + cosDT2 * sinT2 * self.vertex + sinDT2 * sinT2 * Vertex.cross_product(dV, self.vertex)
|
||||||
|
|
||||||
|
self.theta = 2 * math.acos(cosT2 * cosDT2 - sinT2 * sinDT2 * Vertex.dot(dV, self.vertex))
|
||||||
|
|
||||||
|
self.vertex = A
|
||||||
|
self.vertex.normalize()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def init_frame():
|
def init_frame():
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
||||||
glMatrixMode(GL_MODELVIEW)
|
glMatrixMode(GL_MODELVIEW)
|
||||||
glLoadIdentity()
|
glLoadIdentity()
|
||||||
gluLookAt(5,5,5,0,0,0,0,1,0)
|
gluLookAt(0,0,5,0,0,0,0,1,0)
|
||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
|
|
||||||
|
controls = TrackBallControls()
|
||||||
|
|
||||||
pygame.init()
|
pygame.init()
|
||||||
display = (WINDOW_WIDTH, WINDOW_HEIGHT)
|
display = (WINDOW_WIDTH, WINDOW_HEIGHT)
|
||||||
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
|
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
|
||||||
|
@ -63,11 +105,22 @@ def main(args):
|
||||||
if event.key == pygame.K_ESCAPE:
|
if event.key == pygame.K_ESCAPE:
|
||||||
pygame.quit()
|
pygame.quit()
|
||||||
quit()
|
quit()
|
||||||
|
elif event.type == pygame.MOUSEBUTTONDOWN:
|
||||||
|
pygame.mouse.get_rel()
|
||||||
|
|
||||||
init_frame()
|
init_frame()
|
||||||
|
|
||||||
|
glPushMatrix()
|
||||||
|
controls.apply()
|
||||||
model.gl_draw()
|
model.gl_draw()
|
||||||
|
glPopMatrix()
|
||||||
|
|
||||||
glFlush()
|
glFlush()
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|
||||||
|
# Update physics
|
||||||
|
controls.update()
|
||||||
|
|
||||||
pygame.time.wait(10)
|
pygame.time.wait(10)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue