From dee0cd0168789cdeb0cf8d360b52a4ce24464f55 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 29 Sep 2011 09:56:47 +0900 Subject: [PATCH] implement bb --- examples/opengl/rokuro.py | 25 ++++++++++++++++++++----- examples/opengl/vertexarray.py | 32 ++++++++++++++++++++++++++++++++ examples/pmdbuilder.py | 1 + examples/pymeshviewer.py | 4 +++- 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/examples/opengl/rokuro.py b/examples/opengl/rokuro.py index 4871292..8bacfc2 100644 --- a/examples/opengl/rokuro.py +++ b/examples/opengl/rokuro.py @@ -1,19 +1,21 @@ #!/usr/bin/python # coding: utf-8 +import math from OpenGL.GL import * from OpenGL.GLU import * from . import baseview class RokuroView(baseview.BaseView): - def __init__(self, distance): + def __init__(self): super(RokuroView, self).__init__() self.w=1 self.h=1 self.head=0 self.pitch=0 - self.distance=distance + self.SHIFT_FACTOR=0.001 + self.distance=100 self.shiftX=0 self.shiftY=0 self.aspect=1 @@ -31,9 +33,8 @@ class RokuroView(baseview.BaseView): self.distance*=0.9 def shift(self, dx, dy): - FACTOR=0.001 - self.shiftX+=dx * self.distance * FACTOR - self.shiftY+=dy * self.distance * FACTOR + self.shiftX+=dx * self.distance * self.SHIFT_FACTOR + self.shiftY+=dy * self.distance * self.SHIFT_FACTOR def rotate(self, head, pitch): self.head+=head @@ -67,3 +68,17 @@ class RokuroView(baseview.BaseView): self.dolly(d) return True + def look_bb(self, min_v, max_v): + w=max_v[0]-min_v[0] + h=max_v[1]-min_v[1] + long_side=max(w, h) + def deglee_to_radian(deglee): + return math.pi*deglee/180.0 + d=long_side/math.tan(deglee_to_radian(30)) * 1.5 + self.distance=min_v[2]+d + cx=min_v[0]+max_v[0] + cy=min_v[1]+max_v[1] + print(cx, cy) + self.shiftX=-cx/2.0 + self.shiftY=-cy/2.0 + diff --git a/examples/opengl/vertexarray.py b/examples/opengl/vertexarray.py index 1c3b502..c1d758e 100644 --- a/examples/opengl/vertexarray.py +++ b/examples/opengl/vertexarray.py @@ -123,3 +123,35 @@ class IndexedVertexArray(object): self.vertices=numpy.array(self.vertices, 'f') self.uvlist=numpy.array(self.uvlist, 'f') + def get_boundingbox(self): + vertices_size=len(self.vertices) + if(vertices_size==0): + return ([0, 0, 0], [0, 0, 0]) + print('vertices_size %d' % vertices_size) + print(self.vertices[0]) + def vertex_gen_factory(): + for i in range(0, vertices_size, 4): + yield [ + self.vertices[i], + self.vertices[i+1], + self.vertices[i+2] + ] + vertex_gen=vertex_gen_factory() + v=next(vertex_gen) + max_v=v[:] + min_v=v[:] + for v in vertex_gen: + if v[0]max_v[0]: + max_v[0]=v[0] + if v[1]>max_v[1]: + max_v[1]=v[1] + if v[2]>max_v[2]: + max_v[2]=v[2] + return (min_v, max_v) + diff --git a/examples/pmdbuilder.py b/examples/pmdbuilder.py index 96feccb..c758e34 100644 --- a/examples/pmdbuilder.py +++ b/examples/pmdbuilder.py @@ -16,6 +16,7 @@ def build(path): if not io.read(path): return print(time.time()-t, "sec") + print(io) # build basedir=os.path.dirname(path) indexedVertexArray=opengl.vertexarray.IndexedVertexArray() diff --git a/examples/pymeshviewer.py b/examples/pymeshviewer.py index 491433b..f617d2a 100644 --- a/examples/pymeshviewer.py +++ b/examples/pymeshviewer.py @@ -27,7 +27,8 @@ class Frame(tkinter.Frame): menu_file.add_command(label='Open', under=0, command=self.onOpen) # setup opengl widget - self.glworld=opengl.BaseController(opengl.rokuro.RokuroView(500)) + self.view=opengl.rokuro.RokuroView() + self.glworld=opengl.BaseController(self.view) self.glwidget=togl.Widget(self, self.glworld, width=width, height=height) self.glwidget.pack(fill=tkinter.BOTH, expand=True) @@ -50,6 +51,7 @@ class Frame(tkinter.Frame): return self.glworld.setRoot(model) print('load %s' % path) + self.view.look_bb(*model.get_boundingbox()) self.glwidget.onDraw() def loadModel(self, path): -- 2.11.0