source: inundation/ga/storm_surge/pyvolution-parallel/realtime_visualisation_new.py @ 1520

Last change on this file since 1520 was 1264, checked in by steve, 20 years ago

Using vpython faces to speed up visualisation

File size: 4.9 KB
Line 
1from visual import *
2
3class Surface:
4    def __init__(self,domain,scale=1.0/1.0):
5        """Create visualisation of domain
6        """
7
8        self.frame  = frame()
9        self.bed_model     = faces(frame=self.frame)
10        self.stage_model = faces(frame=self.frame)
11        self.domain = domain
12        self.scale  = scale
13
14        self.vertices = domain.vertex_coordinates
15        self.bed   = domain.quantities['elevation'].vertex_values
16        self.stage = domain.quantities['stage'].vertex_values
17
18        self.max_x = max(max(self.vertices[:,0],self.vertices[:,2],self.vertices[:,4]))
19        self.min_x = min(min(self.vertices[:,0],self.vertices[:,2],self.vertices[:,4]))
20        self.max_y = max(max(self.vertices[:,1],self.vertices[:,3],self.vertices[:,5]))
21        self.min_y = min(min(self.vertices[:,1],self.vertices[:,3],self.vertices[:,5]))
22        self.range_x = self.max_x - self.min_x
23        self.range_y = self.max_y - self.min_y
24
25        self.range_xy = max(self.range_x, self.range_y)
26
27        self.max_bed = max(self.bed)
28        self.min_bed = min(self.bed)
29        self.range_bed = self.max_bed - self.min_bed
30
31        print self.max_x, self.min_x, self.max_y, self.min_y, self.min_bed
32        print self.max_bed, self.range_x, self.range_y, self.range_xy, self.range_bed
33
34        print 'Calculating triangles'
35
36        self.pos     = zeros( (6*len(domain),3), Float)
37        self.colour  = zeros( (6*len(domain),3), Float)
38        self.normals = zeros( (6*len(domain),3), Float)
39
40        print 'keys',self.domain.quantities.keys()
41        print 'shape of stage',shape(self.stage)
42
43        self.update_all()
44
45    def update_all(self):
46
47        self.update_bed()
48        self.update_stage()
49
50    def update_bed(self):
51
52        print 'update bed arrays'
53        c0 = 0.3
54        c1 = 0.3
55        c2 = 0.3
56        self.update_arrays(self.bed,  (c0,c1,c2) )
57        print 'update bed image'
58        self.bed_model.pos    = self.pos
59        self.bed_model.color  = self.colour
60        self.bed_model.normal = self.normals
61
62
63    def update_stage(self):
64        c0 = 0.1
65        c1 = 0.4
66        c2 = 0.99
67        print 'update stage arrays'
68        self.update_arrays(self.stage, (c0,c1,c2) )
69        print 'update stage image'
70        self.stage_model.pos    = self.pos
71        self.stage_model.color  = self.colour
72        self.stage_model.normal = self.normals
73
74    def calc_normal(self,v):
75
76        from math import sqrt
77
78        cross = zeros(3,Float)
79        normal = zeros(3,Float)
80
81        v10 = v[1,:]-v[0,:]
82        v20 = v[2,:]-v[0,:]
83
84        normal[0] = v10[1]*v20[2] - v20[1]*v10[2]
85        normal[1] = v10[2]*v20[0] - v20[2]*v10[0]
86        normal[2] = v10[0]*v20[1] - v20[0]*v10[1]
87
88        norm = sqrt( normal[0]**2 + normal[1]**2 + normal[2]**2)
89
90        normal[0] = normal[0]/norm
91        normal[1] = normal[1]/norm
92        normal[2] = normal[2]/norm
93
94        return normal
95
96
97
98    def update_arrays(self, quantity, qcolor):
99
100        col = asarray(qcolor)
101        v = zeros( (3,3), Float)
102        normal = zeros( 3, Float)
103        N = len(self.domain)
104        scale = self.scale
105
106
107
108        for i in range( N ):
109
110            for j in range(3):
111                v[j,0] = 2.0*(self.vertices[i,2*]-self.min_x)/self.range_xy-1.0
112                v[j,1] = 2.0*(self.vertices[i,2*j+1]-self.min_y)/self.range_xy-1.0
113                v[j,2] = quantity[i,j]*scale
114
115
116
117            normal = self.calc_normal(v)
118
119            self.pos[6*,:] = v[0,:]
120            self.pos[6*i+1,:] = v[1,:]
121            self.pos[6*i+2,:] = v[2,:]
122            self.pos[6*i+3,:] = v[0,:]
123            self.pos[6*i+4,:] = v[2,:]
124            self.pos[6*i+5,:] = v[1,:]
125
126
127
128            self.colour[6*,:] = col
129            self.colour[6*i+1,:] = col
130            self.colour[6*i+2,:] = col
131            self.colour[6*i+3,:] = col
132            self.colour[6*i+4,:] = col
133            self.colour[6*i+5,:] = col
134
135            self.normals[6*,:] = normal
136            self.normals[6*i+1,:] = normal
137            self.normals[6*i+2,:] = normal
138            self.normals[6*i+3,:] = -normal
139            self.normals[6*i+4,:] = -normal
140            self.normals[6*i+5,:] = -normal
141
142
143
144
145#scene.width = 1000
146#scene.height = 800
147
148#Original
149#scene.center = (0.5,0.5,0)
150#scene.forward = vector(-0.1, 0.5, -0.5)
151
152#Temporary (for bedslope)
153#scene.forward = vector(0.0006, 0.7, -0.03)
154
155
156#Temporary for hackett - begin
157#scene.autoscale = 0
158#scene.scale = (0.002, 0.002, 0.01) #Scale z so that countours stand out more
159#scene.center = (300.0,500.0,-10)
160#Temporary for hackett - end
161
162
163#scene.ambient = 0.4
164#scene.lights = [(0.6, 0.3, 0.2), (0.1, -0.5, 0.4), (-0.1, 0.1, -0.4),
165#               (-0.2, 0.2, 0.1)]
166
167
168def create_surface(domain):
169
170    surface = Surface(domain)
171    domain.surface = surface
172
173def update(domain):
174
175    surface = domain.surface
176    surface.update_stage()
177
178
179
Note: See TracBrowser for help on using the repository browser.