OSDN Git Service

implement bb
authorousttrue <ousttrue@gmail.com>
Thu, 29 Sep 2011 00:56:47 +0000 (09:56 +0900)
committerousttrue <ousttrue@gmail.com>
Thu, 29 Sep 2011 00:56:47 +0000 (09:56 +0900)
examples/opengl/rokuro.py
examples/opengl/vertexarray.py
examples/pmdbuilder.py
examples/pymeshviewer.py

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