agerhund commited on
Commit
289f097
·
verified ·
1 Parent(s): 2741b37

Upload 43 files

Browse files
Files changed (43) hide show
  1. horizonnet/__init__.py +0 -0
  2. horizonnet/__pycache__/__init__.cpython-39.pyc +0 -0
  3. horizonnet/__pycache__/dataset.cpython-39.pyc +0 -0
  4. horizonnet/__pycache__/inference.cpython-39.pyc +0 -0
  5. horizonnet/__pycache__/model.cpython-39.pyc +0 -0
  6. horizonnet/dataset.py +280 -0
  7. horizonnet/inference.py +223 -0
  8. horizonnet/misc/__init__.py +0 -0
  9. horizonnet/misc/__pycache__/__init__.cpython-39.pyc +0 -0
  10. horizonnet/misc/__pycache__/panostretch.cpython-39.pyc +0 -0
  11. horizonnet/misc/__pycache__/post_proc.cpython-39.pyc +0 -0
  12. horizonnet/misc/__pycache__/utils.cpython-39.pyc +0 -0
  13. horizonnet/misc/gen_txt_structured3d.py +52 -0
  14. horizonnet/misc/pano_lsd_align.py +914 -0
  15. horizonnet/misc/panostretch.py +178 -0
  16. horizonnet/misc/post_proc.py +359 -0
  17. horizonnet/misc/structured3d_extract_zip.py +61 -0
  18. horizonnet/misc/structured3d_prepare_dataset.py +57 -0
  19. horizonnet/misc/utils.py +77 -0
  20. horizonnet/misc/zind_prepare_dataset.py +106 -0
  21. horizonnet/model.py +281 -0
  22. horizonnet/preprocess.py +82 -0
  23. horizonnet/traduccion.py +231 -0
  24. modelos_3D/bookcaseOpen.mtl +7 -0
  25. modelos_3D/bookcaseOpen.obj +993 -0
  26. modelos_3D/cabinetTelevision.mtl +7 -0
  27. modelos_3D/cabinetTelevision.obj +522 -0
  28. modelos_3D/loungeChair.mtl +12 -0
  29. modelos_3D/loungeChair.obj +500 -0
  30. modelos_3D/loungeDesignSofaCorner.mtl +12 -0
  31. modelos_3D/loungeDesignSofaCorner.obj +727 -0
  32. modelos_3D/loungeSofa.mtl +12 -0
  33. modelos_3D/loungeSofa.obj +498 -0
  34. modelos_3D/tableCoffee.mtl +7 -0
  35. modelos_3D/tableCoffee.obj +446 -0
  36. modelos_3D/wall.mtl +17 -0
  37. modelos_3D/wall.obj +76 -0
  38. modelos_3D/wallCorner.mtl +17 -0
  39. modelos_3D/wallCorner.obj +135 -0
  40. modelos_3D/wallDoorway.mtl +17 -0
  41. modelos_3D/wallDoorway.obj +258 -0
  42. modelos_3D/wallWindow.mtl +22 -0
  43. modelos_3D/wallWindow.obj +391 -0
horizonnet/__init__.py ADDED
File without changes
horizonnet/__pycache__/__init__.cpython-39.pyc ADDED
Binary file (179 Bytes). View file
 
horizonnet/__pycache__/dataset.cpython-39.pyc ADDED
Binary file (8.39 kB). View file
 
horizonnet/__pycache__/inference.cpython-39.pyc ADDED
Binary file (6.16 kB). View file
 
horizonnet/__pycache__/model.cpython-39.pyc ADDED
Binary file (9.76 kB). View file
 
horizonnet/dataset.py ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import numpy as np
3
+ from PIL import Image
4
+ from shapely.geometry import LineString
5
+ from scipy.spatial.distance import cdist
6
+
7
+ import torch
8
+ import torch.utils.data as data
9
+
10
+ from misc import panostretch
11
+
12
+
13
+ class PanoCorBonDataset(data.Dataset):
14
+ '''
15
+ See README.md for how to prepare the dataset.
16
+ '''
17
+
18
+ def __init__(self, root_dir,
19
+ flip=False, rotate=False, gamma=False, stretch=False,
20
+ p_base=0.96, max_stretch=2.0,
21
+ normcor=False, return_cor=False, return_path=False):
22
+ self.img_dir = os.path.join(root_dir, 'img')
23
+ self.cor_dir = os.path.join(root_dir, 'label_cor')
24
+ self.img_fnames = sorted([
25
+ fname for fname in os.listdir(self.img_dir)
26
+ if fname.endswith('.jpg') or fname.endswith('.png')
27
+ ])
28
+ self.txt_fnames = ['%s.txt' % fname[:-4] for fname in self.img_fnames]
29
+ self.flip = flip
30
+ self.rotate = rotate
31
+ self.gamma = gamma
32
+ self.stretch = stretch
33
+ self.p_base = p_base
34
+ self.max_stretch = max_stretch
35
+ self.normcor = normcor
36
+ self.return_cor = return_cor
37
+ self.return_path = return_path
38
+
39
+ self._check_dataset()
40
+
41
+ def _check_dataset(self):
42
+ for fname in self.txt_fnames:
43
+ assert os.path.isfile(os.path.join(self.cor_dir, fname)),\
44
+ '%s not found' % os.path.join(self.cor_dir, fname)
45
+
46
+ def __len__(self):
47
+ return len(self.img_fnames)
48
+
49
+ def __getitem__(self, idx):
50
+ # Read image
51
+ img_path = os.path.join(self.img_dir,
52
+ self.img_fnames[idx])
53
+ img = np.array(Image.open(img_path), np.float32)[..., :3] / 255.
54
+ H, W = img.shape[:2]
55
+
56
+ # Read ground truth corners
57
+ with open(os.path.join(self.cor_dir,
58
+ self.txt_fnames[idx])) as f:
59
+ cor = np.array([line.strip().split() for line in f if line.strip()], np.float32)
60
+
61
+ # Corner with minimum x should at the beginning
62
+ cor = np.roll(cor[:, :2], -2 * np.argmin(cor[::2, 0]), 0)
63
+
64
+ # Detect occlusion
65
+ occlusion = find_occlusion(cor[::2].copy()).repeat(2)
66
+ assert (np.abs(cor[0::2, 0] - cor[1::2, 0]) > W/100).sum() == 0, img_path
67
+ assert (cor[0::2, 1] > cor[1::2, 1]).sum() == 0, img_path
68
+
69
+ # Stretch augmentation
70
+ if self.stretch:
71
+ xmin, ymin, xmax, ymax = cor2xybound(cor)
72
+ kx = np.random.uniform(1.0, self.max_stretch)
73
+ ky = np.random.uniform(1.0, self.max_stretch)
74
+ if np.random.randint(2) == 0:
75
+ kx = max(1 / kx, min(0.5 / xmin, 1.0))
76
+ else:
77
+ kx = min(kx, max(10.0 / xmax, 1.0))
78
+ if np.random.randint(2) == 0:
79
+ ky = max(1 / ky, min(0.5 / ymin, 1.0))
80
+ else:
81
+ ky = min(ky, max(10.0 / ymax, 1.0))
82
+ img, cor = panostretch.pano_stretch(img, cor, kx, ky)
83
+
84
+ # Prepare 1d ceiling-wall/floor-wall boundary
85
+ bon = cor_2_1d(cor, H, W)
86
+
87
+ # Random flip
88
+ if self.flip and np.random.randint(2) == 0:
89
+ img = np.flip(img, axis=1)
90
+ bon = np.flip(bon, axis=1)
91
+ cor[:, 0] = img.shape[1] - 1 - cor[:, 0]
92
+
93
+ # Random horizontal rotate
94
+ if self.rotate:
95
+ dx = np.random.randint(img.shape[1])
96
+ img = np.roll(img, dx, axis=1)
97
+ bon = np.roll(bon, dx, axis=1)
98
+ cor[:, 0] = (cor[:, 0] + dx) % img.shape[1]
99
+
100
+ # Random gamma augmentation
101
+ if self.gamma:
102
+ p = np.random.uniform(1, 2)
103
+ if np.random.randint(2) == 0:
104
+ p = 1 / p
105
+ img = img ** p
106
+
107
+ # Prepare 1d wall-wall probability
108
+ corx = cor[~occlusion, 0].astype(np.float64)
109
+ arange_arr = np.arange(img.shape[1], dtype=np.float64).reshape(-1, 1)
110
+ dist_o = cdist(corx.reshape(-1, 1),
111
+ arange_arr,
112
+ metric='cityblock')
113
+ dist_r = cdist(corx.reshape(-1, 1),
114
+ arange_arr + img.shape[1],
115
+ metric='cityblock')
116
+ dist_l = cdist(corx.reshape(-1, 1),
117
+ arange_arr - img.shape[1],
118
+ metric='cityblock')
119
+ dist = np.min([dist_o, dist_r, dist_l], 0)
120
+ nearest_dist = dist.min(0)
121
+ y_cor = (self.p_base ** nearest_dist).reshape(1, -1)
122
+
123
+ # Convert all data to tensor
124
+ x = torch.FloatTensor(img.transpose([2, 0, 1]).copy())
125
+ bon = torch.FloatTensor(bon.copy())
126
+ y_cor = torch.FloatTensor(y_cor.copy())
127
+
128
+ # Check whether additional output are requested
129
+ out_lst = [x, bon, y_cor]
130
+ if self.return_cor:
131
+ out_lst.append(cor)
132
+ if self.return_path:
133
+ out_lst.append(img_path)
134
+
135
+ return out_lst
136
+
137
+
138
+ def cor_2_1d(cor, H, W):
139
+ bon_ceil_x, bon_ceil_y = [], []
140
+ bon_floor_x, bon_floor_y = [], []
141
+ n_cor = len(cor)
142
+ for i in range(n_cor // 2):
143
+ xys = panostretch.pano_connect_points(cor[i*2],
144
+ cor[(i*2+2) % n_cor],
145
+ z=-50, w=W, h=H)
146
+ bon_ceil_x.extend(xys[:, 0])
147
+ bon_ceil_y.extend(xys[:, 1])
148
+ for i in range(n_cor // 2):
149
+ xys = panostretch.pano_connect_points(cor[i*2+1],
150
+ cor[(i*2+3) % n_cor],
151
+ z=50, w=W, h=H)
152
+ bon_floor_x.extend(xys[:, 0])
153
+ bon_floor_y.extend(xys[:, 1])
154
+ bon_ceil_x, bon_ceil_y = sort_xy_filter_unique(bon_ceil_x, bon_ceil_y, y_small_first=True)
155
+ bon_floor_x, bon_floor_y = sort_xy_filter_unique(bon_floor_x, bon_floor_y, y_small_first=False)
156
+ bon = np.zeros((2, W))
157
+ bon[0] = np.interp(np.arange(W), bon_ceil_x, bon_ceil_y, period=W)
158
+ bon[1] = np.interp(np.arange(W), bon_floor_x, bon_floor_y, period=W)
159
+ bon = ((bon + 0.5) / H - 0.5) * np.pi
160
+ return bon
161
+
162
+
163
+ def sort_xy_filter_unique(xs, ys, y_small_first=True):
164
+ xs, ys = np.array(xs), np.array(ys)
165
+ idx_sort = np.argsort(xs + ys / ys.max() * (int(y_small_first)*2-1))
166
+ xs, ys = xs[idx_sort], ys[idx_sort]
167
+ _, idx_unique = np.unique(xs, return_index=True)
168
+ xs, ys = xs[idx_unique], ys[idx_unique]
169
+ assert np.all(np.diff(xs) > 0)
170
+ return xs, ys
171
+
172
+
173
+ def find_occlusion(coor):
174
+ u = panostretch.coorx2u(coor[:, 0])
175
+ v = panostretch.coory2v(coor[:, 1])
176
+ x, y = panostretch.uv2xy(u, v, z=-50)
177
+ occlusion = []
178
+ for i in range(len(x)):
179
+ raycast = LineString([(0, 0), (x[i], y[i])])
180
+ other_layout = []
181
+ for j in range(i+1, len(x)):
182
+ other_layout.append((x[j], y[j]))
183
+ for j in range(0, i):
184
+ other_layout.append((x[j], y[j]))
185
+ other_layout = LineString(other_layout)
186
+ occlusion.append(raycast.intersects(other_layout))
187
+ return np.array(occlusion)
188
+
189
+
190
+ def cor2xybound(cor):
191
+ ''' Helper function to clip max/min stretch factor '''
192
+ corU = cor[0::2]
193
+ corB = cor[1::2]
194
+ zU = -50
195
+ u = panostretch.coorx2u(corU[:, 0])
196
+ vU = panostretch.coory2v(corU[:, 1])
197
+ vB = panostretch.coory2v(corB[:, 1])
198
+
199
+ x, y = panostretch.uv2xy(u, vU, z=zU)
200
+ c = np.sqrt(x**2 + y**2)
201
+ zB = c * np.tan(vB)
202
+ xmin, xmax = x.min(), x.max()
203
+ ymin, ymax = y.min(), y.max()
204
+
205
+ S = 3 / abs(zB.mean() - zU)
206
+ dx = [abs(xmin * S), abs(xmax * S)]
207
+ dy = [abs(ymin * S), abs(ymax * S)]
208
+
209
+ return min(dx), min(dy), max(dx), max(dy)
210
+
211
+
212
+ def visualize_a_data(x, y_bon, y_cor):
213
+ x = (x.numpy().transpose([1, 2, 0]) * 255).astype(np.uint8)
214
+ y_bon = y_bon.numpy()
215
+ y_bon = ((y_bon / np.pi + 0.5) * x.shape[0]).round().astype(int)
216
+ y_cor = y_cor.numpy()
217
+
218
+ gt_cor = np.zeros((30, 1024, 3), np.uint8)
219
+ gt_cor[:] = y_cor[0][None, :, None] * 255
220
+ img_pad = np.zeros((3, 1024, 3), np.uint8) + 255
221
+
222
+ img_bon = (x.copy() * 0.5).astype(np.uint8)
223
+ y1 = np.round(y_bon[0]).astype(int)
224
+ y2 = np.round(y_bon[1]).astype(int)
225
+ y1 = np.vstack([np.arange(1024), y1]).T.reshape(-1, 1, 2)
226
+ y2 = np.vstack([np.arange(1024), y2]).T.reshape(-1, 1, 2)
227
+ img_bon[y_bon[0], np.arange(len(y_bon[0])), 1] = 255
228
+ img_bon[y_bon[1], np.arange(len(y_bon[1])), 1] = 255
229
+
230
+ return np.concatenate([gt_cor, img_pad, img_bon], 0)
231
+
232
+
233
+ if __name__ == '__main__':
234
+
235
+ import argparse
236
+ from tqdm import tqdm
237
+
238
+ parser = argparse.ArgumentParser()
239
+ parser.add_argument('--root_dir', default='data/valid/')
240
+ parser.add_argument('--ith', default=0, type=int,
241
+ help='Pick a data id to visualize.'
242
+ '-1 for visualize all data')
243
+ parser.add_argument('--flip', action='store_true',
244
+ help='whether to random flip')
245
+ parser.add_argument('--rotate', action='store_true',
246
+ help='whether to random horizon rotation')
247
+ parser.add_argument('--gamma', action='store_true',
248
+ help='whether to random luminance change')
249
+ parser.add_argument('--stretch', action='store_true',
250
+ help='whether to random pano stretch')
251
+ parser.add_argument('--out_dir', default='sample_dataset_visualization')
252
+ args = parser.parse_args()
253
+
254
+ os.makedirs(args.out_dir, exist_ok=True)
255
+
256
+ print('args:')
257
+ for key, val in vars(args).items():
258
+ print(' {:16} {}'.format(key, val))
259
+
260
+ dataset = PanoCorBonDataset(
261
+ root_dir=args.root_dir,
262
+ flip=args.flip, rotate=args.rotate, gamma=args.gamma, stretch=args.stretch,
263
+ return_path=True)
264
+
265
+ # Showing some information about dataset
266
+ print('len(dataset): {}'.format(len(dataset)))
267
+ x, y_bon, y_cor, path = dataset[0]
268
+ print('x', x.size())
269
+ print('y_bon', y_bon.size())
270
+ print('y_cor', y_cor.size())
271
+
272
+ if args.ith >= 0:
273
+ to_visualize = [dataset[args.ith]]
274
+ else:
275
+ to_visualize = dataset
276
+
277
+ for x, y_bon, y_cor, path in tqdm(to_visualize):
278
+ fname = os.path.split(path)[-1]
279
+ out = visualize_a_data(x, y_bon, y_cor)
280
+ Image.fromarray(out).save(os.path.join(args.out_dir, fname))
horizonnet/inference.py ADDED
@@ -0,0 +1,223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import glob
4
+ import json
5
+ import argparse
6
+ import numpy as np
7
+ from PIL import Image
8
+ from tqdm import tqdm
9
+ from scipy.ndimage.filters import maximum_filter
10
+ from shapely.geometry import Polygon
11
+
12
+ import torch
13
+ import torch.nn as nn
14
+ import torch.nn.functional as F
15
+
16
+ from model import HorizonNet
17
+ from dataset import visualize_a_data
18
+ from misc import post_proc, panostretch, utils
19
+
20
+
21
+ def find_N_peaks(signal, r=29, min_v=0.05, N=None):
22
+ max_v = maximum_filter(signal, size=r, mode='wrap')
23
+ pk_loc = np.where(max_v == signal)[0]
24
+ pk_loc = pk_loc[signal[pk_loc] > min_v]
25
+ if N is not None:
26
+ order = np.argsort(-signal[pk_loc])
27
+ pk_loc = pk_loc[order[:N]]
28
+ pk_loc = pk_loc[np.argsort(pk_loc)]
29
+ return pk_loc, signal[pk_loc]
30
+
31
+
32
+ def augment(x_img, flip, rotate):
33
+ x_img = x_img.numpy()
34
+ aug_type = ['']
35
+ x_imgs_augmented = [x_img]
36
+ if flip:
37
+ aug_type.append('flip')
38
+ x_imgs_augmented.append(np.flip(x_img, axis=-1))
39
+ for shift_p in rotate:
40
+ shift = int(round(shift_p * x_img.shape[-1]))
41
+ aug_type.append('rotate %d' % shift)
42
+ x_imgs_augmented.append(np.roll(x_img, shift, axis=-1))
43
+ return torch.FloatTensor(np.concatenate(x_imgs_augmented, 0)), aug_type
44
+
45
+
46
+ def augment_undo(x_imgs_augmented, aug_type):
47
+ x_imgs_augmented = x_imgs_augmented.cpu().numpy()
48
+ sz = x_imgs_augmented.shape[0] // len(aug_type)
49
+ x_imgs = []
50
+ for i, aug in enumerate(aug_type):
51
+ x_img = x_imgs_augmented[i*sz : (i+1)*sz]
52
+ if aug == 'flip':
53
+ x_imgs.append(np.flip(x_img, axis=-1))
54
+ elif aug.startswith('rotate'):
55
+ shift = int(aug.split()[-1])
56
+ x_imgs.append(np.roll(x_img, -shift, axis=-1))
57
+ elif aug == '':
58
+ x_imgs.append(x_img)
59
+ else:
60
+ raise NotImplementedError()
61
+
62
+ return np.array(x_imgs)
63
+
64
+
65
+ def inference(net, x, device, flip=False, rotate=[], visualize=False,
66
+ force_cuboid=False, force_raw=False, min_v=None, r=0.05):
67
+ '''
68
+ net : the trained HorizonNet
69
+ x : tensor in shape [1, 3, 512, 1024]
70
+ flip : fliping testing augmentation
71
+ rotate: horizontal rotation testing augmentation
72
+ '''
73
+
74
+ H, W = tuple(x.shape[2:])
75
+
76
+ # Network feedforward (with testing augmentation)
77
+ x, aug_type = augment(x, flip, rotate)
78
+ y_bon_, y_cor_ = net(x.to(device))
79
+ y_bon_ = augment_undo(y_bon_.cpu(), aug_type).mean(0)
80
+ y_cor_ = augment_undo(torch.sigmoid(y_cor_).cpu(), aug_type).mean(0)
81
+
82
+ # Visualize raw model output
83
+ if visualize:
84
+ vis_out = visualize_a_data(x[0],
85
+ torch.FloatTensor(y_bon_[0]),
86
+ torch.FloatTensor(y_cor_[0]))
87
+ else:
88
+ vis_out = None
89
+
90
+ y_bon_ = (y_bon_[0] / np.pi + 0.5) * H - 0.5
91
+ y_bon_[0] = np.clip(y_bon_[0], 1, H/2-1)
92
+ y_bon_[1] = np.clip(y_bon_[1], H/2+1, H-2)
93
+ y_cor_ = y_cor_[0, 0]
94
+
95
+ # Init floor/ceil plane
96
+ z0 = 50
97
+ _, z1 = post_proc.np_refine_by_fix_z(*y_bon_, z0)
98
+
99
+ if force_raw:
100
+ # Do not run post-processing, export raw polygon (1024*2 vertices) instead.
101
+ # [TODO] Current post-processing lead to bad results on complex layout.
102
+ cor = np.stack([np.arange(1024), y_bon_[0]], 1)
103
+
104
+ else:
105
+ # Detech wall-wall peaks
106
+ if min_v is None:
107
+ min_v = 0 if force_cuboid else 0.05
108
+ r = int(round(W * r / 2))
109
+ N = 4 if force_cuboid else None
110
+ xs_ = find_N_peaks(y_cor_, r=r, min_v=min_v, N=N)[0]
111
+
112
+ # Generate wall-walls
113
+ cor, xy_cor = post_proc.gen_ww(xs_, y_bon_[0], z0, tol=abs(0.16 * z1 / 1.6), force_cuboid=force_cuboid)
114
+ if not force_cuboid:
115
+ # Check valid (for fear self-intersection)
116
+ xy2d = np.zeros((len(xy_cor), 2), np.float32)
117
+ for i in range(len(xy_cor)):
118
+ xy2d[i, xy_cor[i]['type']] = xy_cor[i]['val']
119
+ xy2d[i, xy_cor[i-1]['type']] = xy_cor[i-1]['val']
120
+ if not Polygon(xy2d).is_valid:
121
+ print(
122
+ 'Fail to generate valid general layout!! '
123
+ 'Generate cuboid as fallback.',
124
+ file=sys.stderr)
125
+ xs_ = find_N_peaks(y_cor_, r=r, min_v=0, N=4)[0]
126
+ cor, xy_cor = post_proc.gen_ww(xs_, y_bon_[0], z0, tol=abs(0.16 * z1 / 1.6), force_cuboid=True)
127
+
128
+ # Expand with btn coory
129
+ cor = np.hstack([cor, post_proc.infer_coory(cor[:, 1], z1 - z0, z0)[:, None]])
130
+
131
+ # Collect corner position in equirectangular
132
+ cor_id = np.zeros((len(cor)*2, 2), np.float32)
133
+ for j in range(len(cor)):
134
+ cor_id[j*2] = cor[j, 0], cor[j, 1]
135
+ cor_id[j*2 + 1] = cor[j, 0], cor[j, 2]
136
+
137
+ # Normalized to [0, 1]
138
+ cor_id[:, 0] /= W
139
+ cor_id[:, 1] /= H
140
+
141
+ return cor_id, z0, z1, vis_out
142
+
143
+
144
+ if __name__ == '__main__':
145
+
146
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
147
+ parser.add_argument('--pth', required=True,
148
+ help='path to load saved checkpoint.')
149
+ parser.add_argument('--img_glob', required=True,
150
+ help='NOTE: Remeber to quote your glob path. '
151
+ 'All the given images are assumed to be aligned'
152
+ 'or you should use preporcess.py to do so.')
153
+ parser.add_argument('--output_dir', required=True)
154
+ parser.add_argument('--visualize', action='store_true')
155
+ # Augmentation related
156
+ parser.add_argument('--flip', action='store_true',
157
+ help='whether to perfome left-right flip. '
158
+ '# of input x2.')
159
+ parser.add_argument('--rotate', nargs='*', default=[], type=float,
160
+ help='whether to perfome horizontal rotate. '
161
+ 'each elements indicate fraction of image width. '
162
+ '# of input xlen(rotate).')
163
+ # Post-processing realted
164
+ parser.add_argument('--r', default=0.05, type=float)
165
+ parser.add_argument('--min_v', default=None, type=float)
166
+ parser.add_argument('--force_cuboid', action='store_true')
167
+ parser.add_argument('--force_raw', action='store_true')
168
+ # Misc arguments
169
+ parser.add_argument('--no_cuda', action='store_true',
170
+ help='disable cuda')
171
+ args = parser.parse_args()
172
+
173
+ # Prepare image to processed
174
+ paths = sorted(glob.glob(args.img_glob))
175
+ if len(paths) == 0:
176
+ print('no images found')
177
+ for path in paths:
178
+ assert os.path.isfile(path), '%s not found' % path
179
+
180
+ # Check target directory
181
+ if not os.path.isdir(args.output_dir):
182
+ print('Output directory %s not existed. Create one.' % args.output_dir)
183
+ os.makedirs(args.output_dir)
184
+ device = torch.device('cpu' if args.no_cuda else 'cuda')
185
+
186
+ # Loaded trained model
187
+ net = utils.load_trained_model(HorizonNet, args.pth).to(device)
188
+ net.eval()
189
+
190
+ # Inferencing
191
+ with torch.no_grad():
192
+ for i_path in tqdm(paths, desc='Inferencing'):
193
+ k = os.path.split(i_path)[-1][:-4]
194
+
195
+ # Load image
196
+ img_pil = Image.open(i_path)
197
+ if img_pil.size != (1024, 512):
198
+ img_pil = img_pil.resize((1024, 512), Image.BICUBIC)
199
+ img_ori = np.array(img_pil)[..., :3].transpose([2, 0, 1]).copy()
200
+ x = torch.FloatTensor([img_ori / 255])
201
+
202
+ # Inferenceing corners
203
+ cor_id, z0, z1, vis_out = inference(net=net, x=x, device=device,
204
+ flip=args.flip, rotate=args.rotate,
205
+ visualize=args.visualize,
206
+ force_cuboid=args.force_cuboid,
207
+ force_raw=args.force_raw,
208
+ min_v=args.min_v, r=args.r)
209
+
210
+ # Output result
211
+ with open(os.path.join(args.output_dir, k + '.json'), 'w') as f:
212
+ json.dump({
213
+ 'z0': float(z0),
214
+ 'z1': float(z1),
215
+ 'uv': [[float(u), float(v)] for u, v in cor_id],
216
+ }, f)
217
+
218
+ if vis_out is not None:
219
+ vis_path = os.path.join(args.output_dir, k + '.raw.png')
220
+ vh, vw = vis_out.shape[:2]
221
+ Image.fromarray(vis_out)\
222
+ .resize((vw//2, vh//2), Image.LANCZOS)\
223
+ .save(vis_path)
horizonnet/misc/__init__.py ADDED
File without changes
horizonnet/misc/__pycache__/__init__.cpython-39.pyc ADDED
Binary file (184 Bytes). View file
 
horizonnet/misc/__pycache__/panostretch.cpython-39.pyc ADDED
Binary file (5.87 kB). View file
 
horizonnet/misc/__pycache__/post_proc.cpython-39.pyc ADDED
Binary file (9.38 kB). View file
 
horizonnet/misc/__pycache__/utils.cpython-39.pyc ADDED
Binary file (1.97 kB). View file
 
horizonnet/misc/gen_txt_structured3d.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '''
2
+ Help generate txt for train.py
3
+ Please contact https://github.com/bertjiazheng/Structured3D for dataset.
4
+ '''
5
+
6
+ import os
7
+ import glob
8
+ import argparse
9
+
10
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
11
+ parser.add_argument('--root', required=True,
12
+ help='path to the dataset directory')
13
+ parser.add_argument('--train_txt', required=True,
14
+ help='path to save txt for train')
15
+ parser.add_argument('--valid_txt', required=True,
16
+ help='path to save txt for valid')
17
+ parser.add_argument('--test_txt', required=True,
18
+ help='path to save txt for test')
19
+ args = parser.parse_args()
20
+
21
+ train_scene = ['scene_%05d' % i for i in range(0, 3000)]
22
+ valid_scene = ['scene_%05d' % i for i in range(3000, 3250)]
23
+ test_scene = ['scene_%05d' % i for i in range(3250, 3500)]
24
+
25
+ # Simple check: all directories exist
26
+ for path in train_scene + valid_scene + test_scene:
27
+ assert os.path.isdir(os.path.join(args.root, path)), '%s not found' % path
28
+
29
+ def gen_pairs(scene_id_lst):
30
+ pairs = []
31
+ for scene_id in scene_id_lst:
32
+ for fname in os.listdir(os.path.join(args.root, scene_id, 'rgb')):
33
+ room_id = os.path.split(fname)[1].split('_')[0]
34
+
35
+ img_k = os.path.join(os.path.join(scene_id, 'rgb', fname))
36
+ layout_k = os.path.join(os.path.join(scene_id, 'layout', room_id + '_layout.txt'))
37
+ assert os.path.isfile(os.path.join(args.root, img_k))
38
+ assert os.path.isfile(os.path.join(args.root, layout_k))
39
+ pairs.append((img_k, layout_k))
40
+ return pairs
41
+
42
+ with open(args.train_txt, 'w') as f:
43
+ pairs = gen_pairs(train_scene)
44
+ f.write('\n'.join([' '.join(p) for p in pairs]))
45
+
46
+ with open(args.valid_txt, 'w') as f:
47
+ pairs = gen_pairs(valid_scene)
48
+ f.write('\n'.join([' '.join(p) for p in pairs]))
49
+
50
+ with open(args.test_txt, 'w') as f:
51
+ pairs = gen_pairs(test_scene)
52
+ f.write('\n'.join([' '.join(p) for p in pairs]))
horizonnet/misc/pano_lsd_align.py ADDED
@@ -0,0 +1,914 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '''
2
+ This script is helper function for preprocessing.
3
+ Most of the code are converted from LayoutNet official's matlab code.
4
+ All functions, naming rule and data flow follow official for easier
5
+ converting and comparing.
6
+ Code is not optimized for python or numpy yet.
7
+
8
+ Author: Cheng Sun
9
+ Email : chengsun@gapp.nthu.edu.tw
10
+ '''
11
+
12
+ import sys
13
+ import numpy as np
14
+ from scipy.ndimage import map_coordinates
15
+ import cv2
16
+ from pylsd import lsd
17
+
18
+
19
+ def computeUVN(n, in_, planeID):
20
+ '''
21
+ compute v given u and normal.
22
+ '''
23
+ if planeID == 2:
24
+ n = np.array([n[1], n[2], n[0]])
25
+ elif planeID == 3:
26
+ n = np.array([n[2], n[0], n[1]])
27
+ bc = n[0] * np.sin(in_) + n[1] * np.cos(in_)
28
+ bs = n[2]
29
+ out = np.arctan(-bc / (bs + 1e-9))
30
+ return out
31
+
32
+
33
+ def computeUVN_vec(n, in_, planeID):
34
+ '''
35
+ vectorization version of computeUVN
36
+ @n N x 3
37
+ @in_ MN x 1
38
+ @planeID N
39
+ '''
40
+ n = n.copy()
41
+ if (planeID == 2).sum():
42
+ n[planeID == 2] = np.roll(n[planeID == 2], 2, axis=1)
43
+ if (planeID == 3).sum():
44
+ n[planeID == 3] = np.roll(n[planeID == 3], 1, axis=1)
45
+ n = np.repeat(n, in_.shape[0] // n.shape[0], axis=0)
46
+ assert n.shape[0] == in_.shape[0]
47
+ bc = n[:, [0]] * np.sin(in_) + n[:, [1]] * np.cos(in_)
48
+ bs = n[:, [2]]
49
+ out = np.arctan(-bc / (bs + 1e-9))
50
+ return out
51
+
52
+
53
+ def xyz2uvN(xyz, planeID=1):
54
+ ID1 = (int(planeID) - 1 + 0) % 3
55
+ ID2 = (int(planeID) - 1 + 1) % 3
56
+ ID3 = (int(planeID) - 1 + 2) % 3
57
+ normXY = np.sqrt(xyz[:, [ID1]] ** 2 + xyz[:, [ID2]] ** 2)
58
+ normXY[normXY < 0.000001] = 0.000001
59
+ normXYZ = np.sqrt(xyz[:, [ID1]] ** 2 + xyz[:, [ID2]] ** 2 + xyz[:, [ID3]] ** 2)
60
+ v = np.arcsin(xyz[:, [ID3]] / normXYZ)
61
+ u = np.arcsin(xyz[:, [ID1]] / normXY)
62
+ valid = (xyz[:, [ID2]] < 0) & (u >= 0)
63
+ u[valid] = np.pi - u[valid]
64
+ valid = (xyz[:, [ID2]] < 0) & (u <= 0)
65
+ u[valid] = -np.pi - u[valid]
66
+ uv = np.hstack([u, v])
67
+ uv[np.isnan(uv[:, 0]), 0] = 0
68
+ return uv
69
+
70
+
71
+ def uv2xyzN(uv, planeID=1):
72
+ ID1 = (int(planeID) - 1 + 0) % 3
73
+ ID2 = (int(planeID) - 1 + 1) % 3
74
+ ID3 = (int(planeID) - 1 + 2) % 3
75
+ xyz = np.zeros((uv.shape[0], 3))
76
+ xyz[:, ID1] = np.cos(uv[:, 1]) * np.sin(uv[:, 0])
77
+ xyz[:, ID2] = np.cos(uv[:, 1]) * np.cos(uv[:, 0])
78
+ xyz[:, ID3] = np.sin(uv[:, 1])
79
+ return xyz
80
+
81
+
82
+ def uv2xyzN_vec(uv, planeID):
83
+ '''
84
+ vectorization version of uv2xyzN
85
+ @uv N x 2
86
+ @planeID N
87
+ '''
88
+ assert (planeID.astype(int) != planeID).sum() == 0
89
+ planeID = planeID.astype(int)
90
+ ID1 = (planeID - 1 + 0) % 3
91
+ ID2 = (planeID - 1 + 1) % 3
92
+ ID3 = (planeID - 1 + 2) % 3
93
+ ID = np.arange(len(uv))
94
+ xyz = np.zeros((len(uv), 3))
95
+ xyz[ID, ID1] = np.cos(uv[:, 1]) * np.sin(uv[:, 0])
96
+ xyz[ID, ID2] = np.cos(uv[:, 1]) * np.cos(uv[:, 0])
97
+ xyz[ID, ID3] = np.sin(uv[:, 1])
98
+ return xyz
99
+
100
+
101
+ def warpImageFast(im, XXdense, YYdense):
102
+ minX = max(1., np.floor(XXdense.min()) - 1)
103
+ minY = max(1., np.floor(YYdense.min()) - 1)
104
+
105
+ maxX = min(im.shape[1], np.ceil(XXdense.max()) + 1)
106
+ maxY = min(im.shape[0], np.ceil(YYdense.max()) + 1)
107
+
108
+ im = im[int(round(minY-1)):int(round(maxY)),
109
+ int(round(minX-1)):int(round(maxX))]
110
+
111
+ assert XXdense.shape == YYdense.shape
112
+ out_shape = XXdense.shape
113
+ coordinates = [
114
+ (YYdense - minY).reshape(-1),
115
+ (XXdense - minX).reshape(-1),
116
+ ]
117
+ im_warp = np.stack([
118
+ map_coordinates(im[..., c], coordinates, order=1).reshape(out_shape)
119
+ for c in range(im.shape[-1])],
120
+ axis=-1)
121
+
122
+ return im_warp
123
+
124
+
125
+ def rotatePanorama(img, vp=None, R=None):
126
+ '''
127
+ Rotate panorama
128
+ if R is given, vp (vanishing point) will be overlooked
129
+ otherwise R is computed from vp
130
+ '''
131
+ sphereH, sphereW, C = img.shape
132
+
133
+ # new uv coordinates
134
+ TX, TY = np.meshgrid(range(1, sphereW + 1), range(1, sphereH + 1))
135
+ TX = TX.reshape(-1, 1, order='F')
136
+ TY = TY.reshape(-1, 1, order='F')
137
+ ANGx = (TX - sphereW/2 - 0.5) / sphereW * np.pi * 2
138
+ ANGy = -(TY - sphereH/2 - 0.5) / sphereH * np.pi
139
+ uvNew = np.hstack([ANGx, ANGy])
140
+ xyzNew = uv2xyzN(uvNew, 1)
141
+
142
+ # rotation matrix
143
+ if R is None:
144
+ R = np.linalg.inv(vp.T)
145
+
146
+ xyzOld = np.linalg.solve(R, xyzNew.T).T
147
+ uvOld = xyz2uvN(xyzOld, 1)
148
+
149
+ Px = (uvOld[:, 0] + np.pi) / (2*np.pi) * sphereW + 0.5
150
+ Py = (-uvOld[:, 1] + np.pi/2) / np.pi * sphereH + 0.5
151
+
152
+ Px = Px.reshape(sphereH, sphereW, order='F')
153
+ Py = Py.reshape(sphereH, sphereW, order='F')
154
+
155
+ # boundary
156
+ imgNew = np.zeros((sphereH+2, sphereW+2, C), np.float64)
157
+ imgNew[1:-1, 1:-1, :] = img
158
+ imgNew[1:-1, 0, :] = img[:, -1, :]
159
+ imgNew[1:-1, -1, :] = img[:, 0, :]
160
+ imgNew[0, 1:sphereW//2+1, :] = img[0, sphereW-1:sphereW//2-1:-1, :]
161
+ imgNew[0, sphereW//2+1:-1, :] = img[0, sphereW//2-1::-1, :]
162
+ imgNew[-1, 1:sphereW//2+1, :] = img[-1, sphereW-1:sphereW//2-1:-1, :]
163
+ imgNew[-1, sphereW//2+1:-1, :] = img[0, sphereW//2-1::-1, :]
164
+ imgNew[0, 0, :] = img[0, 0, :]
165
+ imgNew[-1, -1, :] = img[-1, -1, :]
166
+ imgNew[0, -1, :] = img[0, -1, :]
167
+ imgNew[-1, 0, :] = img[-1, 0, :]
168
+
169
+ rotImg = warpImageFast(imgNew, Px+1, Py+1)
170
+
171
+ return rotImg
172
+
173
+
174
+ def imgLookAt(im, CENTERx, CENTERy, new_imgH, fov):
175
+ sphereH = im.shape[0]
176
+ sphereW = im.shape[1]
177
+ warped_im = np.zeros((new_imgH, new_imgH, 3))
178
+ TX, TY = np.meshgrid(range(1, new_imgH + 1), range(1, new_imgH + 1))
179
+ TX = TX.reshape(-1, 1, order='F')
180
+ TY = TY.reshape(-1, 1, order='F')
181
+ TX = TX - 0.5 - new_imgH/2
182
+ TY = TY - 0.5 - new_imgH/2
183
+ r = new_imgH / 2 / np.tan(fov/2)
184
+
185
+ # convert to 3D
186
+ R = np.sqrt(TY ** 2 + r ** 2)
187
+ ANGy = np.arctan(- TY / r)
188
+ ANGy = ANGy + CENTERy
189
+
190
+ X = np.sin(ANGy) * R
191
+ Y = -np.cos(ANGy) * R
192
+ Z = TX
193
+
194
+ INDn = np.nonzero(np.abs(ANGy) > np.pi/2)
195
+
196
+ # project back to sphere
197
+ ANGx = np.arctan(Z / -Y)
198
+ RZY = np.sqrt(Z ** 2 + Y ** 2)
199
+ ANGy = np.arctan(X / RZY)
200
+
201
+ ANGx[INDn] = ANGx[INDn] + np.pi
202
+ ANGx = ANGx + CENTERx
203
+
204
+ INDy = np.nonzero(ANGy < -np.pi/2)
205
+ ANGy[INDy] = -np.pi - ANGy[INDy]
206
+ ANGx[INDy] = ANGx[INDy] + np.pi
207
+
208
+ INDx = np.nonzero(ANGx <= -np.pi); ANGx[INDx] = ANGx[INDx] + 2 * np.pi
209
+ INDx = np.nonzero(ANGx > np.pi); ANGx[INDx] = ANGx[INDx] - 2 * np.pi
210
+ INDx = np.nonzero(ANGx > np.pi); ANGx[INDx] = ANGx[INDx] - 2 * np.pi
211
+ INDx = np.nonzero(ANGx > np.pi); ANGx[INDx] = ANGx[INDx] - 2 * np.pi
212
+
213
+ Px = (ANGx + np.pi) / (2*np.pi) * sphereW + 0.5
214
+ Py = ((-ANGy) + np.pi/2) / np.pi * sphereH + 0.5
215
+
216
+ INDxx = np.nonzero(Px < 1)
217
+ Px[INDxx] = Px[INDxx] + sphereW
218
+ im = np.concatenate([im, im[:, :2]], 1)
219
+
220
+ Px = Px.reshape(new_imgH, new_imgH, order='F')
221
+ Py = Py.reshape(new_imgH, new_imgH, order='F')
222
+
223
+ warped_im = warpImageFast(im, Px, Py)
224
+
225
+ return warped_im
226
+
227
+
228
+ def separatePano(panoImg, fov, x, y, imgSize=320):
229
+ '''cut a panorama image into several separate views'''
230
+ assert x.shape == y.shape
231
+ if not isinstance(fov, np.ndarray):
232
+ fov = fov * np.ones_like(x)
233
+
234
+ sepScene = [
235
+ {
236
+ 'img': imgLookAt(panoImg.copy(), xi, yi, imgSize, fovi),
237
+ 'vx': xi,
238
+ 'vy': yi,
239
+ 'fov': fovi,
240
+ 'sz': imgSize,
241
+ }
242
+ for xi, yi, fovi in zip(x, y, fov)
243
+ ]
244
+
245
+ return sepScene
246
+
247
+
248
+ def lsdWrap(img):
249
+ '''
250
+ Opencv implementation of
251
+ Rafael Grompone von Gioi, Jérémie Jakubowicz, Jean-Michel Morel, and Gregory Randall,
252
+ LSD: a Line Segment Detector, Image Processing On Line, vol. 2012.
253
+ [Rafael12] http://www.ipol.im/pub/art/2012/gjmr-lsd/?utm_source=doi
254
+ @img
255
+ input image
256
+ '''
257
+ if len(img.shape) == 3:
258
+ img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
259
+
260
+ lines = lsd(img, quant=0.7)
261
+ if lines is None:
262
+ return np.zeros_like(img), np.array([])
263
+ edgeMap = np.zeros_like(img)
264
+ for i in range(lines.shape[0]):
265
+ pt1 = (int(lines[i, 0]), int(lines[i, 1]))
266
+ pt2 = (int(lines[i, 2]), int(lines[i, 3]))
267
+ width = lines[i, 4]
268
+ cv2.line(edgeMap, pt1, pt2, 255, int(np.ceil(width / 2)))
269
+ edgeList = np.concatenate([lines, np.ones_like(lines[:, :2])], 1)
270
+ return edgeMap, edgeList
271
+
272
+
273
+ def edgeFromImg2Pano(edge):
274
+ edgeList = edge['edgeLst']
275
+ if len(edgeList) == 0:
276
+ return np.array([])
277
+
278
+ vx = edge['vx']
279
+ vy = edge['vy']
280
+ fov = edge['fov']
281
+ imH, imW = edge['img'].shape
282
+
283
+ R = (imW/2) / np.tan(fov/2)
284
+
285
+ # im is the tangent plane, contacting with ball at [x0 y0 z0]
286
+ x0 = R * np.cos(vy) * np.sin(vx)
287
+ y0 = R * np.cos(vy) * np.cos(vx)
288
+ z0 = R * np.sin(vy)
289
+ vecposX = np.array([np.cos(vx), -np.sin(vx), 0])
290
+ vecposY = np.cross(np.array([x0, y0, z0]), vecposX)
291
+ vecposY = vecposY / np.sqrt(vecposY @ vecposY.T)
292
+ vecposX = vecposX.reshape(1, -1)
293
+ vecposY = vecposY.reshape(1, -1)
294
+ Xc = (0 + imW-1) / 2
295
+ Yc = (0 + imH-1) / 2
296
+
297
+ vecx1 = edgeList[:, [0]] - Xc
298
+ vecy1 = edgeList[:, [1]] - Yc
299
+ vecx2 = edgeList[:, [2]] - Xc
300
+ vecy2 = edgeList[:, [3]] - Yc
301
+
302
+ vec1 = np.tile(vecx1, [1, 3]) * vecposX + np.tile(vecy1, [1, 3]) * vecposY
303
+ vec2 = np.tile(vecx2, [1, 3]) * vecposX + np.tile(vecy2, [1, 3]) * vecposY
304
+ coord1 = [[x0, y0, z0]] + vec1
305
+ coord2 = [[x0, y0, z0]] + vec2
306
+
307
+ normal = np.cross(coord1, coord2, axis=1)
308
+ normal = normal / np.linalg.norm(normal, axis=1, keepdims=True)
309
+
310
+ panoList = np.hstack([normal, coord1, coord2, edgeList[:, [-1]]])
311
+
312
+ return panoList
313
+
314
+
315
+ def _intersection(range1, range2):
316
+ if range1[1] < range1[0]:
317
+ range11 = [range1[0], 1]
318
+ range12 = [0, range1[1]]
319
+ else:
320
+ range11 = range1
321
+ range12 = [0, 0]
322
+
323
+ if range2[1] < range2[0]:
324
+ range21 = [range2[0], 1]
325
+ range22 = [0, range2[1]]
326
+ else:
327
+ range21 = range2
328
+ range22 = [0, 0]
329
+
330
+ b = max(range11[0], range21[0]) < min(range11[1], range21[1])
331
+ if b:
332
+ return b
333
+ b2 = max(range12[0], range22[0]) < min(range12[1], range22[1])
334
+ b = b or b2
335
+ return b
336
+
337
+
338
+ def _insideRange(pt, range):
339
+ if range[1] > range[0]:
340
+ b = pt >= range[0] and pt <= range[1]
341
+ else:
342
+ b1 = pt >= range[0] and pt <= 1
343
+ b2 = pt >= 0 and pt <= range[1]
344
+ b = b1 or b2
345
+ return b
346
+
347
+
348
+ def combineEdgesN(edges):
349
+ '''
350
+ Combine some small line segments, should be very conservative
351
+ OUTPUT
352
+ lines: combined line segments
353
+ ori_lines: original line segments
354
+ line format [nx ny nz projectPlaneID umin umax LSfov score]
355
+ '''
356
+ arcList = []
357
+ for edge in edges:
358
+ panoLst = edge['panoLst']
359
+ if len(panoLst) == 0:
360
+ continue
361
+ arcList.append(panoLst)
362
+ arcList = np.vstack(arcList)
363
+
364
+ # ori lines
365
+ numLine = len(arcList)
366
+ ori_lines = np.zeros((numLine, 8))
367
+ areaXY = np.abs(arcList[:, 2])
368
+ areaYZ = np.abs(arcList[:, 0])
369
+ areaZX = np.abs(arcList[:, 1])
370
+ planeIDs = np.argmax(np.stack([areaXY, areaYZ, areaZX], -1), 1) + 1 # XY YZ ZX
371
+
372
+ for i in range(numLine):
373
+ ori_lines[i, :3] = arcList[i, :3]
374
+ ori_lines[i, 3] = planeIDs[i]
375
+ coord1 = arcList[i, 3:6]
376
+ coord2 = arcList[i, 6:9]
377
+ uv = xyz2uvN(np.stack([coord1, coord2]), planeIDs[i])
378
+ umax = uv[:, 0].max() + np.pi
379
+ umin = uv[:, 0].min() + np.pi
380
+ if umax - umin > np.pi:
381
+ ori_lines[i, 4:6] = np.array([umax, umin]) / 2 / np.pi
382
+ else:
383
+ ori_lines[i, 4:6] = np.array([umin, umax]) / 2 / np.pi
384
+ ori_lines[i, 6] = np.arccos((
385
+ np.dot(coord1, coord2) / (np.linalg.norm(coord1) * np.linalg.norm(coord2))
386
+ ).clip(-1, 1))
387
+ ori_lines[i, 7] = arcList[i, 9]
388
+
389
+ # additive combination
390
+ lines = ori_lines.copy()
391
+ for _ in range(3):
392
+ numLine = len(lines)
393
+ valid_line = np.ones(numLine, bool)
394
+ for i in range(numLine):
395
+ if not valid_line[i]:
396
+ continue
397
+ dotProd = (lines[:, :3] * lines[[i], :3]).sum(1)
398
+ valid_curr = np.logical_and((np.abs(dotProd) > np.cos(np.pi / 180)), valid_line)
399
+ valid_curr[i] = False
400
+ for j in np.nonzero(valid_curr)[0]:
401
+ range1 = lines[i, 4:6]
402
+ range2 = lines[j, 4:6]
403
+ valid_rag = _intersection(range1, range2)
404
+ if not valid_rag:
405
+ continue
406
+
407
+ # combine
408
+ I = np.argmax(np.abs(lines[i, :3]))
409
+ if lines[i, I] * lines[j, I] > 0:
410
+ nc = lines[i, :3] * lines[i, 6] + lines[j, :3] * lines[j, 6]
411
+ else:
412
+ nc = lines[i, :3] * lines[i, 6] - lines[j, :3] * lines[j, 6]
413
+ nc = nc / np.linalg.norm(nc)
414
+
415
+ if _insideRange(range1[0], range2):
416
+ nrmin = range2[0]
417
+ else:
418
+ nrmin = range1[0]
419
+
420
+ if _insideRange(range1[1], range2):
421
+ nrmax = range2[1]
422
+ else:
423
+ nrmax = range1[1]
424
+
425
+ u = np.array([[nrmin], [nrmax]]) * 2 * np.pi - np.pi
426
+ v = computeUVN(nc, u, lines[i, 3])
427
+ xyz = uv2xyzN(np.hstack([u, v]), lines[i, 3])
428
+ l = np.arccos(np.dot(xyz[0, :], xyz[1, :]).clip(-1, 1))
429
+ scr = (lines[i,6]*lines[i,7] + lines[j,6]*lines[j,7]) / (lines[i,6]+lines[j,6])
430
+
431
+ lines[i] = [*nc, lines[i, 3], nrmin, nrmax, l, scr]
432
+ valid_line[j] = False
433
+
434
+ lines = lines[valid_line]
435
+
436
+ return lines, ori_lines
437
+
438
+
439
+ def icosahedron2sphere(level):
440
+ # this function use a icosahedron to sample uniformly on a sphere
441
+ a = 2 / (1 + np.sqrt(5))
442
+ M = np.array([
443
+ 0, a, -1, a, 1, 0, -a, 1, 0,
444
+ 0, a, 1, -a, 1, 0, a, 1, 0,
445
+ 0, a, 1, 0, -a, 1, -1, 0, a,
446
+ 0, a, 1, 1, 0, a, 0, -a, 1,
447
+ 0, a, -1, 0, -a, -1, 1, 0, -a,
448
+ 0, a, -1, -1, 0, -a, 0, -a, -1,
449
+ 0, -a, 1, a, -1, 0, -a, -1, 0,
450
+ 0, -a, -1, -a, -1, 0, a, -1, 0,
451
+ -a, 1, 0, -1, 0, a, -1, 0, -a,
452
+ -a, -1, 0, -1, 0, -a, -1, 0, a,
453
+ a, 1, 0, 1, 0, -a, 1, 0, a,
454
+ a, -1, 0, 1, 0, a, 1, 0, -a,
455
+ 0, a, 1, -1, 0, a, -a, 1, 0,
456
+ 0, a, 1, a, 1, 0, 1, 0, a,
457
+ 0, a, -1, -a, 1, 0, -1, 0, -a,
458
+ 0, a, -1, 1, 0, -a, a, 1, 0,
459
+ 0, -a, -1, -1, 0, -a, -a, -1, 0,
460
+ 0, -a, -1, a, -1, 0, 1, 0, -a,
461
+ 0, -a, 1, -a, -1, 0, -1, 0, a,
462
+ 0, -a, 1, 1, 0, a, a, -1, 0])
463
+
464
+ coor = M.T.reshape(3, 60, order='F').T
465
+ coor, idx = np.unique(coor, return_inverse=True, axis=0)
466
+ tri = idx.reshape(3, 20, order='F').T
467
+
468
+ # extrude
469
+ coor = list(coor / np.tile(np.linalg.norm(coor, axis=1, keepdims=True), (1, 3)))
470
+
471
+ for _ in range(level):
472
+ triN = []
473
+ for t in range(len(tri)):
474
+ n = len(coor)
475
+ coor.append((coor[tri[t, 0]] + coor[tri[t, 1]]) / 2)
476
+ coor.append((coor[tri[t, 1]] + coor[tri[t, 2]]) / 2)
477
+ coor.append((coor[tri[t, 2]] + coor[tri[t, 0]]) / 2)
478
+
479
+ triN.append([n, tri[t, 0], n+2])
480
+ triN.append([n, tri[t, 1], n+1])
481
+ triN.append([n+1, tri[t, 2], n+2])
482
+ triN.append([n, n+1, n+2])
483
+ tri = np.array(triN)
484
+
485
+ # uniquefy
486
+ coor, idx = np.unique(coor, return_inverse=True, axis=0)
487
+ tri = idx[tri]
488
+
489
+ # extrude
490
+ coor = list(coor / np.tile(np.sqrt(np.sum(coor * coor, 1, keepdims=True)), (1, 3)))
491
+
492
+ return np.array(coor), np.array(tri)
493
+
494
+
495
+ def curveFitting(inputXYZ, weight):
496
+ '''
497
+ @inputXYZ: N x 3
498
+ @weight : N x 1
499
+ '''
500
+ l = np.linalg.norm(inputXYZ, axis=1, keepdims=True)
501
+ inputXYZ = inputXYZ / l
502
+ weightXYZ = inputXYZ * weight
503
+ XX = np.sum(weightXYZ[:, 0] ** 2)
504
+ YY = np.sum(weightXYZ[:, 1] ** 2)
505
+ ZZ = np.sum(weightXYZ[:, 2] ** 2)
506
+ XY = np.sum(weightXYZ[:, 0] * weightXYZ[:, 1])
507
+ YZ = np.sum(weightXYZ[:, 1] * weightXYZ[:, 2])
508
+ ZX = np.sum(weightXYZ[:, 2] * weightXYZ[:, 0])
509
+
510
+ A = np.array([
511
+ [XX, XY, ZX],
512
+ [XY, YY, YZ],
513
+ [ZX, YZ, ZZ]])
514
+ U, S, Vh = np.linalg.svd(A)
515
+ outputNM = Vh[-1, :]
516
+ outputNM = outputNM / np.linalg.norm(outputNM)
517
+
518
+ return outputNM
519
+
520
+
521
+ def sphereHoughVote(segNormal, segLength, segScores, binRadius, orthTolerance, candiSet, force_unempty=True):
522
+ # initial guess
523
+ numLinesg = len(segNormal)
524
+
525
+ voteBinPoints = candiSet.copy()
526
+ voteBinPoints = voteBinPoints[~(voteBinPoints[:,2] < 0)]
527
+ reversValid = (segNormal[:, 2] < 0).reshape(-1)
528
+ segNormal[reversValid] = -segNormal[reversValid]
529
+
530
+ voteBinUV = xyz2uvN(voteBinPoints)
531
+ numVoteBin = len(voteBinPoints)
532
+ voteBinValues = np.zeros(numVoteBin)
533
+ for i in range(numLinesg):
534
+ tempNorm = segNormal[[i]]
535
+ tempDots = (voteBinPoints * tempNorm).sum(1)
536
+
537
+ valid = np.abs(tempDots) < np.cos((90 - binRadius) * np.pi / 180)
538
+
539
+ voteBinValues[valid] = voteBinValues[valid] + segScores[i] * segLength[i]
540
+
541
+ checkIDs1 = np.nonzero(voteBinUV[:, [1]] > np.pi / 3)[0]
542
+ voteMax = 0
543
+ checkID1Max = 0
544
+ checkID2Max = 0
545
+ checkID3Max = 0
546
+
547
+ for j in range(len(checkIDs1)):
548
+ checkID1 = checkIDs1[j]
549
+ vote1 = voteBinValues[checkID1]
550
+ if voteBinValues[checkID1] == 0 and force_unempty:
551
+ continue
552
+ checkNormal = voteBinPoints[[checkID1]]
553
+ dotProduct = (voteBinPoints * checkNormal).sum(1)
554
+ checkIDs2 = np.nonzero(np.abs(dotProduct) < np.cos((90 - orthTolerance) * np.pi / 180))[0]
555
+
556
+ for i in range(len(checkIDs2)):
557
+ checkID2 = checkIDs2[i]
558
+ if voteBinValues[checkID2] == 0 and force_unempty:
559
+ continue
560
+ vote2 = vote1 + voteBinValues[checkID2]
561
+ cpv = np.cross(voteBinPoints[checkID1], voteBinPoints[checkID2]).reshape(1, 3)
562
+ cpn = np.linalg.norm(cpv)
563
+ dotProduct = (voteBinPoints * cpv).sum(1) / cpn
564
+ checkIDs3 = np.nonzero(np.abs(dotProduct) > np.cos(orthTolerance * np.pi / 180))[0]
565
+
566
+ for k in range(len(checkIDs3)):
567
+ checkID3 = checkIDs3[k]
568
+ if voteBinValues[checkID3] == 0 and force_unempty:
569
+ continue
570
+ vote3 = vote2 + voteBinValues[checkID3]
571
+ if vote3 > voteMax:
572
+ lastStepCost = vote3 - voteMax
573
+ if voteMax != 0:
574
+ tmp = (voteBinPoints[[checkID1Max, checkID2Max, checkID3Max]] * \
575
+ voteBinPoints[[checkID1, checkID2, checkID3]]).sum(1)
576
+ lastStepAngle = np.arccos(tmp.clip(-1, 1))
577
+ else:
578
+ lastStepAngle = np.zeros(3)
579
+
580
+ checkID1Max = checkID1
581
+ checkID2Max = checkID2
582
+ checkID3Max = checkID3
583
+
584
+ voteMax = vote3
585
+
586
+ if checkID1Max == 0:
587
+ print('[WARN] sphereHoughVote: no orthogonal voting exist', file=sys.stderr)
588
+ return None, 0, 0
589
+ initXYZ = voteBinPoints[[checkID1Max, checkID2Max, checkID3Max]]
590
+
591
+ # refine
592
+ refiXYZ = np.zeros((3, 3))
593
+ dotprod = (segNormal * initXYZ[[0]]).sum(1)
594
+ valid = np.abs(dotprod) < np.cos((90 - binRadius) * np.pi / 180)
595
+ validNm = segNormal[valid]
596
+ validWt = segLength[valid] * segScores[valid]
597
+ validWt = validWt / validWt.max()
598
+ refiNM = curveFitting(validNm, validWt)
599
+ refiXYZ[0] = refiNM.copy()
600
+
601
+ dotprod = (segNormal * initXYZ[[1]]).sum(1)
602
+ valid = np.abs(dotprod) < np.cos((90 - binRadius) * np.pi / 180)
603
+ validNm = segNormal[valid]
604
+ validWt = segLength[valid] * segScores[valid]
605
+ validWt = validWt / validWt.max()
606
+ validNm = np.vstack([validNm, refiXYZ[[0]]])
607
+ validWt = np.vstack([validWt, validWt.sum(0, keepdims=1) * 0.1])
608
+ refiNM = curveFitting(validNm, validWt)
609
+ refiXYZ[1] = refiNM.copy()
610
+
611
+ refiNM = np.cross(refiXYZ[0], refiXYZ[1])
612
+ refiXYZ[2] = refiNM / np.linalg.norm(refiNM)
613
+
614
+ return refiXYZ, lastStepCost, lastStepAngle
615
+
616
+
617
+ def findMainDirectionEMA(lines):
618
+ '''compute vp from set of lines'''
619
+
620
+ # initial guess
621
+ segNormal = lines[:, :3]
622
+ segLength = lines[:, [6]]
623
+ segScores = np.ones((len(lines), 1))
624
+
625
+ shortSegValid = (segLength < 5 * np.pi / 180).reshape(-1)
626
+ segNormal = segNormal[~shortSegValid, :]
627
+ segLength = segLength[~shortSegValid]
628
+ segScores = segScores[~shortSegValid]
629
+
630
+ numLinesg = len(segNormal)
631
+ candiSet, tri = icosahedron2sphere(3)
632
+ ang = np.arccos((candiSet[tri[0,0]] * candiSet[tri[0,1]]).sum().clip(-1, 1)) / np.pi * 180
633
+ binRadius = ang / 2
634
+ initXYZ, score, angle = sphereHoughVote(segNormal, segLength, segScores, 2*binRadius, 2, candiSet)
635
+
636
+ if initXYZ is None:
637
+ print('[WARN] findMainDirectionEMA: initial failed', file=sys.stderr)
638
+ return None, score, angle
639
+
640
+ # iterative refine
641
+ iter_max = 3
642
+ candiSet, tri = icosahedron2sphere(5)
643
+ numCandi = len(candiSet)
644
+ angD = np.arccos((candiSet[tri[0, 0]] * candiSet[tri[0, 1]]).sum().clip(-1, 1)) / np.pi * 180
645
+ binRadiusD = angD / 2
646
+ curXYZ = initXYZ.copy()
647
+ tol = np.linspace(4*binRadius, 4*binRadiusD, iter_max) # shrink down ls and candi
648
+ for it in range(iter_max):
649
+ dot1 = np.abs((segNormal * curXYZ[[0]]).sum(1))
650
+ dot2 = np.abs((segNormal * curXYZ[[1]]).sum(1))
651
+ dot3 = np.abs((segNormal * curXYZ[[2]]).sum(1))
652
+ valid1 = dot1 < np.cos((90 - tol[it]) * np.pi / 180)
653
+ valid2 = dot2 < np.cos((90 - tol[it]) * np.pi / 180)
654
+ valid3 = dot3 < np.cos((90 - tol[it]) * np.pi / 180)
655
+ valid = valid1 | valid2 | valid3
656
+
657
+ if np.sum(valid) == 0:
658
+ print('[WARN] findMainDirectionEMA: zero line segments for voting', file=sys.stderr)
659
+ break
660
+
661
+ subSegNormal = segNormal[valid]
662
+ subSegLength = segLength[valid]
663
+ subSegScores = segScores[valid]
664
+
665
+ dot1 = np.abs((candiSet * curXYZ[[0]]).sum(1))
666
+ dot2 = np.abs((candiSet * curXYZ[[1]]).sum(1))
667
+ dot3 = np.abs((candiSet * curXYZ[[2]]).sum(1))
668
+ valid1 = dot1 > np.cos(tol[it] * np.pi / 180)
669
+ valid2 = dot2 > np.cos(tol[it] * np.pi / 180)
670
+ valid3 = dot3 > np.cos(tol[it] * np.pi / 180)
671
+ valid = valid1 | valid2 | valid3
672
+
673
+ if np.sum(valid) == 0:
674
+ print('[WARN] findMainDirectionEMA: zero line segments for voting', file=sys.stderr)
675
+ break
676
+
677
+ subCandiSet = candiSet[valid]
678
+
679
+ tcurXYZ, _, _ = sphereHoughVote(subSegNormal, subSegLength, subSegScores, 2*binRadiusD, 2, subCandiSet)
680
+
681
+ if tcurXYZ is None:
682
+ print('[WARN] findMainDirectionEMA: no answer found', file=sys.stderr)
683
+ break
684
+ curXYZ = tcurXYZ.copy()
685
+
686
+ mainDirect = curXYZ.copy()
687
+ mainDirect[0] = mainDirect[0] * np.sign(mainDirect[0,2])
688
+ mainDirect[1] = mainDirect[1] * np.sign(mainDirect[1,2])
689
+ mainDirect[2] = mainDirect[2] * np.sign(mainDirect[2,2])
690
+
691
+ uv = xyz2uvN(mainDirect)
692
+ I1 = np.argmax(uv[:,1])
693
+ J = np.setdiff1d(np.arange(3), I1)
694
+ I2 = np.argmin(np.abs(np.sin(uv[J,0])))
695
+ I2 = J[I2]
696
+ I3 = np.setdiff1d(np.arange(3), np.hstack([I1, I2]))
697
+ mainDirect = np.vstack([mainDirect[I1], mainDirect[I2], mainDirect[I3]])
698
+
699
+ mainDirect[0] = mainDirect[0] * np.sign(mainDirect[0,2])
700
+ mainDirect[1] = mainDirect[1] * np.sign(mainDirect[1,1])
701
+ mainDirect[2] = mainDirect[2] * np.sign(mainDirect[2,0])
702
+
703
+ mainDirect = np.vstack([mainDirect, -mainDirect])
704
+
705
+ return mainDirect, score, angle
706
+
707
+
708
+ def multi_linspace(start, stop, num):
709
+ div = (num - 1)
710
+ y = np.arange(0, num, dtype=np.float64)
711
+ steps = (stop - start) / div
712
+ return steps.reshape(-1, 1) * y + start.reshape(-1, 1)
713
+
714
+
715
+ def assignVanishingType(lines, vp, tol, area=10):
716
+ numLine = len(lines)
717
+ numVP = len(vp)
718
+ typeCost = np.zeros((numLine, numVP))
719
+ # perpendicular
720
+ for vid in range(numVP):
721
+ cosint = (lines[:, :3] * vp[[vid]]).sum(1)
722
+ typeCost[:, vid] = np.arcsin(np.abs(cosint).clip(-1, 1))
723
+
724
+ # infinity
725
+ u = np.stack([lines[:, 4], lines[:, 5]], -1)
726
+ u = u.reshape(-1, 1) * 2 * np.pi - np.pi
727
+ v = computeUVN_vec(lines[:, :3], u, lines[:, 3])
728
+ xyz = uv2xyzN_vec(np.hstack([u, v]), np.repeat(lines[:, 3], 2))
729
+ xyz = multi_linspace(xyz[0::2].reshape(-1), xyz[1::2].reshape(-1), 100)
730
+ xyz = np.vstack([blk.T for blk in np.split(xyz, numLine)])
731
+ xyz = xyz / np.linalg.norm(xyz, axis=1, keepdims=True)
732
+ for vid in range(numVP):
733
+ ang = np.arccos(np.abs((xyz * vp[[vid]]).sum(1)).clip(-1, 1))
734
+ notok = (ang < area * np.pi / 180).reshape(numLine, 100).sum(1) != 0
735
+ typeCost[notok, vid] = 100
736
+
737
+ I = typeCost.min(1)
738
+ tp = typeCost.argmin(1)
739
+ tp[I > tol] = numVP + 1
740
+
741
+ return tp, typeCost
742
+
743
+
744
+ def refitLineSegmentB(lines, vp, vpweight=0.1):
745
+ '''
746
+ Refit direction of line segments
747
+ INPUT:
748
+ lines: original line segments
749
+ vp: vannishing point
750
+ vpweight: if set to 0, lines will not change; if set to inf, lines will
751
+ be forced to pass vp
752
+ '''
753
+ numSample = 100
754
+ numLine = len(lines)
755
+ xyz = np.zeros((numSample+1, 3))
756
+ wei = np.ones((numSample+1, 1))
757
+ wei[numSample] = vpweight * numSample
758
+ lines_ali = lines.copy()
759
+ for i in range(numLine):
760
+ n = lines[i, :3]
761
+ sid = lines[i, 4] * 2 * np.pi
762
+ eid = lines[i, 5] * 2 * np.pi
763
+ if eid < sid:
764
+ x = np.linspace(sid, eid + 2 * np.pi, numSample) % (2 * np.pi)
765
+ else:
766
+ x = np.linspace(sid, eid, numSample)
767
+ u = -np.pi + x.reshape(-1, 1)
768
+ v = computeUVN(n, u, lines[i, 3])
769
+ xyz[:numSample] = uv2xyzN(np.hstack([u, v]), lines[i, 3])
770
+ xyz[numSample] = vp
771
+ outputNM = curveFitting(xyz, wei)
772
+ lines_ali[i, :3] = outputNM
773
+
774
+ return lines_ali
775
+
776
+
777
+ def paintParameterLine(parameterLine, width, height):
778
+ lines = parameterLine.copy()
779
+ panoEdgeC = np.zeros((height, width))
780
+
781
+ num_sample = max(height, width)
782
+ for i in range(len(lines)):
783
+ n = lines[i, :3]
784
+ sid = lines[i, 4] * 2 * np.pi
785
+ eid = lines[i, 5] * 2 * np.pi
786
+ if eid < sid:
787
+ x = np.linspace(sid, eid + 2 * np.pi, num_sample)
788
+ x = x % (2 * np.pi)
789
+ else:
790
+ x = np.linspace(sid, eid, num_sample)
791
+ u = -np.pi + x.reshape(-1, 1)
792
+ v = computeUVN(n, u, lines[i, 3])
793
+ xyz = uv2xyzN(np.hstack([u, v]), lines[i, 3])
794
+ uv = xyz2uvN(xyz, 1)
795
+ m = np.minimum(np.floor((uv[:,0] + np.pi) / (2 * np.pi) * width) + 1,
796
+ width).astype(np.int32)
797
+ n = np.minimum(np.floor(((np.pi / 2) - uv[:, 1]) / np.pi * height) + 1,
798
+ height).astype(np.int32)
799
+ panoEdgeC[n-1, m-1] = i
800
+
801
+ return panoEdgeC
802
+
803
+
804
+ def panoEdgeDetection(img, viewSize=320, qError=0.7, refineIter=3):
805
+ '''
806
+ line detection on panorama
807
+ INPUT:
808
+ img: image waiting for detection, double type, range 0~1
809
+ viewSize: image size of croped views
810
+ qError: set smaller if more line segment wanted
811
+ OUTPUT:
812
+ oLines: detected line segments
813
+ vp: vanishing point
814
+ views: separate views of panorama
815
+ edges: original detection of line segments in separate views
816
+ panoEdge: image for visualize line segments
817
+ '''
818
+ cutSize = viewSize
819
+ fov = np.pi / 3
820
+ xh = np.arange(-np.pi, np.pi*5/6, np.pi/6)
821
+ yh = np.zeros(xh.shape[0])
822
+ xp = np.array([-3/3, -2/3, -1/3, 0/3, 1/3, 2/3, -3/3, -2/3, -1/3, 0/3, 1/3, 2/3]) * np.pi
823
+ yp = np.array([ 1/4, 1/4, 1/4, 1/4, 1/4, 1/4, -1/4, -1/4, -1/4, -1/4, -1/4, -1/4]) * np.pi
824
+ x = np.concatenate([xh, xp, [0, 0]])
825
+ y = np.concatenate([yh, yp, [np.pi/2., -np.pi/2]])
826
+
827
+ sepScene = separatePano(img.copy(), fov, x, y, cutSize)
828
+ edge = []
829
+ for i, scene in enumerate(sepScene):
830
+ edgeMap, edgeList = lsdWrap(scene['img'])
831
+ edge.append({
832
+ 'img': edgeMap,
833
+ 'edgeLst': edgeList,
834
+ 'vx': scene['vx'],
835
+ 'vy': scene['vy'],
836
+ 'fov': scene['fov'],
837
+ })
838
+ edge[-1]['panoLst'] = edgeFromImg2Pano(edge[-1])
839
+ lines, olines = combineEdgesN(edge)
840
+
841
+ clines = lines.copy()
842
+ for _ in range(refineIter):
843
+ mainDirect, score, angle = findMainDirectionEMA(clines)
844
+
845
+ tp, typeCost = assignVanishingType(lines, mainDirect[:3], 0.1, 10)
846
+ lines1 = lines[tp==0]
847
+ lines2 = lines[tp==1]
848
+ lines3 = lines[tp==2]
849
+
850
+ lines1rB = refitLineSegmentB(lines1, mainDirect[0], 0)
851
+ lines2rB = refitLineSegmentB(lines2, mainDirect[1], 0)
852
+ lines3rB = refitLineSegmentB(lines3, mainDirect[2], 0)
853
+
854
+ clines = np.vstack([lines1rB, lines2rB, lines3rB])
855
+
856
+ panoEdge1r = paintParameterLine(lines1rB, img.shape[1], img.shape[0])
857
+ panoEdge2r = paintParameterLine(lines2rB, img.shape[1], img.shape[0])
858
+ panoEdge3r = paintParameterLine(lines3rB, img.shape[1], img.shape[0])
859
+ panoEdger = np.stack([panoEdge1r, panoEdge2r, panoEdge3r], -1)
860
+
861
+ # output
862
+ olines = clines
863
+ vp = mainDirect
864
+ views = sepScene
865
+ edges = edge
866
+ panoEdge = panoEdger
867
+
868
+ return olines, vp, views, edges, panoEdge, score, angle
869
+
870
+
871
+ if __name__ == '__main__':
872
+
873
+ # disable OpenCV3's non thread safe OpenCL option
874
+ cv2.ocl.setUseOpenCL(False)
875
+
876
+ import os
877
+ import argparse
878
+ import PIL
879
+ from PIL import Image
880
+ import time
881
+
882
+ parser = argparse.ArgumentParser()
883
+ parser.add_argument('--i', required=True)
884
+ parser.add_argument('--o_prefix', required=True)
885
+ parser.add_argument('--qError', default=0.7, type=float)
886
+ parser.add_argument('--refineIter', default=3, type=int)
887
+ args = parser.parse_args()
888
+
889
+ # Read image
890
+ img_ori = np.array(Image.open(args.i).resize((1024, 512)))
891
+
892
+ # Vanishing point estimation & Line segments detection
893
+ s_time = time.time()
894
+ olines, vp, views, edges, panoEdge, score, angle = panoEdgeDetection(img_ori,
895
+ qError=args.qError,
896
+ refineIter=args.refineIter)
897
+ print('Elapsed time: %.2f' % (time.time() - s_time))
898
+ panoEdge = (panoEdge > 0)
899
+
900
+ print('Vanishing point:')
901
+ for v in vp[2::-1]:
902
+ print('%.6f %.6f %.6f' % tuple(v))
903
+
904
+ # Visualization
905
+ edg = rotatePanorama(panoEdge.astype(np.float64), vp[2::-1])
906
+ img = rotatePanorama(img_ori / 255.0, vp[2::-1])
907
+ one = img.copy() * 0.5
908
+ one[(edg > 0.5).sum(-1) > 0] = 0
909
+ one[edg[..., 0] > 0.5, 0] = 1
910
+ one[edg[..., 1] > 0.5, 1] = 1
911
+ one[edg[..., 2] > 0.5, 2] = 1
912
+ Image.fromarray((edg * 255).astype(np.uint8)).save('%s_edg.png' % args.o_prefix)
913
+ Image.fromarray((img * 255).astype(np.uint8)).save('%s_img.png' % args.o_prefix)
914
+ Image.fromarray((one * 255).astype(np.uint8)).save('%s_one.png' % args.o_prefix)
horizonnet/misc/panostretch.py ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import functools
2
+ import numpy as np
3
+ from scipy.ndimage import map_coordinates
4
+
5
+
6
+ def uv_meshgrid(w, h):
7
+ uv = np.stack(np.meshgrid(range(w), range(h)), axis=-1)
8
+ uv = uv.astype(np.float64)
9
+ uv[..., 0] = ((uv[..., 0] + 0.5) / w - 0.5) * 2 * np.pi
10
+ uv[..., 1] = ((uv[..., 1] + 0.5) / h - 0.5) * np.pi
11
+ return uv
12
+
13
+
14
+ @functools.lru_cache()
15
+ def _uv_tri(w, h):
16
+ uv = uv_meshgrid(w, h)
17
+ sin_u = np.sin(uv[..., 0])
18
+ cos_u = np.cos(uv[..., 0])
19
+ tan_v = np.tan(uv[..., 1])
20
+ return sin_u, cos_u, tan_v
21
+
22
+
23
+ def uv_tri(w, h):
24
+ sin_u, cos_u, tan_v = _uv_tri(w, h)
25
+ return sin_u.copy(), cos_u.copy(), tan_v.copy()
26
+
27
+
28
+ def coorx2u(x, w=1024):
29
+ return ((x + 0.5) / w - 0.5) * 2 * np.pi
30
+
31
+
32
+ def coory2v(y, h=512):
33
+ return ((y + 0.5) / h - 0.5) * np.pi
34
+
35
+
36
+ def u2coorx(u, w=1024):
37
+ return (u / (2 * np.pi) + 0.5) * w - 0.5
38
+
39
+
40
+ def v2coory(v, h=512):
41
+ return (v / np.pi + 0.5) * h - 0.5
42
+
43
+
44
+ def uv2xy(u, v, z=-50):
45
+ c = z / np.tan(v)
46
+ x = c * np.cos(u)
47
+ y = c * np.sin(u)
48
+ return x, y
49
+
50
+
51
+ def pano_connect_points(p1, p2, z=-50, w=1024, h=512):
52
+ if p1[0] == p2[0]:
53
+ return np.array([p1, p2], np.float32)
54
+
55
+ u1 = coorx2u(p1[0], w)
56
+ v1 = coory2v(p1[1], h)
57
+ u2 = coorx2u(p2[0], w)
58
+ v2 = coory2v(p2[1], h)
59
+
60
+ x1, y1 = uv2xy(u1, v1, z)
61
+ x2, y2 = uv2xy(u2, v2, z)
62
+
63
+ if abs(p1[0] - p2[0]) < w / 2:
64
+ pstart = np.ceil(min(p1[0], p2[0]))
65
+ pend = np.floor(max(p1[0], p2[0]))
66
+ else:
67
+ pstart = np.ceil(max(p1[0], p2[0]))
68
+ pend = np.floor(min(p1[0], p2[0]) + w)
69
+ coorxs = (np.arange(pstart, pend + 1) % w).astype(np.float64)
70
+ vx = x2 - x1
71
+ vy = y2 - y1
72
+ us = coorx2u(coorxs, w)
73
+ ps = (np.tan(us) * x1 - y1) / (vy - np.tan(us) * vx)
74
+ cs = np.sqrt((x1 + ps * vx) ** 2 + (y1 + ps * vy) ** 2)
75
+ vs = np.arctan2(z, cs)
76
+ coorys = v2coory(vs, h)
77
+
78
+ return np.stack([coorxs, coorys], axis=-1)
79
+
80
+
81
+ def pano_stretch(img, corners, kx, ky, order=1):
82
+ '''
83
+ img: [H, W, C]
84
+ corners: [N, 2] in image coordinate (x, y) format
85
+ kx: Stretching along front-back direction
86
+ ky: Stretching along left-right direction
87
+ order: Interpolation order. 0 for nearest-neighbor. 1 for bilinear.
88
+ '''
89
+
90
+ # Process image
91
+ sin_u, cos_u, tan_v = uv_tri(img.shape[1], img.shape[0])
92
+ u0 = np.arctan2(sin_u * kx / ky, cos_u)
93
+ v0 = np.arctan(tan_v * np.sin(u0) / sin_u * ky)
94
+
95
+ refx = (u0 / (2 * np.pi) + 0.5) * img.shape[1] - 0.5
96
+ refy = (v0 / np.pi + 0.5) * img.shape[0] - 0.5
97
+
98
+ # [TODO]: using opencv remap could probably speedup the process a little
99
+ stretched_img = np.stack([
100
+ map_coordinates(img[..., i], [refy, refx], order=order, mode='wrap')
101
+ for i in range(img.shape[-1])
102
+ ], axis=-1)
103
+
104
+ # Process corners
105
+ corners_u0 = coorx2u(corners[:, 0], img.shape[1])
106
+ corners_v0 = coory2v(corners[:, 1], img.shape[0])
107
+ corners_u = np.arctan2(np.sin(corners_u0) * ky / kx, np.cos(corners_u0))
108
+ C2 = (np.sin(corners_u0) * ky)**2 + (np.cos(corners_u0) * kx)**2
109
+ corners_v = np.arctan2(
110
+ np.sin(corners_v0),
111
+ np.cos(corners_v0) * np.sqrt(C2))
112
+
113
+ cornersX = u2coorx(corners_u, img.shape[1])
114
+ cornersY = v2coory(corners_v, img.shape[0])
115
+ stretched_corners = np.stack([cornersX, cornersY], axis=-1)
116
+
117
+ return stretched_img, stretched_corners
118
+
119
+
120
+ def visualize_pano_stretch(stretched_img, stretched_cor, title):
121
+ '''
122
+ Helper function for visualizing the effect of pano_stretch
123
+ '''
124
+ thikness = 2
125
+ color = (0, 255, 0)
126
+ for i in range(4):
127
+ xys = pano_connect_points(stretched_cor[i*2], stretched_cor[(i*2+2) % 8], z=-50)
128
+ xys = xys.astype(int)
129
+ blue_split = np.where((xys[1:, 0] - xys[:-1, 0]) < 0)[0]
130
+ if len(blue_split) == 0:
131
+ cv2.polylines(stretched_img, [xys], False, color, 2)
132
+ else:
133
+ t = blue_split[0] + 1
134
+ cv2.polylines(stretched_img, [xys[:t]], False, color, thikness)
135
+ cv2.polylines(stretched_img, [xys[t:]], False, color, thikness)
136
+
137
+ for i in range(4):
138
+ xys = pano_connect_points(stretched_cor[i*2+1], stretched_cor[(i*2+3) % 8], z=50)
139
+ xys = xys.astype(int)
140
+ blue_split = np.where((xys[1:, 0] - xys[:-1, 0]) < 0)[0]
141
+ if len(blue_split) == 0:
142
+ cv2.polylines(stretched_img, [xys], False, color, 2)
143
+ else:
144
+ t = blue_split[0] + 1
145
+ cv2.polylines(stretched_img, [xys[:t]], False, color, thikness)
146
+ cv2.polylines(stretched_img, [xys[t:]], False, color, thikness)
147
+
148
+ cv2.putText(stretched_img, title, (25, 50), cv2.FONT_HERSHEY_SIMPLEX, 1,
149
+ (0, 0, 0), 2, cv2.LINE_AA)
150
+
151
+ return stretched_img.astype(np.uint8)
152
+
153
+
154
+ if __name__ == '__main__':
155
+
156
+ import argparse
157
+ import time
158
+ from PIL import Image
159
+ import cv2
160
+
161
+ parser = argparse.ArgumentParser()
162
+ parser.add_argument('--i', default='data/valid/img/pano_abpohapclcyuuz.png')
163
+ parser.add_argument('--i_gt', default='data/valid/label_cor/pano_abpohapclcyuuz.txt')
164
+ parser.add_argument('--o', default='sample_stretched_pano.png')
165
+ parser.add_argument('--kx', default=2, type=float,
166
+ help='Stretching along front-back direction')
167
+ parser.add_argument('--ky', default=1, type=float,
168
+ help='Stretching along left-right direction')
169
+ args = parser.parse_args()
170
+
171
+ img = np.array(Image.open(args.i), np.float64)
172
+ with open(args.i_gt) as f:
173
+ cor = np.array([line.strip().split() for line in f], np.int32)
174
+ stretched_img, stretched_cor = pano_stretch(img, cor, args.kx, args.ky)
175
+
176
+ title = 'kx=%3.2f, ky=%3.2f' % (args.kx, args.ky)
177
+ visual_stretched_img = visualize_pano_stretch(stretched_img, stretched_cor, title)
178
+ Image.fromarray(visual_stretched_img).save(args.o)
horizonnet/misc/post_proc.py ADDED
@@ -0,0 +1,359 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ from scipy.ndimage import map_coordinates
3
+ from scipy.spatial.distance import pdist, squareform
4
+ from sklearn.decomposition import PCA
5
+
6
+
7
+ PI = float(np.pi)
8
+
9
+
10
+ def fuv2img(fuv, coorW=1024, floorW=1024, floorH=512):
11
+ '''
12
+ Project 1d signal in uv space to 2d floor plane image
13
+ '''
14
+ floor_plane_x, floor_plane_y = np.meshgrid(range(floorW), range(floorH))
15
+ floor_plane_x, floor_plane_y = -(floor_plane_y - floorH / 2), floor_plane_x - floorW / 2
16
+ floor_plane_coridx = (np.arctan2(floor_plane_y, floor_plane_x) / (2 * PI) + 0.5) * coorW - 0.5
17
+ floor_plane = map_coordinates(fuv, floor_plane_coridx.reshape(1, -1), order=1, mode='wrap')
18
+ floor_plane = floor_plane.reshape(floorH, floorW)
19
+ return floor_plane
20
+
21
+
22
+ def np_coorx2u(coorx, coorW=1024):
23
+ return ((coorx + 0.5) / coorW - 0.5) * 2 * PI
24
+
25
+
26
+ def np_coory2v(coory, coorH=512):
27
+ return -((coory + 0.5) / coorH - 0.5) * PI
28
+
29
+
30
+ def np_coor2xy(coor, z=50, coorW=1024, coorH=512, floorW=1024, floorH=512):
31
+ '''
32
+ coor: N x 2, index of array in (col, row) format
33
+ '''
34
+ coor = np.array(coor)
35
+ u = np_coorx2u(coor[:, 0], coorW)
36
+ v = np_coory2v(coor[:, 1], coorH)
37
+ c = z / np.tan(v)
38
+ x = c * np.sin(u) + floorW / 2 - 0.5
39
+ y = -c * np.cos(u) + floorH / 2 - 0.5
40
+ return np.hstack([x[:, None], y[:, None]])
41
+
42
+
43
+ def np_x_u_solve_y(x, u, floorW=1024, floorH=512):
44
+ c = (x - floorW / 2 + 0.5) / np.sin(u)
45
+ return -c * np.cos(u) + floorH / 2 - 0.5
46
+
47
+
48
+ def np_y_u_solve_x(y, u, floorW=1024, floorH=512):
49
+ c = -(y - floorH / 2 + 0.5) / np.cos(u)
50
+ return c * np.sin(u) + floorW / 2 - 0.5
51
+
52
+
53
+ def np_xy2coor(xy, z=50, coorW=1024, coorH=512, floorW=1024, floorH=512):
54
+ '''
55
+ xy: N x 2
56
+ '''
57
+ x = xy[:, 0] - floorW / 2 + 0.5
58
+ y = xy[:, 1] - floorH / 2 + 0.5
59
+
60
+ u = np.arctan2(x, -y)
61
+ v = np.arctan(z / np.sqrt(x**2 + y**2))
62
+
63
+ coorx = (u / (2 * PI) + 0.5) * coorW - 0.5
64
+ coory = (-v / PI + 0.5) * coorH - 0.5
65
+
66
+ return np.hstack([coorx[:, None], coory[:, None]])
67
+
68
+
69
+ def mean_percentile(vec, p1=25, p2=75):
70
+ vmin = np.percentile(vec, p1)
71
+ vmax = np.percentile(vec, p2)
72
+ return vec[(vmin <= vec) & (vec <= vmax)].mean()
73
+
74
+
75
+ def vote(vec, tol):
76
+ vec = np.sort(vec)
77
+ n = np.arange(len(vec))[::-1]
78
+ n = n[:, None] - n[None, :] + 1.0
79
+ l = squareform(pdist(vec[:, None], 'minkowski', p=1) + 1e-9)
80
+
81
+ invalid = (n < len(vec) * 0.4) | (l > tol)
82
+ if (~invalid).sum() == 0 or len(vec) < tol:
83
+ best_fit = np.median(vec)
84
+ p_score = 0
85
+ else:
86
+ l[invalid] = 1e5
87
+ n[invalid] = -1
88
+ score = n
89
+ max_idx = score.argmax()
90
+ max_row = max_idx // len(vec)
91
+ max_col = max_idx % len(vec)
92
+ assert max_col > max_row
93
+ best_fit = vec[max_row:max_col+1].mean()
94
+ p_score = (max_col - max_row + 1) / len(vec)
95
+
96
+ l1_score = np.abs(vec - best_fit).mean()
97
+
98
+ return best_fit, p_score, l1_score
99
+
100
+
101
+ def get_z1(coory0, coory1, z0=50, coorH=512):
102
+ v0 = np_coory2v(coory0, coorH)
103
+ v1 = np_coory2v(coory1, coorH)
104
+ c0 = z0 / np.tan(v0)
105
+ z1 = c0 * np.tan(v1)
106
+ return z1
107
+
108
+
109
+ def np_refine_by_fix_z(coory0, coory1, z0=50, coorH=512):
110
+ '''
111
+ Refine coory1 by coory0
112
+ coory0 are assumed on given plane z
113
+ '''
114
+ v0 = np_coory2v(coory0, coorH)
115
+ v1 = np_coory2v(coory1, coorH)
116
+
117
+ c0 = z0 / np.tan(v0)
118
+ z1 = c0 * np.tan(v1)
119
+ z1_mean = mean_percentile(z1)
120
+ v1_refine = np.arctan2(z1_mean, c0)
121
+ coory1_refine = (-v1_refine / PI + 0.5) * coorH - 0.5
122
+
123
+ return coory1_refine, z1_mean
124
+
125
+
126
+ def infer_coory(coory0, h, z0=50, coorH=512):
127
+ v0 = np_coory2v(coory0, coorH)
128
+ c0 = z0 / np.tan(v0)
129
+ z1 = z0 + h
130
+ v1 = np.arctan2(z1, c0)
131
+ return (-v1 / PI + 0.5) * coorH - 0.5
132
+
133
+
134
+ def get_gpid(coorx, coorW):
135
+ gpid = np.zeros(coorW)
136
+ gpid[np.round(coorx).astype(int)] = 1
137
+ gpid = np.cumsum(gpid).astype(int)
138
+ gpid[gpid == gpid[-1]] = 0
139
+ return gpid
140
+
141
+
142
+ def get_gpid_idx(gpid, j):
143
+ idx = np.where(gpid == j)[0]
144
+ if idx[0] == 0 and idx[-1] != len(idx) - 1:
145
+ _shift = -np.where(idx != np.arange(len(idx)))[0][0]
146
+ idx = np.roll(idx, _shift)
147
+ return idx
148
+
149
+
150
+ def gpid_two_split(xy, tpid_a, tpid_b):
151
+ m = np.arange(len(xy)) + 1
152
+ cum_a = np.cumsum(xy[:, tpid_a])
153
+ cum_b = np.cumsum(xy[::-1, tpid_b])
154
+ l1_a = cum_a / m - cum_a / (m * m)
155
+ l1_b = cum_b / m - cum_b / (m * m)
156
+ l1_b = l1_b[::-1]
157
+
158
+ score = l1_a[:-1] + l1_b[1:]
159
+ best_split = score.argmax() + 1
160
+
161
+ va = xy[:best_split, tpid_a].mean()
162
+ vb = xy[best_split:, tpid_b].mean()
163
+
164
+ return va, vb
165
+
166
+
167
+ def _get_rot_rad(px, py):
168
+ if px < 0:
169
+ px, py = -px, -py
170
+ rad = np.arctan2(py, px) * 180 / np.pi
171
+ if rad > 45:
172
+ return 90 - rad
173
+ if rad < -45:
174
+ return -90 - rad
175
+ return -rad
176
+
177
+
178
+ def get_rot_rad(init_coorx, coory, z=50, coorW=1024, coorH=512, floorW=1024, floorH=512, tol=5):
179
+ gpid = get_gpid(init_coorx, coorW)
180
+ coor = np.hstack([np.arange(coorW)[:, None], coory[:, None]])
181
+ xy = np_coor2xy(coor, z, coorW, coorH, floorW, floorH)
182
+ xy_cor = []
183
+
184
+ rot_rad_suggestions = []
185
+ for j in range(len(init_coorx)):
186
+ pca = PCA(n_components=1)
187
+ pca.fit(xy[gpid == j])
188
+ rot_rad_suggestions.append(_get_rot_rad(*pca.components_[0]))
189
+ rot_rad_suggestions = np.sort(rot_rad_suggestions + [1e9])
190
+
191
+ rot_rad = np.mean(rot_rad_suggestions[:-1])
192
+ best_rot_rad_sz = -1
193
+ last_j = 0
194
+ for j in range(1, len(rot_rad_suggestions)):
195
+ if rot_rad_suggestions[j] - rot_rad_suggestions[j-1] > tol:
196
+ last_j = j
197
+ elif j - last_j > best_rot_rad_sz:
198
+ rot_rad = rot_rad_suggestions[last_j:j+1].mean()
199
+ best_rot_rad_sz = j - last_j
200
+
201
+ dx = int(round(rot_rad * 1024 / 360))
202
+ return dx, rot_rad
203
+
204
+
205
+ def gen_ww_cuboid(xy, gpid, tol):
206
+ xy_cor = []
207
+ assert len(np.unique(gpid)) == 4
208
+
209
+ # For each part seperated by wall-wall peak, voting for a wall
210
+ for j in range(4):
211
+ now_x = xy[gpid == j, 0]
212
+ now_y = xy[gpid == j, 1]
213
+ new_x, x_score, x_l1 = vote(now_x, tol)
214
+ new_y, y_score, y_l1 = vote(now_y, tol)
215
+ if (x_score, -x_l1) > (y_score, -y_l1):
216
+ xy_cor.append({'type': 0, 'val': new_x, 'score': x_score})
217
+ else:
218
+ xy_cor.append({'type': 1, 'val': new_y, 'score': y_score})
219
+
220
+ # Sanity fallback
221
+ scores = [0, 0]
222
+ for j in range(4):
223
+ if xy_cor[j]['type'] == 0:
224
+ scores[j % 2] += xy_cor[j]['score']
225
+ else:
226
+ scores[j % 2] -= xy_cor[j]['score']
227
+ if scores[0] > scores[1]:
228
+ xy_cor[0]['type'] = 0
229
+ xy_cor[1]['type'] = 1
230
+ xy_cor[2]['type'] = 0
231
+ xy_cor[3]['type'] = 1
232
+ else:
233
+ xy_cor[0]['type'] = 1
234
+ xy_cor[1]['type'] = 0
235
+ xy_cor[2]['type'] = 1
236
+ xy_cor[3]['type'] = 0
237
+
238
+ return xy_cor
239
+
240
+
241
+ def gen_ww_general(init_coorx, xy, gpid, tol):
242
+ xy_cor = []
243
+ assert len(init_coorx) == len(np.unique(gpid))
244
+
245
+ # Candidate for each part seperated by wall-wall boundary
246
+ for j in range(len(init_coorx)):
247
+ now_x = xy[gpid == j, 0]
248
+ now_y = xy[gpid == j, 1]
249
+ new_x, x_score, x_l1 = vote(now_x, tol)
250
+ new_y, y_score, y_l1 = vote(now_y, tol)
251
+ u0 = np_coorx2u(init_coorx[(j - 1 + len(init_coorx)) % len(init_coorx)])
252
+ u1 = np_coorx2u(init_coorx[j])
253
+ if (x_score, -x_l1) > (y_score, -y_l1):
254
+ xy_cor.append({'type': 0, 'val': new_x, 'score': x_score, 'action': 'ori', 'gpid': j, 'u0': u0, 'u1': u1, 'tbd': True})
255
+ else:
256
+ xy_cor.append({'type': 1, 'val': new_y, 'score': y_score, 'action': 'ori', 'gpid': j, 'u0': u0, 'u1': u1, 'tbd': True})
257
+
258
+ # Construct wall from highest score to lowest
259
+ while True:
260
+ # Finding undetermined wall with highest score
261
+ tbd = -1
262
+ for i in range(len(xy_cor)):
263
+ if xy_cor[i]['tbd'] and (tbd == -1 or xy_cor[i]['score'] > xy_cor[tbd]['score']):
264
+ tbd = i
265
+ if tbd == -1:
266
+ break
267
+
268
+ # This wall is determined
269
+ xy_cor[tbd]['tbd'] = False
270
+ p_idx = (tbd - 1 + len(xy_cor)) % len(xy_cor)
271
+ n_idx = (tbd + 1) % len(xy_cor)
272
+
273
+ num_tbd_neighbor = xy_cor[p_idx]['tbd'] + xy_cor[n_idx]['tbd']
274
+
275
+ # Two adjacency walls are not determined yet => not special case
276
+ if num_tbd_neighbor == 2:
277
+ continue
278
+
279
+ # Only one of adjacency two walls is determine => add now or later special case
280
+ if num_tbd_neighbor == 1:
281
+ if (not xy_cor[p_idx]['tbd'] and xy_cor[p_idx]['type'] == xy_cor[tbd]['type']) or\
282
+ (not xy_cor[n_idx]['tbd'] and xy_cor[n_idx]['type'] == xy_cor[tbd]['type']):
283
+ # Current wall is different from one determined adjacency wall
284
+ if xy_cor[tbd]['score'] >= -1:
285
+ # Later special case, add current to tbd
286
+ xy_cor[tbd]['tbd'] = True
287
+ xy_cor[tbd]['score'] -= 100
288
+ else:
289
+ # Fallback: forced change the current wall or infinite loop
290
+ if not xy_cor[p_idx]['tbd']:
291
+ insert_at = tbd
292
+ if xy_cor[p_idx]['type'] == 0:
293
+ new_val = np_x_u_solve_y(xy_cor[p_idx]['val'], xy_cor[p_idx]['u1'])
294
+ new_type = 1
295
+ else:
296
+ new_val = np_y_u_solve_x(xy_cor[p_idx]['val'], xy_cor[p_idx]['u1'])
297
+ new_type = 0
298
+ else:
299
+ insert_at = n_idx
300
+ if xy_cor[n_idx]['type'] == 0:
301
+ new_val = np_x_u_solve_y(xy_cor[n_idx]['val'], xy_cor[n_idx]['u0'])
302
+ new_type = 1
303
+ else:
304
+ new_val = np_y_u_solve_x(xy_cor[n_idx]['val'], xy_cor[n_idx]['u0'])
305
+ new_type = 0
306
+ new_add = {'type': new_type, 'val': new_val, 'score': 0, 'action': 'forced infer', 'gpid': -1, 'u0': -1, 'u1': -1, 'tbd': False}
307
+ xy_cor.insert(insert_at, new_add)
308
+ continue
309
+
310
+ # Below checking special case
311
+ if xy_cor[p_idx]['type'] == xy_cor[n_idx]['type']:
312
+ # Two adjacency walls are same type, current wall should be differen type
313
+ if xy_cor[tbd]['type'] == xy_cor[p_idx]['type']:
314
+ # Fallback: three walls with same type => forced change the middle wall
315
+ xy_cor[tbd]['type'] = (xy_cor[tbd]['type'] + 1) % 2
316
+ xy_cor[tbd]['action'] = 'forced change'
317
+ xy_cor[tbd]['val'] = xy[gpid == xy_cor[tbd]['gpid'], xy_cor[tbd]['type']].mean()
318
+ else:
319
+ # Two adjacency walls are different type => add one
320
+ tp0 = xy_cor[n_idx]['type']
321
+ tp1 = xy_cor[p_idx]['type']
322
+ if xy_cor[p_idx]['type'] == 0:
323
+ val0 = np_x_u_solve_y(xy_cor[p_idx]['val'], xy_cor[p_idx]['u1'])
324
+ val1 = np_y_u_solve_x(xy_cor[n_idx]['val'], xy_cor[n_idx]['u0'])
325
+ else:
326
+ val0 = np_y_u_solve_x(xy_cor[p_idx]['val'], xy_cor[p_idx]['u1'])
327
+ val1 = np_x_u_solve_y(xy_cor[n_idx]['val'], xy_cor[n_idx]['u0'])
328
+ new_add = [
329
+ {'type': tp0, 'val': val0, 'score': 0, 'action': 'forced infer', 'gpid': -1, 'u0': -1, 'u1': -1, 'tbd': False},
330
+ {'type': tp1, 'val': val1, 'score': 0, 'action': 'forced infer', 'gpid': -1, 'u0': -1, 'u1': -1, 'tbd': False},
331
+ ]
332
+ xy_cor = xy_cor[:tbd] + new_add + xy_cor[tbd+1:]
333
+
334
+ return xy_cor
335
+
336
+
337
+ def gen_ww(init_coorx, coory, z=50, coorW=1024, coorH=512, floorW=1024, floorH=512, tol=3, force_cuboid=True):
338
+ gpid = get_gpid(init_coorx, coorW)
339
+ coor = np.hstack([np.arange(coorW)[:, None], coory[:, None]])
340
+ xy = np_coor2xy(coor, z, coorW, coorH, floorW, floorH)
341
+
342
+ # Generate wall-wall
343
+ if force_cuboid:
344
+ xy_cor = gen_ww_cuboid(xy, gpid, tol)
345
+ else:
346
+ xy_cor = gen_ww_general(init_coorx, xy, gpid, tol)
347
+
348
+ # Ceiling view to normal view
349
+ cor = []
350
+ for j in range(len(xy_cor)):
351
+ next_j = (j + 1) % len(xy_cor)
352
+ if xy_cor[j]['type'] == 1:
353
+ cor.append((xy_cor[next_j]['val'], xy_cor[j]['val']))
354
+ else:
355
+ cor.append((xy_cor[j]['val'], xy_cor[next_j]['val']))
356
+ cor = np_xy2coor(np.array(cor), z, coorW, coorH, floorW, floorH)
357
+ cor = np.roll(cor, -2 * cor[::2, 0].argmin(), axis=0)
358
+
359
+ return cor, xy_cor
horizonnet/misc/structured3d_extract_zip.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import argparse
3
+ from zipfile import ZipFile
4
+ from tqdm import tqdm
5
+ import imageio
6
+
7
+ '''
8
+ Zipfile format assumption:
9
+ Structured3D
10
+ -- [scene_xxxxx]
11
+ -- other something
12
+ -- 2D_rendering
13
+ -- [image_id]
14
+ -- panorama
15
+ -- camera_xyz.txt
16
+ -- layout.txt
17
+ -- [empty|simple|full]
18
+ -- depth.png
19
+ -- rgb_rawlight.png
20
+ -- rgb_coldlight.png
21
+ -- rgb_warmlight.png
22
+ -- other something
23
+
24
+ Output format
25
+ outdir
26
+ -- [scene_xxxxx]
27
+ -- img
28
+ -- layout
29
+ '''
30
+
31
+ parser = argparse.ArgumentParser()
32
+ parser.add_argument('--zippath', required=True)
33
+ parser.add_argument('--style', default='full')
34
+ parser.add_argument('--outdir', default='structured3d')
35
+ args = parser.parse_args()
36
+
37
+ path_format = 'Structured3D/%s/2D_rendering/%s/panorama/%s'
38
+
39
+ with ZipFile(args.zippath) as zipf:
40
+ id_set = set()
41
+ for path in zipf.namelist():
42
+ assert path.startswith('Structured3D')
43
+ if path.endswith('camera_xyz.txt'):
44
+ path_lst = path.split('/')
45
+ scene_id = path_lst[1]
46
+ image_id = path_lst[3]
47
+ id_set.add((scene_id, image_id))
48
+
49
+ for scene_id, image_id in tqdm(id_set):
50
+ path_img = path_format % (scene_id, image_id, '%s/rgb_rawlight.png' % args.style)
51
+ path_layout = path_format % (scene_id, image_id, 'layout.txt')
52
+
53
+ os.makedirs(os.path.join(args.outdir, scene_id, 'rgb'), exist_ok=True)
54
+ os.makedirs(os.path.join(args.outdir, scene_id, 'layout'), exist_ok=True)
55
+
56
+ with zipf.open(path_img) as f:
57
+ rgb = imageio.imread(f)[..., :3]
58
+ imageio.imwrite(os.path.join(args.outdir, scene_id, 'rgb', image_id + '_rgb_rawlight.png'), rgb)
59
+ with zipf.open(path_layout) as f:
60
+ with open(os.path.join(args.outdir, scene_id, 'layout', image_id + '_layout.txt'), 'w') as fo:
61
+ fo.write(f.read().decode())
horizonnet/misc/structured3d_prepare_dataset.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import argparse
3
+ from zipfile import ZipFile
4
+ from tqdm import tqdm
5
+ import imageio
6
+
7
+ '''
8
+ Assume datas is extracted by `misc/structured3d_extract_zip.py`.
9
+ That is to said, assuming following structure:
10
+ - {in_root}/scene_xxxxx
11
+ - rgb/
12
+ - *png
13
+ - layout/
14
+ - *txt
15
+
16
+ The reorganized structure as follow:
17
+ - {out_train_root}
18
+ - img/
19
+ - scene_xxxxx_*png (softlink)
20
+ - label_cor/
21
+ - scene_xxxxx_*txt (softlink)
22
+ - {out_valid_root} ...
23
+ - {out_test_root} ...
24
+ '''
25
+ TRAIN_SCENE = ['scene_%05d' % i for i in range(0, 3000)]
26
+ VALID_SCENE = ['scene_%05d' % i for i in range(3000, 3250)]
27
+ TEST_SCENE = ['scene_%05d' % i for i in range(3250, 3500)]
28
+
29
+ parser = argparse.ArgumentParser()
30
+ parser.add_argument('--in_root', required=True)
31
+ parser.add_argument('--out_train_root', default='data/st3d_train_full_raw_light')
32
+ parser.add_argument('--out_valid_root', default='data/st3d_valid_full_raw_light')
33
+ parser.add_argument('--out_test_root', default='data/st3d_test_full_raw_light')
34
+ args = parser.parse_args()
35
+
36
+ def prepare_dataset(scene_ids, out_dir):
37
+ root_img = os.path.join(out_dir, 'img')
38
+ root_cor = os.path.join(out_dir, 'label_cor')
39
+ os.makedirs(root_img, exist_ok=True)
40
+ os.makedirs(root_cor, exist_ok=True)
41
+ for scene_id in tqdm(scene_ids):
42
+ source_img_root = os.path.join(args.in_root, scene_id, 'rgb')
43
+ source_cor_root = os.path.join(args.in_root, scene_id, 'layout')
44
+ for fname in os.listdir(source_cor_root):
45
+ room_id = fname.split('_')[0]
46
+ source_img_path = os.path.join(args.in_root, scene_id, 'rgb', room_id + '_rgb_rawlight.png')
47
+ source_cor_path = os.path.join(args.in_root, scene_id, 'layout', room_id + '_layout.txt')
48
+ target_img_path = os.path.join(root_img, '%s_%s.png' % (scene_id, room_id))
49
+ target_cor_path = os.path.join(root_cor, '%s_%s.txt' % (scene_id, room_id))
50
+ assert os.path.isfile(source_img_path)
51
+ assert os.path.isfile(source_cor_path)
52
+ os.symlink(source_img_path, target_img_path)
53
+ os.symlink(source_cor_path, target_cor_path)
54
+
55
+ prepare_dataset(TRAIN_SCENE, args.out_train_root)
56
+ prepare_dataset(VALID_SCENE, args.out_valid_root)
57
+ prepare_dataset(TEST_SCENE, args.out_test_root)
horizonnet/misc/utils.py ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ from collections import OrderedDict
4
+
5
+
6
+ def group_weight(module):
7
+ # Group module parameters into two group
8
+ # One need weight_decay and the other doesn't
9
+ group_decay = []
10
+ group_no_decay = []
11
+ for m in module.modules():
12
+ if isinstance(m, nn.Linear):
13
+ group_decay.append(m.weight)
14
+ if m.bias is not None:
15
+ group_no_decay.append(m.bias)
16
+ elif isinstance(m, nn.modules.conv._ConvNd):
17
+ group_decay.append(m.weight)
18
+ if m.bias is not None:
19
+ group_no_decay.append(m.bias)
20
+ elif isinstance(m, nn.modules.batchnorm._BatchNorm):
21
+ if m.weight is not None:
22
+ group_no_decay.append(m.weight)
23
+ if m.bias is not None:
24
+ group_no_decay.append(m.bias)
25
+ elif isinstance(m, nn.GroupNorm):
26
+ if m.weight is not None:
27
+ group_no_decay.append(m.weight)
28
+ if m.bias is not None:
29
+ group_no_decay.append(m.bias)
30
+
31
+ assert len(list(module.parameters())) == len(group_decay) + len(group_no_decay)
32
+ return [dict(params=group_decay), dict(params=group_no_decay, weight_decay=.0)]
33
+
34
+
35
+ def adjust_learning_rate(optimizer, args):
36
+ if args.cur_iter < args.warmup_iters:
37
+ frac = args.cur_iter / args.warmup_iters
38
+ step = args.lr - args.warmup_lr
39
+ args.running_lr = args.warmup_lr + step * frac
40
+ else:
41
+ frac = (float(args.cur_iter) - args.warmup_iters) / (args.max_iters - args.warmup_iters)
42
+ scale_running_lr = max((1. - frac), 0.) ** args.lr_pow
43
+ args.running_lr = args.lr * scale_running_lr
44
+
45
+ for param_group in optimizer.param_groups:
46
+ param_group['lr'] = args.running_lr
47
+
48
+
49
+ def save_model(net, path, args):
50
+ state_dict = OrderedDict({
51
+ 'args': args.__dict__,
52
+ 'kwargs': {
53
+ 'backbone': net.backbone,
54
+ 'use_rnn': net.use_rnn,
55
+ },
56
+ 'state_dict': net.state_dict(),
57
+ })
58
+ torch.save(state_dict, path)
59
+
60
+
61
+ def load_trained_model(Net, path):
62
+ state_dict = torch.load(path, map_location='cpu')
63
+
64
+ # Compatibilidad con diferentes formatos de checkpoint
65
+ if 'kwargs' in state_dict:
66
+ # Formato antiguo: con kwargs
67
+ net = Net(**state_dict['kwargs'])
68
+ elif 'backbone' in state_dict:
69
+ # Formato de entrenamiento: con backbone directo
70
+ backbone = state_dict.get('backbone', 'resnet50')
71
+ net = Net(backbone, use_rnn=True)
72
+ else:
73
+ # Fallback: usar valores por defecto
74
+ net = Net('resnet50', use_rnn=True)
75
+
76
+ net.load_state_dict(state_dict['state_dict'])
77
+ return net
horizonnet/misc/zind_prepare_dataset.py ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ import multiprocessing
4
+ from tqdm import tqdm
5
+ import numpy as np
6
+ from PIL import Image
7
+ import functools
8
+
9
+
10
+ def label_iterator(label):
11
+ for floor_id, floor_data in label['merger'].items():
12
+ for complete_room_id, complete_room_data in floor_data.items():
13
+ for partial_room_id, partial_room_data in complete_room_data.items():
14
+ for pano_id, pano_data in partial_room_data.items():
15
+ yield floor_id, partial_room_id, pano_id, pano_data
16
+
17
+
18
+ def show_statistic(root, scene_id_lst):
19
+ sta = []
20
+ for scene_id in scene_id_lst:
21
+ label = json.load(open(os.path.join(root, scene_id, 'zind_data.json')))
22
+ for floor_id, partial_room_id, pano_id, pano_data in label_iterator(label):
23
+ sta.append([pano_data['is_primary'], pano_data['is_inside'], pano_data.get('is_ceiling_flat', False)])
24
+ sta = np.array(sta)
25
+ is_primary = sta[:,0].astype(bool)
26
+ is_inside = sta[:,1].astype(bool)
27
+ is_ceiling_flat = sta[:,2].astype(bool)
28
+ print(f'is_primary : {is_primary.sum()} ({is_primary.mean()*100:.1f}%)')
29
+ print(f'is_inside : {is_inside.sum()} ({is_inside.mean()*100:.1f}%)')
30
+ print(f'is_ceiling_flat : {is_ceiling_flat.sum()} ({is_ceiling_flat.mean()*100:.1f}%)')
31
+ print(f'is_inside given that is_primary : {is_inside[is_primary].sum()} ({is_inside[is_primary].mean()*100:.1f}%)')
32
+ print(f'is_ceiling_flat given that is_primary : {is_ceiling_flat[is_primary].sum()} ({is_ceiling_flat[is_primary].mean()*100:.1f}%)')
33
+
34
+
35
+ def run(scene_id, split, args):
36
+ label = json.load(open(os.path.join(args.indir, scene_id, 'zind_data.json')))
37
+ for floor_id, partial_room_id, pano_id, pano_data in label_iterator(label):
38
+ if args.geometry not in pano_data:
39
+ continue
40
+ if args.is_primary != -1:
41
+ if (args.is_primary == 0 and pano_data['is_primary']) or\
42
+ (args.is_primary == 1 and not pano_data['is_primary']):
43
+ continue
44
+ if args.is_inside != -1:
45
+ if (args.is_inside == 0 and pano_data['is_inside']) or\
46
+ (args.is_inside == 1 and not pano_data['is_inside']):
47
+ continue
48
+ if args.is_ceiling_flat != -1:
49
+ if (args.is_ceiling_flat == 0 and pano_data.get('is_ceiling_flat', False)) or\
50
+ (args.is_ceiling_flat == 1 and not pano_data.get('is_ceiling_flat', False)):
51
+ continue
52
+ key = f'{floor_id}_{partial_room_id}_{pano_id}'
53
+ img_path = os.path.join(args.indir, scene_id, 'panos', f'{key}.jpg')
54
+ assert os.path.isfile(img_path), f'Image not found {img_path}'
55
+ floor_z = -pano_data['camera_height']
56
+ ceiling_z = pano_data['ceiling_height'] - pano_data['camera_height']
57
+ vertices = np.array(pano_data[args.geometry]['vertices'])
58
+ theta = np.arctan2(-vertices[:,0], vertices[:,1])
59
+ ceiling_phi = np.arctan2(ceiling_z, np.sqrt((vertices**2).sum(1)))
60
+ floor_phi = np.arctan2(floor_z, np.sqrt((vertices**2).sum(1)))
61
+ coor_x = (theta + np.pi) / (2.0*np.pi) * (args.width - 1)
62
+ coor_y0 = (1 - (ceiling_phi + np.pi/2.0)/np.pi) * (args.width/2 - 1)
63
+ coor_y1 = (1 - (floor_phi + np.pi/2.0)/np.pi) * (args.width/2 - 1)
64
+ img = Image.open(img_path).resize((args.width, args.width//2), Image.LANCZOS)
65
+ img.save(os.path.join(args.outdir, split, 'img', f'{scene_id}_{key}.jpg'), quality=95, optimize=True)
66
+ with open(os.path.join(args.outdir, split, 'label_cor', f'{scene_id}_{key}.txt'), 'w') as f:
67
+ for i in range(len(coor_x)):
68
+ f.write(f'{coor_x[i]:.1f} {coor_y0[i]:.1f}\n')
69
+ f.write(f'{coor_x[i]:.1f} {coor_y1[i]:.1f}\n')
70
+
71
+
72
+ if __name__ == '__main__':
73
+ import argparse
74
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
75
+ parser.add_argument('--partition', default='zind_partition.json')
76
+ parser.add_argument('--indir', default='data/')
77
+ parser.add_argument('--outdir', default='zind_horizonnet/')
78
+ parser.add_argument('--width', default=1024, type=int)
79
+ parser.add_argument('--geometry', default='layout_visible')
80
+ parser.add_argument('--is_primary', default=1, choices=[-1,0,1], type=int,
81
+ help='-1 dont care / 0 false only / 1 true only')
82
+ parser.add_argument('--is_inside', default=1, choices=[-1,0,1], type=int,
83
+ help='-1 dont care / 0 false only / 1 true only')
84
+ parser.add_argument('--is_ceiling_flat', default=1, choices=[-1,0,1], type=int,
85
+ help='-1 dont care / 0 false only / 1 true only')
86
+ parser.add_argument('--num_workers', default=10, type=int)
87
+ args = parser.parse_args()
88
+
89
+ assert os.path.isfile(args.partition), f'Partition not found: {args.partition}'
90
+ assert os.path.exists(args.indir), f'Dir not found: {args.indir}'
91
+
92
+ partition = json.load(open(args.partition))
93
+
94
+ for split, scene_id_lst in partition.items():
95
+ os.makedirs(os.path.join(args.outdir, split, 'img'), exist_ok=True)
96
+ os.makedirs(os.path.join(args.outdir, split, 'label_cor'), exist_ok=True)
97
+ print(f'Processing split: {split}')
98
+ #show_statistic(args.indir, scene_id_lst)
99
+ if args.num_workers > 1:
100
+ run_partial = functools.partial(run, split=split, args=args)
101
+ with multiprocessing.Pool(args.num_workers) as pool:
102
+ list(tqdm(pool.imap(run_partial, scene_id_lst)))
103
+ else:
104
+ for scene_id in tqdm(scene_id_lst):
105
+ run(split, scene_id, args)
106
+
horizonnet/model.py ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+ import torch
4
+ import torch.nn as nn
5
+ import torch.nn.functional as F
6
+ import torchvision.models as models
7
+ import functools
8
+ import torchvision
9
+ from distutils.version import LooseVersion
10
+ is_old_version = LooseVersion(torchvision.__version__) < LooseVersion("0.13.0")
11
+ is_new_version = LooseVersion(torchvision.__version__) >= LooseVersion("0.13.0")
12
+
13
+ if is_new_version:
14
+ from torchvision.models import ResNet50_Weights, DenseNet121_Weights
15
+ else:
16
+ pass
17
+
18
+ ENCODER_RESNET = [
19
+ 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152',
20
+ 'resnext50_32x4d', 'resnext101_32x8d'
21
+ ]
22
+ ENCODER_DENSENET = [
23
+ 'densenet121', 'densenet169', 'densenet161', 'densenet201'
24
+ ]
25
+
26
+
27
+ def lr_pad(x, padding=1):
28
+ ''' Pad left/right-most to each other instead of zero padding '''
29
+ return torch.cat([x[..., -padding:], x, x[..., :padding]], dim=3)
30
+
31
+
32
+ class LR_PAD(nn.Module):
33
+ ''' Pad left/right-most to each other instead of zero padding '''
34
+ def __init__(self, padding=1):
35
+ super(LR_PAD, self).__init__()
36
+ self.padding = padding
37
+
38
+ def forward(self, x):
39
+ return lr_pad(x, self.padding)
40
+
41
+
42
+ def wrap_lr_pad(net):
43
+ for name, m in net.named_modules():
44
+ if not isinstance(m, nn.Conv2d):
45
+ continue
46
+ if m.padding[1] == 0:
47
+ continue
48
+ w_pad = int(m.padding[1])
49
+ m.padding = (m.padding[0], 0)
50
+ names = name.split('.')
51
+ root = functools.reduce(lambda o, i: getattr(o, i), [net] + names[:-1])
52
+ setattr(
53
+ root, names[-1],
54
+ nn.Sequential(LR_PAD(w_pad), m)
55
+ )
56
+
57
+
58
+ '''
59
+ Encoder
60
+ '''
61
+ class Resnet(nn.Module):
62
+ def __init__(self, backbone='resnet50', pretrained=True, weights=None):
63
+ super(Resnet, self).__init__()
64
+ assert backbone in ENCODER_RESNET
65
+ if is_old_version:
66
+ self.encoder = getattr(models, backbone)(pretrained=pretrained)
67
+ elif is_new_version:
68
+ self.encoder = getattr(models, backbone)(weights=ResNet50_Weights.IMAGENET1K_V1)
69
+ del self.encoder.fc, self.encoder.avgpool
70
+
71
+ def forward(self, x):
72
+ features = []
73
+ x = self.encoder.conv1(x)
74
+ x = self.encoder.bn1(x)
75
+ x = self.encoder.relu(x)
76
+ x = self.encoder.maxpool(x)
77
+
78
+ x = self.encoder.layer1(x); features.append(x) # 1/4
79
+ x = self.encoder.layer2(x); features.append(x) # 1/8
80
+ x = self.encoder.layer3(x); features.append(x) # 1/16
81
+ x = self.encoder.layer4(x); features.append(x) # 1/32
82
+ return features
83
+
84
+ def list_blocks(self):
85
+ lst = [m for m in self.encoder.children()]
86
+ block0 = lst[:4]
87
+ block1 = lst[4:5]
88
+ block2 = lst[5:6]
89
+ block3 = lst[6:7]
90
+ block4 = lst[7:8]
91
+ return block0, block1, block2, block3, block4
92
+
93
+
94
+ class Densenet(nn.Module):
95
+ def __init__(self, backbone='densenet169', pretrained=True, weights=None):
96
+ super(Densenet, self).__init__()
97
+ assert backbone in ENCODER_DENSENET
98
+ self.encoder = getattr(models, backbone)(pretrained=pretrained)
99
+ self.final_relu = nn.ReLU(inplace=True)
100
+ del self.encoder.classifier
101
+
102
+ def forward(self, x):
103
+ lst = []
104
+ for m in self.encoder.features.children():
105
+ x = m(x)
106
+ lst.append(x)
107
+ features = [lst[4], lst[6], lst[8], self.final_relu(lst[11])]
108
+ return features
109
+
110
+ def list_blocks(self):
111
+ lst = [m for m in self.encoder.features.children()]
112
+ block0 = lst[:4]
113
+ block1 = lst[4:6]
114
+ block2 = lst[6:8]
115
+ block3 = lst[8:10]
116
+ block4 = lst[10:]
117
+ return block0, block1, block2, block3, block4
118
+
119
+
120
+ '''
121
+ Decoder
122
+ '''
123
+ class ConvCompressH(nn.Module):
124
+ ''' Reduce feature height by factor of two '''
125
+ def __init__(self, in_c, out_c, ks=3):
126
+ super(ConvCompressH, self).__init__()
127
+ assert ks % 2 == 1
128
+ self.layers = nn.Sequential(
129
+ nn.Conv2d(in_c, out_c, kernel_size=ks, stride=(2, 1), padding=ks//2),
130
+ nn.BatchNorm2d(out_c),
131
+ nn.ReLU(inplace=True),
132
+ )
133
+
134
+ def forward(self, x):
135
+ return self.layers(x)
136
+
137
+
138
+ class GlobalHeightConv(nn.Module):
139
+ def __init__(self, in_c, out_c):
140
+ super(GlobalHeightConv, self).__init__()
141
+ self.layer = nn.Sequential(
142
+ ConvCompressH(in_c, in_c//2),
143
+ ConvCompressH(in_c//2, in_c//2),
144
+ ConvCompressH(in_c//2, in_c//4),
145
+ ConvCompressH(in_c//4, out_c),
146
+ )
147
+
148
+ def forward(self, x, out_w):
149
+ x = self.layer(x)
150
+
151
+ assert out_w % x.shape[3] == 0
152
+ factor = out_w // x.shape[3]
153
+ x = torch.cat([x[..., -1:], x, x[..., :1]], 3)
154
+ x = F.interpolate(x, size=(x.shape[2], out_w + 2 * factor), mode='bilinear', align_corners=False)
155
+ x = x[..., factor:-factor]
156
+ return x
157
+
158
+
159
+ class GlobalHeightStage(nn.Module):
160
+ def __init__(self, c1, c2, c3, c4, out_scale=8):
161
+ ''' Process 4 blocks from encoder to single multiscale features '''
162
+ super(GlobalHeightStage, self).__init__()
163
+ self.cs = c1, c2, c3, c4
164
+ self.out_scale = out_scale
165
+ self.ghc_lst = nn.ModuleList([
166
+ GlobalHeightConv(c1, c1//out_scale),
167
+ GlobalHeightConv(c2, c2//out_scale),
168
+ GlobalHeightConv(c3, c3//out_scale),
169
+ GlobalHeightConv(c4, c4//out_scale),
170
+ ])
171
+
172
+ def forward(self, conv_list, out_w):
173
+ assert len(conv_list) == 4
174
+ bs = conv_list[0].shape[0]
175
+ feature = torch.cat([
176
+ f(x, out_w).reshape(bs, -1, out_w)
177
+ for f, x, out_c in zip(self.ghc_lst, conv_list, self.cs)
178
+ ], dim=1)
179
+ return feature
180
+
181
+
182
+ '''
183
+ HorizonNet
184
+ '''
185
+ class HorizonNet(nn.Module):
186
+ x_mean = torch.FloatTensor(np.array([0.485, 0.456, 0.406])[None, :, None, None])
187
+ x_std = torch.FloatTensor(np.array([0.229, 0.224, 0.225])[None, :, None, None])
188
+
189
+ def __init__(self, backbone, use_rnn):
190
+ super(HorizonNet, self).__init__()
191
+ self.backbone = backbone
192
+ self.use_rnn = use_rnn
193
+ self.out_scale = 8
194
+ self.step_cols = 4
195
+ self.rnn_hidden_size = 512
196
+
197
+ # Encoder
198
+ if is_old_version:
199
+ if backbone.startswith('res'):
200
+ self.feature_extractor = Resnet(backbone, pretrained=True)
201
+ elif backbone.startswith('dense'):
202
+ self.feature_extractor = Densenet(backbone, pretrained=True)
203
+ else:
204
+ raise NotImplementedError()
205
+ elif is_new_version:
206
+ if backbone.startswith('res'):
207
+ self.feature_extractor = Resnet(backbone, weights=ResNet50_Weights.IMAGENET1K_V1)
208
+ elif backbone.startswith('dense'):
209
+ self.feature_extractor = Densenet(backbone, weights=DenseNet121_Weights.IMAGENET1K_V1)
210
+
211
+ # Inference channels number from each block of the encoder
212
+ with torch.no_grad():
213
+ dummy = torch.zeros(1, 3, 512, 1024)
214
+ c1, c2, c3, c4 = [b.shape[1] for b in self.feature_extractor(dummy)]
215
+ c_last = (c1*8 + c2*4 + c3*2 + c4*1) // self.out_scale
216
+
217
+ # Convert features from 4 blocks of the encoder into B x C x 1 x W'
218
+ self.reduce_height_module = GlobalHeightStage(c1, c2, c3, c4, self.out_scale)
219
+
220
+ # 1D prediction
221
+ if self.use_rnn:
222
+ self.bi_rnn = nn.LSTM(input_size=c_last,
223
+ hidden_size=self.rnn_hidden_size,
224
+ num_layers=2,
225
+ dropout=0.5,
226
+ batch_first=False,
227
+ bidirectional=True)
228
+ self.drop_out = nn.Dropout(0.5)
229
+ self.linear = nn.Linear(in_features=2 * self.rnn_hidden_size,
230
+ out_features=3 * self.step_cols)
231
+ self.linear.bias.data[0*self.step_cols:1*self.step_cols].fill_(-1)
232
+ self.linear.bias.data[1*self.step_cols:2*self.step_cols].fill_(-0.478)
233
+ self.linear.bias.data[2*self.step_cols:3*self.step_cols].fill_(0.425)
234
+ else:
235
+ self.linear = nn.Sequential(
236
+ nn.Linear(c_last, self.rnn_hidden_size),
237
+ nn.ReLU(inplace=True),
238
+ nn.Dropout(0.5),
239
+ nn.Linear(self.rnn_hidden_size, 3 * self.step_cols),
240
+ )
241
+ self.linear[-1].bias.data[0*self.step_cols:1*self.step_cols].fill_(-1)
242
+ self.linear[-1].bias.data[1*self.step_cols:2*self.step_cols].fill_(-0.478)
243
+ self.linear[-1].bias.data[2*self.step_cols:3*self.step_cols].fill_(0.425)
244
+ self.x_mean.requires_grad = False
245
+ self.x_std.requires_grad = False
246
+ wrap_lr_pad(self)
247
+
248
+ def _prepare_x(self, x):
249
+ if self.x_mean.device != x.device:
250
+ self.x_mean = self.x_mean.to(x.device)
251
+ self.x_std = self.x_std.to(x.device)
252
+ return (x[:, :3] - self.x_mean) / self.x_std
253
+
254
+ def forward(self, x):
255
+ if x.shape[2] != 512 or x.shape[3] != 1024:
256
+ raise NotImplementedError()
257
+ x = self._prepare_x(x)
258
+ conv_list = self.feature_extractor(x)
259
+ feature = self.reduce_height_module(conv_list, x.shape[3]//self.step_cols)
260
+
261
+ # rnn
262
+ if self.use_rnn:
263
+ feature = feature.permute(2, 0, 1) # [w, b, c*h]
264
+ output, hidden = self.bi_rnn(feature) # [seq_len, b, num_directions * hidden_size]
265
+ output = self.drop_out(output)
266
+ output = self.linear(output) # [seq_len, b, 3 * step_cols]
267
+ output = output.view(output.shape[0], output.shape[1], 3, self.step_cols) # [seq_len, b, 3, step_cols]
268
+ output = output.permute(1, 2, 0, 3) # [b, 3, seq_len, step_cols]
269
+ output = output.contiguous().view(output.shape[0], 3, -1) # [b, 3, seq_len*step_cols]
270
+ else:
271
+ feature = feature.permute(0, 2, 1) # [b, w, c*h]
272
+ output = self.linear(feature) # [b, w, 3 * step_cols]
273
+ output = output.view(output.shape[0], output.shape[1], 3, self.step_cols) # [b, w, 3, step_cols]
274
+ output = output.permute(0, 2, 1, 3) # [b, 3, w, step_cols]
275
+ output = output.contiguous().view(output.shape[0], 3, -1) # [b, 3, w*step_cols]
276
+
277
+ # output.shape => B x 3 x W
278
+ cor = output[:, :1] # B x 1 x W
279
+ bon = output[:, 1:] # B x 2 x W
280
+
281
+ return bon, cor
horizonnet/preprocess.py ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '''
2
+ This script preprocess the given 360 panorama image under euqirectangular projection
3
+ and dump them to the given directory for further layout prediction and visualization.
4
+ The script will:
5
+ - extract and dump the vanishing points
6
+ - rotate the equirect image to align with the detected VP
7
+ - extract the VP aligned line segments (for further layout prediction model)
8
+ The dump files:
9
+ - `*_VP.txt` is the vanishg points
10
+ - `*_aligned_rgb.png` is the VP aligned RGB image
11
+ - `*_aligned_line.png` is the VP aligned line segments images
12
+
13
+ Author: Cheng Sun
14
+ Email : chengsun@gapp.nthu.edu.tw
15
+ '''
16
+
17
+ import os
18
+ import glob
19
+ import argparse
20
+ import numpy as np
21
+ from PIL import Image
22
+
23
+ from misc.pano_lsd_align import panoEdgeDetection, rotatePanorama
24
+
25
+
26
+ parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter)
27
+ # I/O related arguments
28
+ parser.add_argument('--img_glob', required=True,
29
+ help='NOTE: Remeber to quote your glob path.')
30
+ parser.add_argument('--output_dir', required=True)
31
+ parser.add_argument('--rgbonly', action='store_true',
32
+ help='Add this if use are preparing customer dataset')
33
+ # Preprocessing related arguments
34
+ parser.add_argument('--q_error', default=0.7, type=float)
35
+ parser.add_argument('--refine_iter', default=3, type=int)
36
+ args = parser.parse_args()
37
+
38
+ paths = sorted(glob.glob(args.img_glob))
39
+ if len(paths) == 0:
40
+ print('no images found')
41
+
42
+ # Check given path exist
43
+ for path in paths:
44
+ assert os.path.isfile(path), '%s not found' % path
45
+
46
+ # Check target directory
47
+ if not os.path.isdir(args.output_dir):
48
+ print('Output directory %s not existed. Create one.')
49
+ os.makedirs(args.output_dir)
50
+
51
+ # Process each input
52
+ for i_path in paths:
53
+ print('Processing', i_path, flush=True)
54
+
55
+ # Load and cat input images
56
+ img_ori = np.array(Image.open(i_path).resize((1024, 512), Image.BICUBIC))[..., :3]
57
+
58
+ # VP detection and line segment extraction
59
+ _, vp, _, _, panoEdge, _, _ = panoEdgeDetection(img_ori,
60
+ qError=args.q_error,
61
+ refineIter=args.refine_iter)
62
+ panoEdge = (panoEdge > 0)
63
+
64
+ # Align images with VP
65
+ i_img = rotatePanorama(img_ori / 255.0, vp[2::-1])
66
+ l_img = rotatePanorama(panoEdge.astype(np.float32), vp[2::-1])
67
+
68
+ # Dump results
69
+ basename = os.path.splitext(os.path.basename(i_path))[0]
70
+ if args.rgbonly:
71
+ path = os.path.join(args.output_dir, '%s.png' % basename)
72
+ Image.fromarray((i_img * 255).astype(np.uint8)).save(path)
73
+ else:
74
+ path_VP = os.path.join(args.output_dir, '%s_VP.txt' % basename)
75
+ path_i_img = os.path.join(args.output_dir, '%s_aligned_rgb.png' % basename)
76
+ path_l_img = os.path.join(args.output_dir, '%s_aligned_line.png' % basename)
77
+
78
+ with open(path_VP, 'w') as f:
79
+ for i in range(3):
80
+ f.write('%.6f %.6f %.6f\n' % (vp[i, 0], vp[i, 1], vp[i, 2]))
81
+ Image.fromarray((i_img * 255).astype(np.uint8)).save(path_i_img)
82
+ Image.fromarray((l_img * 255).astype(np.uint8)).save(path_l_img)
horizonnet/traduccion.py ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import argparse
4
+ import numpy as np
5
+ import torch
6
+ import torch.nn as nn
7
+ from PIL import Image
8
+ import scipy.signal
9
+ import matplotlib.pyplot as plt
10
+ from torchvision import transforms
11
+
12
+ # Importamos la arquitectura del modelo desde el archivo del repositorio
13
+ # Asegúrate de que este script esté en la misma carpeta que model.py
14
+ try:
15
+ from model import HorizonNet
16
+ except ImportError:
17
+ print("Error: No se encuentra 'model.py'. Asegúrate de guardar este script en la raíz de la carpeta HorizonNet-master.")
18
+ sys.exit(1)
19
+
20
+ def cargar_modelo(ruta_checkpoint, device):
21
+ """
22
+ Carga el modelo entrenado y sus pesos.
23
+ """
24
+ print(f"Cargando modelo desde: {ruta_checkpoint}")
25
+
26
+ # Inicializar la arquitectura (Backbone ResNet50 es el default habitual)
27
+ # Si usaste otro backbone (ej. resnet18), cámbialo aquí.
28
+ net = HorizonNet(backbone='resnet50', use_rnn=True).to(device)
29
+
30
+ # Cargar los pesos
31
+ # map_location es importante para evitar errores si se entrenó en GPU y se usa CPU/MPS
32
+ checkpoint = torch.load(ruta_checkpoint, map_location=device)
33
+
34
+ # A veces el checkpoint guarda todo el estado ('state_dict') o solo los pesos
35
+ if 'state_dict' in checkpoint:
36
+ state_dict = checkpoint['state_dict']
37
+ else:
38
+ state_dict = checkpoint
39
+
40
+ # Fix para cuando el modelo se entrenó con DataParallel (nombres empiezan por 'module.')
41
+ new_state_dict = {}
42
+ for k, v in state_dict.items():
43
+ name = k[7:] if k.startswith('module.') else k
44
+ new_state_dict[name] = v
45
+
46
+ net.load_state_dict(new_state_dict)
47
+ net.eval() # Poner en modo evaluación (importante para BatchNorm/Dropout)
48
+ return net
49
+
50
+ def procesar_imagen(ruta_imagen):
51
+ """
52
+ Preprocesa la imagen panorámica al formato que espera HorizonNet (512x1024).
53
+ """
54
+ img_pil = Image.open(ruta_imagen).convert('RGB')
55
+
56
+ # Redimensionar a 512 (alto) x 1024 (ancho)
57
+ img_pil = img_pil.resize((1024, 512), Image.BICUBIC)
58
+
59
+ # Convertir a tensor y normalizar (Mean/Std estándar de ImageNet)
60
+ to_tensor = transforms.Compose([
61
+ transforms.ToTensor(),
62
+ transforms.Normalize(mean=[0.485, 0.456, 0.406],
63
+ std=[0.229, 0.224, 0.225])
64
+ ])
65
+
66
+ img_tensor = to_tensor(img_pil)
67
+ return img_tensor.unsqueeze(0), img_pil # Añadir dimensión de batch
68
+
69
+ def post_procesado_coordenadas(y_bon, y_cor, altura_camara=1.6):
70
+ """
71
+ Convierte la salida de la red neuronal en coordenadas 2D (planta).
72
+ """
73
+ W = 1024
74
+ H = 512
75
+
76
+ # 1. Detectar esquinas (Picos de probabilidad)
77
+ # distance=20 evita detectar picos demasiado juntos
78
+ # height=0.5 es el umbral de confianza (ajustable)
79
+ cor_ids, _ = scipy.signal.find_peaks(y_cor, height=0.5, distance=20)
80
+
81
+ # Fallback: Si no detecta esquinas, asumimos una forma básica o usamos todo el perímetro
82
+ if len(cor_ids) < 2:
83
+ print("Advertencia: No se detectaron esquinas claras. Usando muestreo uniforme.")
84
+ cor_ids = np.linspace(0, W-1, 50, dtype=int)
85
+
86
+ # Aseguramos que el último punto conecte con el primero para cerrar el polígono visualmente
87
+ # (Aunque para cálculos de área mejor no duplicarlo)
88
+
89
+ coordenadas_x = []
90
+ coordenadas_y = []
91
+
92
+ for c in cor_ids:
93
+ # A. Ángulo horizontal (Theta)
94
+ # Mapeamos 0..1024 a -Pi..Pi
95
+ theta = (c / W) * 2 * np.pi - np.pi
96
+
97
+ # B. Ángulo vertical (Phi) - Profundidad
98
+ # y_bon[1] es el suelo, y_bon[0] es el techo
99
+ v_suelo = y_bon[1, c]
100
+
101
+ # Convertir pixel Y a ángulo de elevación respecto al horizonte
102
+ # En HorizonNet: v=0 es techo, v=H es suelo. Centro es H/2.
103
+ phi = (v_suelo - (H / 2)) / (H / 2) * (np.pi / 2)
104
+
105
+ # Calcular distancia al suelo
106
+ # Evitamos división por cero o ángulos imposibles
107
+ if phi <= 0.05: phi = 0.05
108
+ distancia = altura_camara / np.tan(phi)
109
+
110
+ # C. Coordenadas Polares a Cartesianas
111
+ x = distancia * np.sin(theta)
112
+ y = distancia * np.cos(theta)
113
+
114
+ coordenadas_x.append(x)
115
+ coordenadas_y.append(y)
116
+
117
+ return list(zip(coordenadas_x, coordenadas_y))
118
+
119
+ def calcular_area(puntos):
120
+ """Calcula el área del polígono usando la fórmula de Shoelace (Gauß)"""
121
+ x = [p[0] for p in puntos]
122
+ y = [p[1] for p in puntos]
123
+ return 0.5 * np.abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)))
124
+
125
+ def visualizar_resultado(img_pil, puntos, output_path="resultado_layout.png"):
126
+ """
127
+ Genera una imagen con la vista panorámica y el plano 2D al lado.
128
+ """
129
+ plt.figure(figsize=(12, 6))
130
+
131
+ # 1. Imagen Original
132
+ plt.subplot(1, 2, 1)
133
+ plt.imshow(img_pil)
134
+ plt.title("Vista Panorámica (Input)")
135
+ plt.axis('off')
136
+
137
+ # 2. Plano 2D Generado
138
+ plt.subplot(1, 2, 2)
139
+
140
+ # Extraer X e Y
141
+ xs = [p[0] for p in puntos]
142
+ ys = [p[1] for p in puntos]
143
+
144
+ # Cerrar el polígono para el dibujo
145
+ xs.append(xs[0])
146
+ ys.append(ys[0])
147
+
148
+ plt.plot(xs, ys, 'b-', linewidth=2, marker='o')
149
+ plt.fill(xs, ys, alpha=0.3, color='blue')
150
+
151
+ # Dibujar la cámara
152
+ plt.plot(0, 0, 'rx', label="Cámara")
153
+
154
+ # Estética
155
+ plt.grid(True, linestyle='--', alpha=0.6)
156
+ plt.axis('equal') # Importante para no distorsionar proporciones
157
+ plt.title("Plano de Planta Reconstruido (Metros)")
158
+ plt.xlabel("X (metros)")
159
+ plt.ylabel("Y (metros)")
160
+ plt.legend()
161
+
162
+ # Guardar y mostrar
163
+ plt.tight_layout()
164
+ plt.savefig(output_path)
165
+ print(f"Gráfico guardado en: {output_path}")
166
+ plt.show()
167
+
168
+ def main():
169
+ # Configuración de argumentos
170
+ parser = argparse.ArgumentParser(description='Inferencia TFM - Layout Habitación')
171
+ parser.add_argument('--img', type=str, required=True, help='Ruta a la imagen panorámica 360')
172
+ parser.add_argument('--altura', type=float, default=1.6, help='Altura de la cámara en metros (Default: 1.6m)')
173
+ args = parser.parse_args()
174
+
175
+ # Configuración del dispositivo (Apple Silicon M4 support)
176
+ if torch.backends.mps.is_available():
177
+ device = torch.device("mps")
178
+ print("Usando dispositivo: Apple MPS (GPU)")
179
+ elif torch.cuda.is_available():
180
+ device = torch.device("cuda")
181
+ print("Usando dispositivo: CUDA (GPU)")
182
+ else:
183
+ device = torch.device("cpu")
184
+ print("Usando dispositivo: CPU")
185
+
186
+ # Ruta hardcodeada de tu modelo (puedes cambiarla o pasarla por arg)
187
+ MODEL_PATH = "/Users/ag/Documents/Master_Data_Science/97_TFM/App/HorizonNet-master/ckpt/zind_local_resnet50/best_model_5.pth.tar"
188
+
189
+ # 1. Cargar Modelo
190
+ try:
191
+ model = cargar_modelo(MODEL_PATH, device)
192
+ except FileNotFoundError:
193
+ print(f"Error: No se encuentra el archivo del modelo en: {MODEL_PATH}")
194
+ return
195
+
196
+ # 2. Procesar Imagen
197
+ try:
198
+ img_tensor, img_pil = procesar_imagen(args.img)
199
+ img_tensor = img_tensor.to(device)
200
+ except FileNotFoundError:
201
+ print(f"Error: No se encuentra la imagen en: {args.img}")
202
+ return
203
+
204
+ # 3. Inferencia
205
+ print("Ejecutando inferencia...")
206
+ with torch.no_grad():
207
+ # HorizonNet devuelve 3 valores: y_bon (techo/suelo), y_cor (esquinas)
208
+ y_bon, y_cor = model(img_tensor)
209
+
210
+ # Pasar a CPU y numpy para post-procesado
211
+ y_bon = y_bon.cpu().numpy().squeeze() # Shape: (2, 1024)
212
+ y_cor = y_cor.cpu().numpy().squeeze() # Shape: (1024,)
213
+
214
+ # 4. Post-procesado (De Red Neuronal a Plano 2D)
215
+ coordenadas_plano = post_procesado_coordenadas(y_bon, y_cor, altura_camara=args.altura)
216
+
217
+ area = calcular_area(coordenadas_plano)
218
+
219
+ # 5. Resultados
220
+ print("\n--- RESULTADOS ---")
221
+ print(f"Número de esquinas detectadas: {len(coordenadas_plano)}")
222
+ print(f"Área estimada de la habitación: {area:.2f} m²")
223
+ print("\nCoordenadas (X, Y) respecto al centro de la habitación:")
224
+ for i, (x, y) in enumerate(coordenadas_plano):
225
+ print(f"Esquina {i+1}: ({x:.2f}, {y:.2f})")
226
+
227
+ # 6. Visualizar
228
+ visualizar_resultado(img_pil, coordenadas_plano)
229
+
230
+ if __name__ == "__main__":
231
+ main()
modelos_3D/bookcaseOpen.mtl ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl wood
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.8962264 0.6015712 0.3931559
6
+ Ks 0.330000 0.330000 0.330000
7
+
modelos_3D/bookcaseOpen.obj ADDED
@@ -0,0 +1,993 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib bookcaseOpen.mtl
4
+
5
+ g bookcaseOpen
6
+
7
+ v -0.36 0.8799999 0.21
8
+ v -0.36 0.8799999 0.25
9
+ v -0.4 0.8799999 0.21
10
+ v -0.4 0.8799999 0.25
11
+ v -0.36 0.8799999 0
12
+ v -0.36 0.8799999 0.04
13
+ v -0.4 0.8799999 0
14
+ v -0.4 0.8799999 0.04
15
+ v 0 0 0.25
16
+ v -0.04 0 0.25
17
+ v -7.219114E-16 0.8799999 0.25
18
+ v -0.04 0.8799999 0.25
19
+ v -0.02 0.61 0.02
20
+ v -0.02 0.61 0.04
21
+ v -0.04 0.61 0.02
22
+ v -0.04 0.61 0.04
23
+ v -0.36 0.61 0.02
24
+ v -0.04 0.61 0.21
25
+ v -0.04 0.61 0.23
26
+ v -0.02 0.61 0.23
27
+ v -0.02 0.61 0.21
28
+ v -0.36 0.61 0.23
29
+ v -0.36 0.61 0.04
30
+ v -0.38 0.61 0.02
31
+ v -0.38 0.61 0.04
32
+ v -0.36 0.61 0.21
33
+ v -0.38 0.61 0.21
34
+ v -0.38 0.61 0.23
35
+ v -0.04 0 0
36
+ v 0 0 0
37
+ v -0.04 0.8799999 0
38
+ v -7.219114E-16 0.8799999 0
39
+ v -0.36 0 0.25
40
+ v -0.4 0 0.25
41
+ v -0.36 0 0.04
42
+ v -0.36 0 0
43
+ v -0.4 0 0.04
44
+ v -0.4 0 0
45
+ v -0.02 0.85 0.21
46
+ v -0.02 0.85 0.23
47
+ v -0.04 0.85 0.21
48
+ v -0.04 0.85 0.23
49
+ v -0.36 0.85 0.02
50
+ v -0.04 0.85 0.04
51
+ v -0.04 0.85 0.02
52
+ v -0.02 0.85 0.04
53
+ v -0.02 0.85 0.02
54
+ v -0.36 0.85 0.23
55
+ v -0.36 0.85 0.04
56
+ v -0.38 0.85 0.02
57
+ v -0.38 0.85 0.04
58
+ v -0.36 0.85 0.21
59
+ v -0.38 0.85 0.21
60
+ v -0.38 0.85 0.23
61
+ v 0 0.8799999 0.21
62
+ v 0 0 0.21
63
+ v -0.04 0 0.21
64
+ v 0 0 0.04
65
+ v -0.04 0 0.04
66
+ v -0.4 0 0.21
67
+ v -0.38 0.34 0.04
68
+ v -0.38 0.37 0.04
69
+ v -0.38 0.34 0.21
70
+ v -0.38 0.37 0.21
71
+ v -0.36 0.37 0.21
72
+ v -0.36 0.37 0.23
73
+ v -0.38 0.37 0.23
74
+ v -0.36 0.37 0.04
75
+ v -0.38 0.37 0.02
76
+ v -0.36 0.37 0.02
77
+ v -0.04 0.37 0.23
78
+ v -0.04 0.37 0.21
79
+ v -0.02 0.37 0.23
80
+ v -0.02 0.37 0.21
81
+ v -0.04 0.37 0.04
82
+ v -0.04 0.37 0.02
83
+ v -0.02 0.37 0.04
84
+ v -0.02 0.37 0.02
85
+ v -7.219114E-16 0.8799999 0.04
86
+ v -0.36 0 0.21
87
+ v -0.04 0.8799999 0.04
88
+ v -0.04 0.8799999 0.21
89
+ v -0.38 0.1 0.04
90
+ v -0.38 0.13 0.04
91
+ v -0.38 0.1 0.21
92
+ v -0.38 0.13 0.21
93
+ v -0.02 0.13 0.04
94
+ v -0.02 0.1 0.04
95
+ v -0.02 0.13 0.21
96
+ v -0.02 0.1 0.21
97
+ v -0.02 0.13 0.23
98
+ v -0.04 0.13 0.21
99
+ v -0.04 0.13 0.23
100
+ v -0.36 0.13 0.02
101
+ v -0.04 0.13 0.04
102
+ v -0.04 0.13 0.02
103
+ v -0.02 0.13 0.02
104
+ v -0.36 0.13 0.23
105
+ v -0.36 0.13 0.04
106
+ v -0.38 0.13 0.02
107
+ v -0.36 0.13 0.21
108
+ v -0.38 0.13 0.23
109
+ v -0.38 0.58 0.04
110
+ v -0.38 0.58 0.21
111
+ v -0.36 0.34 0.04
112
+ v -0.36 0.1 0.04
113
+ v -0.36 0.58 0.04
114
+ v -0.38 0.8200001 0.04
115
+ v -0.36 0.8200001 0.04
116
+ v -0.36 0.58 0.21
117
+ v -0.36 0.58 0.02
118
+ v -0.36 0.58 0.23
119
+ v -0.04 0.58 0.02
120
+ v -0.04 0.58 0.04
121
+ v -0.04 0.58 0.21
122
+ v -0.04 0.58 0.23
123
+ v -0.02 0.58 0.04
124
+ v -0.02 0.58 0.21
125
+ v -0.02 0.34 0.04
126
+ v -0.02 0.8200001 0.04
127
+ v -0.04 0.8200001 0.04
128
+ v -0.04 0.34 0.04
129
+ v -0.04 0.1 0.04
130
+ v -0.38 0.8200001 0.21
131
+ v -0.02 0.34 0.21
132
+ v -0.02 0.8200001 0.21
133
+ v -0.36 0.8200001 0.23
134
+ v -0.36 0.34 0.23
135
+ v -0.36 0.1 0.23
136
+ v -0.36 0.1 0.21
137
+ v -0.36 0.34 0.21
138
+ v -0.36 0.8200001 0.21
139
+ v -0.04 0.34 0.23
140
+ v -0.36 0.8200001 0.02
141
+ v -0.04 0.8200001 0.02
142
+ v -0.04 0.8200001 0.21
143
+ v -0.04 0.8200001 0.23
144
+ v -0.04 0.1 0.23
145
+ v -0.04 0.34 0.21
146
+ v -0.04 0.1 0.21
147
+ v -0.36 0.1 0.02
148
+ v -0.36 0.34 0.02
149
+ v -0.04 0.34 0.02
150
+ v -0.04 0.1 0.02
151
+
152
+ vn 0 1 0
153
+ vn 0 0 1
154
+ vn 0 0 -1
155
+ vn 0 -1 0
156
+ vn 1 0 0
157
+ vn -1 0 0
158
+
159
+ vt 14.17323 8.267716
160
+ vt 14.17323 9.84252
161
+ vt 15.74803 8.267716
162
+ vt 15.74803 9.84252
163
+ vt 14.17323 0
164
+ vt 14.17323 1.574803
165
+ vt 15.74803 0
166
+ vt 15.74803 1.574803
167
+ vt -4.440892E-14 -2.089832E-15
168
+ vt -1.574803 -2.089832E-15
169
+ vt -7.283063E-14 34.64567
170
+ vt -1.574803 34.64567
171
+ vt 0.7874016 0.7874016
172
+ vt 0.7874016 1.574803
173
+ vt 1.574803 0.7874016
174
+ vt 1.574803 1.574803
175
+ vt 14.17323 0.7874016
176
+ vt 1.574803 8.267716
177
+ vt 1.574803 9.055119
178
+ vt 0.7874016 9.055119
179
+ vt 0.7874016 8.267716
180
+ vt 14.17323 9.055119
181
+ vt 14.96063 0.7874016
182
+ vt 14.96063 1.574803
183
+ vt 14.96063 8.267716
184
+ vt 14.96063 9.055119
185
+ vt 1.574803 0
186
+ vt 0 0
187
+ vt 1.574803 34.64567
188
+ vt 2.842171E-14 34.64567
189
+ vt -14.17323 -2.089832E-15
190
+ vt -15.74803 -2.089832E-15
191
+ vt -14.17323 34.64567
192
+ vt -15.74803 34.64567
193
+ vt -14.17323 1.574803
194
+ vt -14.17323 0
195
+ vt -15.74803 1.574803
196
+ vt -15.74803 0
197
+ vt -8.267716 34.64567
198
+ vt -8.267716 -8.013354E-30
199
+ vt -9.84252 34.64567
200
+ vt -9.84252 -9.539707E-30
201
+ vt 0 9.84252
202
+ vt 0 8.267716
203
+ vt -1.574803 9.84252
204
+ vt -1.574803 8.267716
205
+ vt 0 1.574803
206
+ vt -1.574803 1.574803
207
+ vt -1.574803 0
208
+ vt 8.267716 -6.687461E-15
209
+ vt 8.267716 34.64567
210
+ vt 9.84252 -6.687461E-15
211
+ vt 9.84252 34.64567
212
+ vt 1.574803 13.38583
213
+ vt 1.574803 14.56693
214
+ vt 8.267716 13.38583
215
+ vt 8.267716 14.56693
216
+ vt 4.242662E-30 34.64567
217
+ vt -1.574803 9.660503E-32
218
+ vt -14.17323 9.84252
219
+ vt -14.17323 8.267716
220
+ vt -15.74803 9.84252
221
+ vt -15.74803 8.267716
222
+ vt 8.881784E-15 -1.953993E-14
223
+ vt 8.881784E-15 1.574803
224
+ vt 1.574803 -1.953993E-14
225
+ vt 2.842171E-14 9.84252
226
+ vt 1.574803 9.84252
227
+ vt 1.574803 3.937008
228
+ vt 1.574803 5.11811
229
+ vt 8.267716 3.937008
230
+ vt 8.267716 5.11811
231
+ vt -1.574803 5.11811
232
+ vt -1.574803 3.937008
233
+ vt -8.267716 5.11811
234
+ vt -8.267716 3.937008
235
+ vt 1.574803 22.83465
236
+ vt 1.574803 24.01575
237
+ vt 8.267716 22.83465
238
+ vt 8.267716 24.01575
239
+ vt -14.17323 5.11811
240
+ vt -14.96063 5.11811
241
+ vt -14.17323 13.38583
242
+ vt -14.96063 13.38583
243
+ vt -14.96063 3.937008
244
+ vt -14.17323 3.937008
245
+ vt -14.96063 14.56693
246
+ vt -14.96063 22.83465
247
+ vt -14.17323 22.83465
248
+ vt -14.17323 14.56693
249
+ vt -14.96063 24.01575
250
+ vt -14.96063 32.28347
251
+ vt -14.17323 32.28347
252
+ vt -14.17323 24.01575
253
+ vt -14.96063 33.46457
254
+ vt -14.17323 33.46457
255
+ vt -14.96063 8.267716
256
+ vt -14.96063 1.574803
257
+ vt -14.17323 0.7874016
258
+ vt -14.17323 9.055119
259
+ vt -1.574803 0.7874016
260
+ vt -1.574803 9.055119
261
+ vt -0.7874016 1.574803
262
+ vt -0.7874016 8.267716
263
+ vt -0.7874016 3.937008
264
+ vt -2.842171E-14 34.64567
265
+ vt -0.7874016 5.11811
266
+ vt -0.7874016 13.38583
267
+ vt -0.7874016 14.56693
268
+ vt -0.7874016 22.83465
269
+ vt -1.574803 14.56693
270
+ vt -0.7874016 24.01575
271
+ vt -1.574803 24.01575
272
+ vt -0.7874016 32.28347
273
+ vt -0.7874016 33.46457
274
+ vt -1.574803 33.46457
275
+ vt -1.574803 32.28347
276
+ vt -1.574803 22.83465
277
+ vt -1.574803 13.38583
278
+ vt -8.267716 24.01575
279
+ vt -8.267716 22.83465
280
+ vt 1.574803 32.28347
281
+ vt 1.574803 33.46457
282
+ vt 8.267716 32.28347
283
+ vt 8.267716 33.46457
284
+ vt -8.267716 14.56693
285
+ vt -8.267716 13.38583
286
+ vt -8.267716 33.46457
287
+ vt -8.267716 32.28347
288
+ vt -9.055119 33.46457
289
+ vt -9.055119 32.28347
290
+ vt -9.055119 24.01575
291
+ vt -9.055119 22.83465
292
+ vt -9.055119 14.56693
293
+ vt -9.055119 13.38583
294
+ vt -9.055119 5.11811
295
+ vt -9.055119 3.937008
296
+ vt -9.84252 -7.350636E-15
297
+ vt -8.267716 -7.350636E-15
298
+ vt 0.7874016 5.11811
299
+ vt 0.7874016 13.38583
300
+ vt 0 34.64567
301
+ vt 0.7874016 3.937008
302
+ vt 0.7874016 14.56693
303
+ vt 0.7874016 22.83465
304
+ vt 0.7874016 24.01575
305
+ vt 0.7874016 32.28347
306
+ vt 0.7874016 33.46457
307
+ vt 8.267716 6.424899E-16
308
+ vt 9.84252 6.424899E-16
309
+ vt 9.055119 3.937008
310
+ vt 9.055119 5.11811
311
+ vt 9.055119 13.38583
312
+ vt 9.055119 14.56693
313
+ vt 9.055119 22.83465
314
+ vt 9.055119 24.01575
315
+ vt 9.055119 32.28347
316
+ vt 9.055119 33.46457
317
+ vt 14.17323 22.83465
318
+ vt 14.17323 24.01575
319
+ vt 1.221598E-15 -3.012353E-15
320
+ vt 1.221598E-15 34.64567
321
+ vt -1.574803 -3.012353E-15
322
+ vt 14.17323 32.28347
323
+ vt 14.17323 33.46457
324
+ vt 14.17323 13.38583
325
+ vt 14.17323 14.56693
326
+ vt 14.17323 3.937008
327
+ vt 14.17323 5.11811
328
+ vt 3.185452E-16 34.64567
329
+ vt 3.185452E-16 6.48332E-16
330
+ vt 1.574803 6.48332E-16
331
+ vt 14.96063 3.937008
332
+ vt 15.74803 34.64567
333
+ vt 14.96063 5.11811
334
+ vt 14.96063 13.38583
335
+ vt 14.96063 14.56693
336
+ vt 14.96063 22.83465
337
+ vt 14.96063 24.01575
338
+ vt 14.96063 32.28347
339
+ vt 14.96063 33.46457
340
+ vt 14.17323 34.64567
341
+ vt -1.776357E-14 -4.179663E-15
342
+ vt -1.776357E-14 34.64567
343
+ vt 1.574803 -4.179663E-15
344
+
345
+ usemtl wood
346
+
347
+ f 2/2/1 1/1/1 3/3/1
348
+ f 3/3/1 4/4/1 2/2/1
349
+ f 6/6/1 5/5/1 7/7/1
350
+ f 7/7/1 8/8/1 6/6/1
351
+ f 10/10/2 9/9/2 11/11/2
352
+ f 11/11/2 12/12/2 10/10/2
353
+ f 14/14/1 13/13/1 15/15/1
354
+ f 15/15/1 16/16/1 14/14/1
355
+ f 16/16/1 15/15/1 17/17/1
356
+ f 17/17/1 18/18/1 16/16/1
357
+ f 17/17/1 19/19/1 18/18/1
358
+ f 18/18/1 19/19/1 20/20/1
359
+ f 20/20/1 21/21/1 18/18/1
360
+ f 21/21/1 14/14/1 16/16/1
361
+ f 16/16/1 18/18/1 21/21/1
362
+ f 17/17/1 22/22/1 19/19/1
363
+ f 17/17/1 23/6/1 22/22/1
364
+ f 23/6/1 17/17/1 24/23/1
365
+ f 24/23/1 25/24/1 23/6/1
366
+ f 26/1/1 23/6/1 25/24/1
367
+ f 23/6/1 26/1/1 22/22/1
368
+ f 22/22/1 26/1/1 27/25/1
369
+ f 25/24/1 27/25/1 26/1/1
370
+ f 27/25/1 28/26/1 22/22/1
371
+ f 30/28/3 29/27/3 31/29/3
372
+ f 31/29/3 32/30/3 30/28/3
373
+ f 34/32/2 33/31/2 2/33/2
374
+ f 2/33/2 4/34/2 34/32/2
375
+ f 36/36/4 35/35/4 37/37/4
376
+ f 37/37/4 38/38/4 36/36/4
377
+ f 40/20/1 39/21/1 41/18/1
378
+ f 41/18/1 42/19/1 40/20/1
379
+ f 43/17/1 42/19/1 41/18/1
380
+ f 43/17/1 41/18/1 44/16/1
381
+ f 44/16/1 41/18/1 39/21/1
382
+ f 44/16/1 45/15/1 43/17/1
383
+ f 45/15/1 44/16/1 46/14/1
384
+ f 39/21/1 46/14/1 44/16/1
385
+ f 46/14/1 47/13/1 45/15/1
386
+ f 43/17/1 48/22/1 42/19/1
387
+ f 43/17/1 49/6/1 48/22/1
388
+ f 49/6/1 43/17/1 50/23/1
389
+ f 50/23/1 51/24/1 49/6/1
390
+ f 52/1/1 49/6/1 51/24/1
391
+ f 49/6/1 52/1/1 48/22/1
392
+ f 48/22/1 52/1/1 53/25/1
393
+ f 51/24/1 53/25/1 52/1/1
394
+ f 53/25/1 54/26/1 48/22/1
395
+ f 56/40/5 55/39/5 11/41/5
396
+ f 11/41/5 9/42/5 56/40/5
397
+ f 56/44/4 9/43/4 10/45/4
398
+ f 10/45/4 57/46/4 56/44/4
399
+ f 30/28/4 58/47/4 59/48/4
400
+ f 59/48/4 29/49/4 30/28/4
401
+ f 3/51/6 60/50/6 34/52/6
402
+ f 34/52/6 4/53/6 3/51/6
403
+ f 62/55/6 61/54/6 63/56/6
404
+ f 63/56/6 64/57/6 62/55/6
405
+ f 66/22/1 65/1/1 64/25/1
406
+ f 64/25/1 67/26/1 66/22/1
407
+ f 62/24/1 64/25/1 65/1/1
408
+ f 65/1/1 68/6/1 62/24/1
409
+ f 68/6/1 65/1/1 66/22/1
410
+ f 69/23/1 62/24/1 68/6/1
411
+ f 68/6/1 70/17/1 69/23/1
412
+ f 70/17/1 68/6/1 66/22/1
413
+ f 70/17/1 66/22/1 71/19/1
414
+ f 70/17/1 71/19/1 72/18/1
415
+ f 72/18/1 71/19/1 73/20/1
416
+ f 73/20/1 74/21/1 72/18/1
417
+ f 70/17/1 72/18/1 75/16/1
418
+ f 75/16/1 72/18/1 74/21/1
419
+ f 75/16/1 76/15/1 70/17/1
420
+ f 76/15/1 75/16/1 77/14/1
421
+ f 74/21/1 77/14/1 75/16/1
422
+ f 77/14/1 78/13/1 76/15/1
423
+ f 30/28/5 32/58/5 79/12/5
424
+ f 79/12/5 58/59/5 30/28/5
425
+ f 80/61/4 33/60/4 34/62/4
426
+ f 34/62/4 60/63/4 80/61/4
427
+ f 79/65/1 32/64/1 31/66/1
428
+ f 31/66/1 81/16/1 79/65/1
429
+ f 11/67/1 55/44/1 82/18/1
430
+ f 82/18/1 12/68/1 11/67/1
431
+ f 84/70/6 83/69/6 85/71/6
432
+ f 85/71/6 86/72/6 84/70/6
433
+ f 88/74/5 87/73/5 89/75/5
434
+ f 89/75/5 90/76/5 88/74/5
435
+ f 91/20/1 89/21/1 92/18/1
436
+ f 92/18/1 93/19/1 91/20/1
437
+ f 94/17/1 93/19/1 92/18/1
438
+ f 94/17/1 92/18/1 95/16/1
439
+ f 95/16/1 92/18/1 89/21/1
440
+ f 95/16/1 96/15/1 94/17/1
441
+ f 96/15/1 95/16/1 87/14/1
442
+ f 89/21/1 87/14/1 95/16/1
443
+ f 87/14/1 97/13/1 96/15/1
444
+ f 94/17/1 98/22/1 93/19/1
445
+ f 94/17/1 99/6/1 98/22/1
446
+ f 99/6/1 94/17/1 100/23/1
447
+ f 100/23/1 84/24/1 99/6/1
448
+ f 101/1/1 99/6/1 84/24/1
449
+ f 99/6/1 101/1/1 98/22/1
450
+ f 98/22/1 101/1/1 86/25/1
451
+ f 84/24/1 86/25/1 101/1/1
452
+ f 86/25/1 102/26/1 98/22/1
453
+ f 25/78/6 103/77/6 104/79/6
454
+ f 104/79/6 27/80/6 25/78/6
455
+ f 84/82/2 99/81/2 105/83/2
456
+ f 84/82/2 105/83/2 61/84/2
457
+ f 84/82/2 61/84/2 8/34/2
458
+ f 83/85/2 84/82/2 8/34/2
459
+ f 83/85/2 8/34/2 37/38/2
460
+ f 106/86/2 83/85/2 37/38/2
461
+ f 37/38/2 35/36/2 106/86/2
462
+ f 61/84/2 62/87/2 8/34/2
463
+ f 62/87/2 103/88/2 8/34/2
464
+ f 62/87/2 107/89/2 103/88/2
465
+ f 62/87/2 68/90/2 107/89/2
466
+ f 103/88/2 25/91/2 8/34/2
467
+ f 25/91/2 108/92/2 8/34/2
468
+ f 25/91/2 109/93/2 108/92/2
469
+ f 25/91/2 23/94/2 109/93/2
470
+ f 108/92/2 51/95/2 8/34/2
471
+ f 51/95/2 6/33/2 8/34/2
472
+ f 51/95/2 49/96/2 6/33/2
473
+ f 107/35/4 110/61/4 104/97/4
474
+ f 104/97/4 103/98/4 107/35/4
475
+ f 110/61/4 107/35/4 111/99/4
476
+ f 112/100/4 110/61/4 111/99/4
477
+ f 112/100/4 111/99/4 113/101/4
478
+ f 112/100/4 113/101/4 114/48/4
479
+ f 112/100/4 114/48/4 115/46/4
480
+ f 115/46/4 116/102/4 112/100/4
481
+ f 115/46/4 114/48/4 117/103/4
482
+ f 117/103/4 118/104/4 115/46/4
483
+ f 88/105/2 59/49/2 58/28/2
484
+ f 58/28/2 79/106/2 88/105/2
485
+ f 79/106/2 87/107/2 88/105/2
486
+ f 79/106/2 119/108/2 87/107/2
487
+ f 119/108/2 95/73/2 87/107/2
488
+ f 79/106/2 77/109/2 119/108/2
489
+ f 79/106/2 117/110/2 77/109/2
490
+ f 117/110/2 75/111/2 77/109/2
491
+ f 79/106/2 14/112/2 117/110/2
492
+ f 79/106/2 16/113/2 14/112/2
493
+ f 79/106/2 120/114/2 16/113/2
494
+ f 79/106/2 46/115/2 120/114/2
495
+ f 79/106/2 44/116/2 46/115/2
496
+ f 79/106/2 81/12/2 44/116/2
497
+ f 16/113/2 120/114/2 121/117/2
498
+ f 75/111/2 117/110/2 114/118/2
499
+ f 95/73/2 119/108/2 122/119/2
500
+ f 59/49/2 88/105/2 123/74/2
501
+ f 117/118/5 14/113/5 21/120/5
502
+ f 21/120/5 118/121/5 117/118/5
503
+ f 51/123/6 108/122/6 124/124/6
504
+ f 124/124/6 53/125/6 51/123/6
505
+ f 119/119/5 77/111/5 74/126/5
506
+ f 74/126/5 125/127/5 119/119/5
507
+ f 120/117/5 46/116/5 39/128/5
508
+ f 39/128/5 126/129/5 120/117/5
509
+ f 52/128/5 1/39/5 2/41/5
510
+ f 2/41/5 48/130/5 52/128/5
511
+ f 2/41/5 127/131/5 48/130/5
512
+ f 2/41/5 22/132/5 127/131/5
513
+ f 2/41/5 112/133/5 22/132/5
514
+ f 2/41/5 66/134/5 112/133/5
515
+ f 2/41/5 128/135/5 66/134/5
516
+ f 2/41/5 98/136/5 128/135/5
517
+ f 2/41/5 129/137/5 98/136/5
518
+ f 129/137/5 2/41/5 33/138/5
519
+ f 129/137/5 33/138/5 80/139/5
520
+ f 80/139/5 130/76/5 129/137/5
521
+ f 128/135/5 98/136/5 101/75/5
522
+ f 101/75/5 131/127/5 128/135/5
523
+ f 112/133/5 66/134/5 65/126/5
524
+ f 65/126/5 110/121/5 112/133/5
525
+ f 127/131/5 22/132/5 26/120/5
526
+ f 26/120/5 132/129/5 127/131/5
527
+ f 128/83/2 133/119/2 71/111/2
528
+ f 71/111/2 66/90/2 128/83/2
529
+ f 112/89/2 116/118/2 19/113/2
530
+ f 19/113/2 22/94/2 112/89/2
531
+ f 109/35/4 132/61/4 124/97/4
532
+ f 124/97/4 108/98/4 109/35/4
533
+ f 132/61/4 109/35/4 134/99/4
534
+ f 127/100/4 132/61/4 134/99/4
535
+ f 127/100/4 134/99/4 135/101/4
536
+ f 127/100/4 135/101/4 121/48/4
537
+ f 127/100/4 121/48/4 136/46/4
538
+ f 136/46/4 137/102/4 127/100/4
539
+ f 136/46/4 121/48/4 120/103/4
540
+ f 120/103/4 126/104/4 136/46/4
541
+ f 127/93/2 137/117/2 42/116/2
542
+ f 42/116/2 48/96/2 127/93/2
543
+ f 129/86/2 138/74/2 93/73/2
544
+ f 93/73/2 98/81/2 129/86/2
545
+ f 89/140/3 92/70/3 139/54/3
546
+ f 89/140/3 139/54/3 125/141/3
547
+ f 89/140/3 125/141/3 55/142/3
548
+ f 90/143/3 89/140/3 55/142/3
549
+ f 90/143/3 55/142/3 56/28/3
550
+ f 140/69/3 90/143/3 56/28/3
551
+ f 56/28/3 57/27/3 140/69/3
552
+ f 125/141/3 74/144/3 55/142/3
553
+ f 74/144/3 118/145/3 55/142/3
554
+ f 74/144/3 115/77/3 118/145/3
555
+ f 74/144/3 72/55/3 115/77/3
556
+ f 118/145/3 21/146/3 55/142/3
557
+ f 21/146/3 126/147/3 55/142/3
558
+ f 21/146/3 136/122/3 126/147/3
559
+ f 21/146/3 18/78/3 136/122/3
560
+ f 126/147/3 39/148/3 55/142/3
561
+ f 39/148/3 82/29/3 55/142/3
562
+ f 39/148/3 41/123/3 82/29/3
563
+ f 140/71/6 57/149/6 10/150/6
564
+ f 10/150/6 138/151/6 140/71/6
565
+ f 10/150/6 93/152/6 138/151/6
566
+ f 10/150/6 133/153/6 93/152/6
567
+ f 10/150/6 71/154/6 133/153/6
568
+ f 10/150/6 116/155/6 71/154/6
569
+ f 10/150/6 19/156/6 116/155/6
570
+ f 10/150/6 137/157/6 19/156/6
571
+ f 10/150/6 42/158/6 137/157/6
572
+ f 42/158/6 10/150/6 12/53/6
573
+ f 42/158/6 12/53/6 82/51/6
574
+ f 82/51/6 41/125/6 42/158/6
575
+ f 19/156/6 137/157/6 136/124/6
576
+ f 136/124/6 18/80/6 19/156/6
577
+ f 71/154/6 116/155/6 115/79/6
578
+ f 115/79/6 72/57/6 71/154/6
579
+ f 93/152/6 133/153/6 139/56/6
580
+ f 139/56/6 92/72/6 93/152/6
581
+ f 113/77/3 111/159/3 17/160/3
582
+ f 17/160/3 15/78/3 113/77/3
583
+ f 43/115/5 36/161/5 5/162/5
584
+ f 5/162/5 6/12/5 43/115/5
585
+ f 6/12/5 49/116/5 43/115/5
586
+ f 36/161/5 43/115/5 141/105/5
587
+ f 141/105/5 35/163/5 36/161/5
588
+ f 43/115/5 134/114/5 141/105/5
589
+ f 134/114/5 17/112/5 141/105/5
590
+ f 17/112/5 134/114/5 109/117/5
591
+ f 109/117/5 23/113/5 17/112/5
592
+ f 17/112/5 111/110/5 141/105/5
593
+ f 111/110/5 70/109/5 141/105/5
594
+ f 70/109/5 111/110/5 107/118/5
595
+ f 107/118/5 68/111/5 70/109/5
596
+ f 70/109/5 142/108/5 141/105/5
597
+ f 142/108/5 94/107/5 141/105/5
598
+ f 94/107/5 142/108/5 105/119/5
599
+ f 105/119/5 99/73/5 94/107/5
600
+ f 141/105/5 106/74/5 35/163/5
601
+ f 135/122/3 134/164/3 43/165/3
602
+ f 43/165/3 45/123/3 135/122/3
603
+ f 143/54/3 142/166/3 70/167/3
604
+ f 70/167/3 76/55/3 143/54/3
605
+ f 144/69/3 141/168/3 94/169/3
606
+ f 94/169/3 96/70/3 144/69/3
607
+ f 144/143/6 31/170/6 29/171/6
608
+ f 29/171/6 59/172/6 144/143/6
609
+ f 59/172/6 123/69/6 144/143/6
610
+ f 31/170/6 144/143/6 45/148/6
611
+ f 45/148/6 81/29/6 31/170/6
612
+ f 144/143/6 96/140/6 45/148/6
613
+ f 96/140/6 143/141/6 45/148/6
614
+ f 143/141/6 96/140/6 95/70/6
615
+ f 95/70/6 122/54/6 143/141/6
616
+ f 143/141/6 76/144/6 45/148/6
617
+ f 76/144/6 113/145/6 45/148/6
618
+ f 113/145/6 76/144/6 75/55/6
619
+ f 75/55/6 114/77/6 113/145/6
620
+ f 113/145/6 15/146/6 45/148/6
621
+ f 15/146/6 135/147/6 45/148/6
622
+ f 135/147/6 15/146/6 16/78/6
623
+ f 16/78/6 121/122/6 135/147/6
624
+ f 45/148/6 44/123/6 81/29/6
625
+ f 105/35/4 131/61/4 63/97/4
626
+ f 63/97/4 61/98/4 105/35/4
627
+ f 131/61/4 105/35/4 142/99/4
628
+ f 128/100/4 131/61/4 142/99/4
629
+ f 128/100/4 142/99/4 143/101/4
630
+ f 128/100/4 143/101/4 122/48/4
631
+ f 128/100/4 122/48/4 139/46/4
632
+ f 139/46/4 133/102/4 128/100/4
633
+ f 139/46/4 122/48/4 119/103/4
634
+ f 119/103/4 125/104/4 139/46/4
635
+ f 106/35/4 130/61/4 85/97/4
636
+ f 85/97/4 83/98/4 106/35/4
637
+ f 130/61/4 106/35/4 141/99/4
638
+ f 129/100/4 130/61/4 141/99/4
639
+ f 129/100/4 141/99/4 144/101/4
640
+ f 129/100/4 144/101/4 123/48/4
641
+ f 129/100/4 123/48/4 140/46/4
642
+ f 140/46/4 138/102/4 129/100/4
643
+ f 140/46/4 123/48/4 88/103/4
644
+ f 88/103/4 90/104/4 140/46/4
645
+ f 85/173/3 80/5/3 60/7/3
646
+ f 60/7/3 3/174/3 85/173/3
647
+ f 3/174/3 86/175/3 85/173/3
648
+ f 3/174/3 63/176/3 86/175/3
649
+ f 63/176/3 101/169/3 86/175/3
650
+ f 3/174/3 64/177/3 63/176/3
651
+ f 3/174/3 104/178/3 64/177/3
652
+ f 104/178/3 65/167/3 64/177/3
653
+ f 3/174/3 27/179/3 104/178/3
654
+ f 3/174/3 26/160/3 27/179/3
655
+ f 3/174/3 124/180/3 26/160/3
656
+ f 3/174/3 53/181/3 124/180/3
657
+ f 3/174/3 52/165/3 53/181/3
658
+ f 3/174/3 1/182/3 52/165/3
659
+ f 26/160/3 124/180/3 132/164/3
660
+ f 65/167/3 104/178/3 110/159/3
661
+ f 101/169/3 63/176/3 131/166/3
662
+ f 80/5/3 85/173/3 130/168/3
663
+ f 7/184/6 38/183/6 37/185/6
664
+ f 37/185/6 8/29/6 7/184/6
665
+ f 36/5/3 38/7/3 7/174/3
666
+ f 7/174/3 5/182/3 36/5/3
667
+ g bookcaseOpen
668
+
669
+
670
+
671
+
672
+ usemtl wood
673
+
674
+ f 2/2/1 1/1/1 3/3/1
675
+ f 3/3/1 4/4/1 2/2/1
676
+ f 6/6/1 5/5/1 7/7/1
677
+ f 7/7/1 8/8/1 6/6/1
678
+ f 10/10/2 9/9/2 11/11/2
679
+ f 11/11/2 12/12/2 10/10/2
680
+ f 14/14/1 13/13/1 15/15/1
681
+ f 15/15/1 16/16/1 14/14/1
682
+ f 16/16/1 15/15/1 17/17/1
683
+ f 17/17/1 18/18/1 16/16/1
684
+ f 17/17/1 19/19/1 18/18/1
685
+ f 18/18/1 19/19/1 20/20/1
686
+ f 20/20/1 21/21/1 18/18/1
687
+ f 21/21/1 14/14/1 16/16/1
688
+ f 16/16/1 18/18/1 21/21/1
689
+ f 17/17/1 22/22/1 19/19/1
690
+ f 17/17/1 23/6/1 22/22/1
691
+ f 23/6/1 17/17/1 24/23/1
692
+ f 24/23/1 25/24/1 23/6/1
693
+ f 26/1/1 23/6/1 25/24/1
694
+ f 23/6/1 26/1/1 22/22/1
695
+ f 22/22/1 26/1/1 27/25/1
696
+ f 25/24/1 27/25/1 26/1/1
697
+ f 27/25/1 28/26/1 22/22/1
698
+ f 30/28/3 29/27/3 31/29/3
699
+ f 31/29/3 32/30/3 30/28/3
700
+ f 34/32/2 33/31/2 2/33/2
701
+ f 2/33/2 4/34/2 34/32/2
702
+ f 36/36/4 35/35/4 37/37/4
703
+ f 37/37/4 38/38/4 36/36/4
704
+ f 40/20/1 39/21/1 41/18/1
705
+ f 41/18/1 42/19/1 40/20/1
706
+ f 43/17/1 42/19/1 41/18/1
707
+ f 43/17/1 41/18/1 44/16/1
708
+ f 44/16/1 41/18/1 39/21/1
709
+ f 44/16/1 45/15/1 43/17/1
710
+ f 45/15/1 44/16/1 46/14/1
711
+ f 39/21/1 46/14/1 44/16/1
712
+ f 46/14/1 47/13/1 45/15/1
713
+ f 43/17/1 48/22/1 42/19/1
714
+ f 43/17/1 49/6/1 48/22/1
715
+ f 49/6/1 43/17/1 50/23/1
716
+ f 50/23/1 51/24/1 49/6/1
717
+ f 52/1/1 49/6/1 51/24/1
718
+ f 49/6/1 52/1/1 48/22/1
719
+ f 48/22/1 52/1/1 53/25/1
720
+ f 51/24/1 53/25/1 52/1/1
721
+ f 53/25/1 54/26/1 48/22/1
722
+ f 56/40/5 55/39/5 11/41/5
723
+ f 11/41/5 9/42/5 56/40/5
724
+ f 56/44/4 9/43/4 10/45/4
725
+ f 10/45/4 57/46/4 56/44/4
726
+ f 30/28/4 58/47/4 59/48/4
727
+ f 59/48/4 29/49/4 30/28/4
728
+ f 3/51/6 60/50/6 34/52/6
729
+ f 34/52/6 4/53/6 3/51/6
730
+ f 62/55/6 61/54/6 63/56/6
731
+ f 63/56/6 64/57/6 62/55/6
732
+ f 66/22/1 65/1/1 64/25/1
733
+ f 64/25/1 67/26/1 66/22/1
734
+ f 62/24/1 64/25/1 65/1/1
735
+ f 65/1/1 68/6/1 62/24/1
736
+ f 68/6/1 65/1/1 66/22/1
737
+ f 69/23/1 62/24/1 68/6/1
738
+ f 68/6/1 70/17/1 69/23/1
739
+ f 70/17/1 68/6/1 66/22/1
740
+ f 70/17/1 66/22/1 71/19/1
741
+ f 70/17/1 71/19/1 72/18/1
742
+ f 72/18/1 71/19/1 73/20/1
743
+ f 73/20/1 74/21/1 72/18/1
744
+ f 70/17/1 72/18/1 75/16/1
745
+ f 75/16/1 72/18/1 74/21/1
746
+ f 75/16/1 76/15/1 70/17/1
747
+ f 76/15/1 75/16/1 77/14/1
748
+ f 74/21/1 77/14/1 75/16/1
749
+ f 77/14/1 78/13/1 76/15/1
750
+ f 30/28/5 32/58/5 79/12/5
751
+ f 79/12/5 58/59/5 30/28/5
752
+ f 80/61/4 33/60/4 34/62/4
753
+ f 34/62/4 60/63/4 80/61/4
754
+ f 79/65/1 32/64/1 31/66/1
755
+ f 31/66/1 81/16/1 79/65/1
756
+ f 11/67/1 55/44/1 82/18/1
757
+ f 82/18/1 12/68/1 11/67/1
758
+ f 84/70/6 83/69/6 85/71/6
759
+ f 85/71/6 86/72/6 84/70/6
760
+ f 88/74/5 87/73/5 89/75/5
761
+ f 89/75/5 90/76/5 88/74/5
762
+ f 91/20/1 89/21/1 92/18/1
763
+ f 92/18/1 93/19/1 91/20/1
764
+ f 94/17/1 93/19/1 92/18/1
765
+ f 94/17/1 92/18/1 95/16/1
766
+ f 95/16/1 92/18/1 89/21/1
767
+ f 95/16/1 96/15/1 94/17/1
768
+ f 96/15/1 95/16/1 87/14/1
769
+ f 89/21/1 87/14/1 95/16/1
770
+ f 87/14/1 97/13/1 96/15/1
771
+ f 94/17/1 98/22/1 93/19/1
772
+ f 94/17/1 99/6/1 98/22/1
773
+ f 99/6/1 94/17/1 100/23/1
774
+ f 100/23/1 84/24/1 99/6/1
775
+ f 101/1/1 99/6/1 84/24/1
776
+ f 99/6/1 101/1/1 98/22/1
777
+ f 98/22/1 101/1/1 86/25/1
778
+ f 84/24/1 86/25/1 101/1/1
779
+ f 86/25/1 102/26/1 98/22/1
780
+ f 25/78/6 103/77/6 104/79/6
781
+ f 104/79/6 27/80/6 25/78/6
782
+ f 84/82/2 99/81/2 105/83/2
783
+ f 84/82/2 105/83/2 61/84/2
784
+ f 84/82/2 61/84/2 8/34/2
785
+ f 83/85/2 84/82/2 8/34/2
786
+ f 83/85/2 8/34/2 37/38/2
787
+ f 106/86/2 83/85/2 37/38/2
788
+ f 37/38/2 35/36/2 106/86/2
789
+ f 61/84/2 62/87/2 8/34/2
790
+ f 62/87/2 103/88/2 8/34/2
791
+ f 62/87/2 107/89/2 103/88/2
792
+ f 62/87/2 68/90/2 107/89/2
793
+ f 103/88/2 25/91/2 8/34/2
794
+ f 25/91/2 108/92/2 8/34/2
795
+ f 25/91/2 109/93/2 108/92/2
796
+ f 25/91/2 23/94/2 109/93/2
797
+ f 108/92/2 51/95/2 8/34/2
798
+ f 51/95/2 6/33/2 8/34/2
799
+ f 51/95/2 49/96/2 6/33/2
800
+ f 107/35/4 110/61/4 104/97/4
801
+ f 104/97/4 103/98/4 107/35/4
802
+ f 110/61/4 107/35/4 111/99/4
803
+ f 112/100/4 110/61/4 111/99/4
804
+ f 112/100/4 111/99/4 113/101/4
805
+ f 112/100/4 113/101/4 114/48/4
806
+ f 112/100/4 114/48/4 115/46/4
807
+ f 115/46/4 116/102/4 112/100/4
808
+ f 115/46/4 114/48/4 117/103/4
809
+ f 117/103/4 118/104/4 115/46/4
810
+ f 88/105/2 59/49/2 58/28/2
811
+ f 58/28/2 79/106/2 88/105/2
812
+ f 79/106/2 87/107/2 88/105/2
813
+ f 79/106/2 119/108/2 87/107/2
814
+ f 119/108/2 95/73/2 87/107/2
815
+ f 79/106/2 77/109/2 119/108/2
816
+ f 79/106/2 117/110/2 77/109/2
817
+ f 117/110/2 75/111/2 77/109/2
818
+ f 79/106/2 14/112/2 117/110/2
819
+ f 79/106/2 16/113/2 14/112/2
820
+ f 79/106/2 120/114/2 16/113/2
821
+ f 79/106/2 46/115/2 120/114/2
822
+ f 79/106/2 44/116/2 46/115/2
823
+ f 79/106/2 81/12/2 44/116/2
824
+ f 16/113/2 120/114/2 121/117/2
825
+ f 75/111/2 117/110/2 114/118/2
826
+ f 95/73/2 119/108/2 122/119/2
827
+ f 59/49/2 88/105/2 123/74/2
828
+ f 117/118/5 14/113/5 21/120/5
829
+ f 21/120/5 118/121/5 117/118/5
830
+ f 51/123/6 108/122/6 124/124/6
831
+ f 124/124/6 53/125/6 51/123/6
832
+ f 119/119/5 77/111/5 74/126/5
833
+ f 74/126/5 125/127/5 119/119/5
834
+ f 120/117/5 46/116/5 39/128/5
835
+ f 39/128/5 126/129/5 120/117/5
836
+ f 52/128/5 1/39/5 2/41/5
837
+ f 2/41/5 48/130/5 52/128/5
838
+ f 2/41/5 127/131/5 48/130/5
839
+ f 2/41/5 22/132/5 127/131/5
840
+ f 2/41/5 112/133/5 22/132/5
841
+ f 2/41/5 66/134/5 112/133/5
842
+ f 2/41/5 128/135/5 66/134/5
843
+ f 2/41/5 98/136/5 128/135/5
844
+ f 2/41/5 129/137/5 98/136/5
845
+ f 129/137/5 2/41/5 33/138/5
846
+ f 129/137/5 33/138/5 80/139/5
847
+ f 80/139/5 130/76/5 129/137/5
848
+ f 128/135/5 98/136/5 101/75/5
849
+ f 101/75/5 131/127/5 128/135/5
850
+ f 112/133/5 66/134/5 65/126/5
851
+ f 65/126/5 110/121/5 112/133/5
852
+ f 127/131/5 22/132/5 26/120/5
853
+ f 26/120/5 132/129/5 127/131/5
854
+ f 128/83/2 133/119/2 71/111/2
855
+ f 71/111/2 66/90/2 128/83/2
856
+ f 112/89/2 116/118/2 19/113/2
857
+ f 19/113/2 22/94/2 112/89/2
858
+ f 109/35/4 132/61/4 124/97/4
859
+ f 124/97/4 108/98/4 109/35/4
860
+ f 132/61/4 109/35/4 134/99/4
861
+ f 127/100/4 132/61/4 134/99/4
862
+ f 127/100/4 134/99/4 135/101/4
863
+ f 127/100/4 135/101/4 121/48/4
864
+ f 127/100/4 121/48/4 136/46/4
865
+ f 136/46/4 137/102/4 127/100/4
866
+ f 136/46/4 121/48/4 120/103/4
867
+ f 120/103/4 126/104/4 136/46/4
868
+ f 127/93/2 137/117/2 42/116/2
869
+ f 42/116/2 48/96/2 127/93/2
870
+ f 129/86/2 138/74/2 93/73/2
871
+ f 93/73/2 98/81/2 129/86/2
872
+ f 89/140/3 92/70/3 139/54/3
873
+ f 89/140/3 139/54/3 125/141/3
874
+ f 89/140/3 125/141/3 55/142/3
875
+ f 90/143/3 89/140/3 55/142/3
876
+ f 90/143/3 55/142/3 56/28/3
877
+ f 140/69/3 90/143/3 56/28/3
878
+ f 56/28/3 57/27/3 140/69/3
879
+ f 125/141/3 74/144/3 55/142/3
880
+ f 74/144/3 118/145/3 55/142/3
881
+ f 74/144/3 115/77/3 118/145/3
882
+ f 74/144/3 72/55/3 115/77/3
883
+ f 118/145/3 21/146/3 55/142/3
884
+ f 21/146/3 126/147/3 55/142/3
885
+ f 21/146/3 136/122/3 126/147/3
886
+ f 21/146/3 18/78/3 136/122/3
887
+ f 126/147/3 39/148/3 55/142/3
888
+ f 39/148/3 82/29/3 55/142/3
889
+ f 39/148/3 41/123/3 82/29/3
890
+ f 140/71/6 57/149/6 10/150/6
891
+ f 10/150/6 138/151/6 140/71/6
892
+ f 10/150/6 93/152/6 138/151/6
893
+ f 10/150/6 133/153/6 93/152/6
894
+ f 10/150/6 71/154/6 133/153/6
895
+ f 10/150/6 116/155/6 71/154/6
896
+ f 10/150/6 19/156/6 116/155/6
897
+ f 10/150/6 137/157/6 19/156/6
898
+ f 10/150/6 42/158/6 137/157/6
899
+ f 42/158/6 10/150/6 12/53/6
900
+ f 42/158/6 12/53/6 82/51/6
901
+ f 82/51/6 41/125/6 42/158/6
902
+ f 19/156/6 137/157/6 136/124/6
903
+ f 136/124/6 18/80/6 19/156/6
904
+ f 71/154/6 116/155/6 115/79/6
905
+ f 115/79/6 72/57/6 71/154/6
906
+ f 93/152/6 133/153/6 139/56/6
907
+ f 139/56/6 92/72/6 93/152/6
908
+ f 113/77/3 111/159/3 17/160/3
909
+ f 17/160/3 15/78/3 113/77/3
910
+ f 43/115/5 36/161/5 5/162/5
911
+ f 5/162/5 6/12/5 43/115/5
912
+ f 6/12/5 49/116/5 43/115/5
913
+ f 36/161/5 43/115/5 141/105/5
914
+ f 141/105/5 35/163/5 36/161/5
915
+ f 43/115/5 134/114/5 141/105/5
916
+ f 134/114/5 17/112/5 141/105/5
917
+ f 17/112/5 134/114/5 109/117/5
918
+ f 109/117/5 23/113/5 17/112/5
919
+ f 17/112/5 111/110/5 141/105/5
920
+ f 111/110/5 70/109/5 141/105/5
921
+ f 70/109/5 111/110/5 107/118/5
922
+ f 107/118/5 68/111/5 70/109/5
923
+ f 70/109/5 142/108/5 141/105/5
924
+ f 142/108/5 94/107/5 141/105/5
925
+ f 94/107/5 142/108/5 105/119/5
926
+ f 105/119/5 99/73/5 94/107/5
927
+ f 141/105/5 106/74/5 35/163/5
928
+ f 135/122/3 134/164/3 43/165/3
929
+ f 43/165/3 45/123/3 135/122/3
930
+ f 143/54/3 142/166/3 70/167/3
931
+ f 70/167/3 76/55/3 143/54/3
932
+ f 144/69/3 141/168/3 94/169/3
933
+ f 94/169/3 96/70/3 144/69/3
934
+ f 144/143/6 31/170/6 29/171/6
935
+ f 29/171/6 59/172/6 144/143/6
936
+ f 59/172/6 123/69/6 144/143/6
937
+ f 31/170/6 144/143/6 45/148/6
938
+ f 45/148/6 81/29/6 31/170/6
939
+ f 144/143/6 96/140/6 45/148/6
940
+ f 96/140/6 143/141/6 45/148/6
941
+ f 143/141/6 96/140/6 95/70/6
942
+ f 95/70/6 122/54/6 143/141/6
943
+ f 143/141/6 76/144/6 45/148/6
944
+ f 76/144/6 113/145/6 45/148/6
945
+ f 113/145/6 76/144/6 75/55/6
946
+ f 75/55/6 114/77/6 113/145/6
947
+ f 113/145/6 15/146/6 45/148/6
948
+ f 15/146/6 135/147/6 45/148/6
949
+ f 135/147/6 15/146/6 16/78/6
950
+ f 16/78/6 121/122/6 135/147/6
951
+ f 45/148/6 44/123/6 81/29/6
952
+ f 105/35/4 131/61/4 63/97/4
953
+ f 63/97/4 61/98/4 105/35/4
954
+ f 131/61/4 105/35/4 142/99/4
955
+ f 128/100/4 131/61/4 142/99/4
956
+ f 128/100/4 142/99/4 143/101/4
957
+ f 128/100/4 143/101/4 122/48/4
958
+ f 128/100/4 122/48/4 139/46/4
959
+ f 139/46/4 133/102/4 128/100/4
960
+ f 139/46/4 122/48/4 119/103/4
961
+ f 119/103/4 125/104/4 139/46/4
962
+ f 106/35/4 130/61/4 85/97/4
963
+ f 85/97/4 83/98/4 106/35/4
964
+ f 130/61/4 106/35/4 141/99/4
965
+ f 129/100/4 130/61/4 141/99/4
966
+ f 129/100/4 141/99/4 144/101/4
967
+ f 129/100/4 144/101/4 123/48/4
968
+ f 129/100/4 123/48/4 140/46/4
969
+ f 140/46/4 138/102/4 129/100/4
970
+ f 140/46/4 123/48/4 88/103/4
971
+ f 88/103/4 90/104/4 140/46/4
972
+ f 85/173/3 80/5/3 60/7/3
973
+ f 60/7/3 3/174/3 85/173/3
974
+ f 3/174/3 86/175/3 85/173/3
975
+ f 3/174/3 63/176/3 86/175/3
976
+ f 63/176/3 101/169/3 86/175/3
977
+ f 3/174/3 64/177/3 63/176/3
978
+ f 3/174/3 104/178/3 64/177/3
979
+ f 104/178/3 65/167/3 64/177/3
980
+ f 3/174/3 27/179/3 104/178/3
981
+ f 3/174/3 26/160/3 27/179/3
982
+ f 3/174/3 124/180/3 26/160/3
983
+ f 3/174/3 53/181/3 124/180/3
984
+ f 3/174/3 52/165/3 53/181/3
985
+ f 3/174/3 1/182/3 52/165/3
986
+ f 26/160/3 124/180/3 132/164/3
987
+ f 65/167/3 104/178/3 110/159/3
988
+ f 101/169/3 63/176/3 131/166/3
989
+ f 80/5/3 85/173/3 130/168/3
990
+ f 7/184/6 38/183/6 37/185/6
991
+ f 37/185/6 8/29/6 7/184/6
992
+ f 36/5/3 38/7/3 7/174/3
993
+ f 7/174/3 5/182/3 36/5/3
modelos_3D/cabinetTelevision.mtl ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl wood
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.8962264 0.6015712 0.3931559
6
+ Ks 0.330000 0.330000 0.330000
7
+
modelos_3D/cabinetTelevision.obj ADDED
@@ -0,0 +1,522 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib cabinetTelevision.mtl
4
+
5
+ g cabinetTelevision
6
+
7
+ v 0 3.38396E-17 0.04
8
+ v -0.04 3.38396E-17 0.04
9
+ v 0 0.04 0.04
10
+ v -0.04 0.04 0.04
11
+ v -0.04 0 0
12
+ v -0.04 0.04 0
13
+ v 0 0 0
14
+ v 0 2.594369E-16 0.25
15
+ v 0 2.143175E-16 0.21
16
+ v -0.04 2.594369E-16 0.25
17
+ v -0.04 2.143175E-16 0.21
18
+ v -0.04 0.04 0.21
19
+ v -0.04 0.04 0.25
20
+ v -0.04 0.27 0.21
21
+ v -0.04 0.27 0
22
+ v -0.76 0.27 0.21
23
+ v -0.39 0.27 0.05
24
+ v -0.41 0.27 0.05
25
+ v -0.41 0.27 0.03
26
+ v -0.39 0.27 0.03
27
+ v -0.76 0.27 0
28
+ v -0.04 0.08 0.21
29
+ v -0.39 0.08 0.03
30
+ v -0.04 0.08 0
31
+ v -0.76 0.08 0
32
+ v -0.41 0.08 0.03
33
+ v -0.41 0.08 0.05
34
+ v -0.39 0.08 0.05
35
+ v -0.76 0.08 0.21
36
+ v 0 0.04 0.21
37
+ v -0.76 5.639933E-17 0.04
38
+ v -0.76 5.639933E-17 3.609557E-16
39
+ v -0.8 5.639933E-17 0.04
40
+ v -0.8 5.639933E-17 3.609557E-16
41
+ v -0.76 0.04 0.04
42
+ v -0.8 0.04 0.04
43
+ v -0.76 0.04 0.21
44
+ v -0.76 2.368772E-16 0.21
45
+ v -0.76 0.04 0.25
46
+ v -0.76 2.368772E-16 0.25
47
+ v -0.8 2.368772E-16 0.21
48
+ v -0.8 0.04 0.21
49
+ v -0.8 2.368772E-16 0.25
50
+ v 0 0.31 0
51
+ v 0 0.31 0.25
52
+ v -0.8 0.31 0
53
+ v -0.8 0.31 0.25
54
+ v -0.76 0.04 0
55
+ v -0.04 0.165 0.21
56
+ v -0.04 0.165 0.03
57
+ v -0.76 0.165 0.21
58
+ v -0.39 0.165 0.05
59
+ v -0.41 0.165 0.05
60
+ v -0.41 0.165 0.03
61
+ v -0.76 0.165 0.03
62
+ v -0.39 0.165 0.03
63
+ v -0.41 0.185 0.03
64
+ v -0.41 0.185 0.05
65
+ v -0.76 0.185 0.03
66
+ v -0.76 0.185 0.21
67
+ v -0.39 0.185 0.05
68
+ v -0.04 0.185 0.21
69
+ v -0.39 0.185 0.03
70
+ v -0.04 0.185 0.03
71
+
72
+ vn 0 0 1
73
+ vn -1 0 0
74
+ vn 0 -1 0
75
+ vn 0 1 0
76
+ vn 0 0 -1
77
+ vn 1 0 0
78
+
79
+ vt 0 -1.972152E-31
80
+ vt -1.574803 -1.972152E-31
81
+ vt 0 1.574803
82
+ vt -1.574803 1.574803
83
+ vt 0 0
84
+ vt 1.574803 1.332268E-15
85
+ vt 1.574803 1.574803
86
+ vt -1.574803 0
87
+ vt 0 9.84252
88
+ vt 0 8.267716
89
+ vt -1.574803 9.84252
90
+ vt -1.574803 8.267716
91
+ vt 8.267716 1.574803
92
+ vt 9.84252 1.574803
93
+ vt 8.267716 8.437695E-15
94
+ vt 9.84252 1.021405E-14
95
+ vt -29.92126 8.267716
96
+ vt -15.35433 1.968504
97
+ vt -16.14173 1.968504
98
+ vt -16.14173 1.181102
99
+ vt -15.35433 1.181102
100
+ vt -29.92126 0
101
+ vt 1.574803 8.267716
102
+ vt 15.35433 1.181102
103
+ vt 1.574803 0
104
+ vt 29.92126 0
105
+ vt 16.14173 1.181102
106
+ vt 16.14173 1.968504
107
+ vt 15.35433 1.968504
108
+ vt 29.92126 8.267716
109
+ vt 1.574803 1.44329E-15
110
+ vt 0 1.44329E-15
111
+ vt -29.92126 1.574803
112
+ vt -29.92126 1.421085E-14
113
+ vt -31.49606 1.574803
114
+ vt -31.49606 1.421085E-14
115
+ vt -29.92126 8.881784E-16
116
+ vt -31.49606 8.881784E-16
117
+ vt -8.267716 1.574803
118
+ vt -8.267716 9.325873E-15
119
+ vt -9.84252 1.574803
120
+ vt -9.84252 9.325873E-15
121
+ vt 31.49606 2.331468E-15
122
+ vt 29.92126 2.331468E-15
123
+ vt 31.49606 1.574803
124
+ vt 29.92126 1.574803
125
+ vt -29.92126 9.84252
126
+ vt -31.49606 9.84252
127
+ vt -31.49606 8.267716
128
+ vt 31.49606 0
129
+ vt 31.49606 9.84252
130
+ vt 0 12.20472
131
+ vt -9.84252 12.20472
132
+ vt -8.267716 8.437695E-15
133
+ vt -9.84252 1.021405E-14
134
+ vt -1.574803 1.332268E-15
135
+ vt 0 1.021405E-14
136
+ vt -1.574803 1.021405E-14
137
+ vt -31.49606 12.20472
138
+ vt -31.49606 9.325873E-15
139
+ vt -29.92126 9.325873E-15
140
+ vt 1.421085E-14 2.220446E-15
141
+ vt 1.574803 2.220446E-15
142
+ vt 9.84252 12.20472
143
+ vt 8.267716 9.325873E-15
144
+ vt 9.84252 9.325873E-15
145
+ vt 31.49606 2.220446E-15
146
+ vt 29.92126 2.220446E-15
147
+ vt 31.49606 12.20472
148
+ vt 29.92126 3.149606
149
+ vt 29.92126 10.62992
150
+ vt 1.574803 10.62992
151
+ vt 1.574803 3.149606
152
+ vt 1.574803 4.17911E-32
153
+ vt -1.574803 1.181102
154
+ vt -29.92126 1.181102
155
+ vt 29.92126 1.181102
156
+ vt 1.574803 1.181102
157
+ vt 29.92126 7.283464
158
+ vt 1.574803 7.283464
159
+ vt 29.92126 6.496063
160
+ vt 1.574803 6.496063
161
+ vt -29.92126 -3.012276E-16
162
+ vt -1.574803 -3.012276E-16
163
+ vt -8.235142E-34 1.574803
164
+ vt -8.235142E-34 8.267716
165
+ vt -1.421085E-14 2.220446E-15
166
+ vt -1.574803 2.220446E-15
167
+ vt -15.35433 7.283464
168
+ vt -16.14173 7.283464
169
+ vt -15.35433 10.62992
170
+ vt -16.14173 10.62992
171
+ vt -29.92126 7.283464
172
+ vt -1.574803 7.283464
173
+ vt -29.92126 6.496063
174
+ vt -16.14173 6.496063
175
+ vt -15.35433 6.496063
176
+ vt -1.574803 6.496063
177
+ vt -15.35433 3.149606
178
+ vt -16.14173 3.149606
179
+ vt 0 10.62992
180
+ vt 1.181102 6.496063
181
+ vt 0 3.149606
182
+ vt 8.267716 3.149606
183
+ vt 8.267716 6.496063
184
+ vt 1.181102 7.283464
185
+ vt 8.267716 10.62992
186
+ vt 8.267716 7.283464
187
+ vt -1.181102 7.283464
188
+ vt -8.267716 10.62992
189
+ vt -8.267716 7.283464
190
+ vt -1.181102 6.496063
191
+ vt -8.267716 3.149606
192
+ vt -8.267716 6.496063
193
+ vt 1.181102 10.62992
194
+ vt 1.968504 7.283464
195
+ vt 1.968504 10.62992
196
+ vt -1.181102 10.62992
197
+ vt -1.968504 10.62992
198
+ vt -1.968504 7.283464
199
+ vt -1.181102 3.149606
200
+ vt -1.968504 6.496063
201
+ vt -1.968504 3.149606
202
+ vt 1.181102 3.149606
203
+ vt 1.968504 3.149606
204
+ vt 1.968504 6.496063
205
+
206
+ usemtl wood
207
+
208
+ f 2/2/1 1/1/1 3/3/1
209
+ f 3/3/1 4/4/1 2/2/1
210
+ f 6/3/2 5/5/2 2/6/2
211
+ f 2/6/2 4/7/2 6/3/2
212
+ f 7/5/3 1/3/3 2/4/3
213
+ f 2/4/3 5/8/3 7/5/3
214
+ f 9/10/3 8/9/3 10/11/3
215
+ f 10/11/3 11/12/3 9/10/3
216
+ f 13/14/2 12/13/2 11/15/2
217
+ f 11/15/2 10/16/2 13/14/2
218
+ f 15/8/3 14/12/3 16/17/3
219
+ f 16/17/3 17/18/3 15/8/3
220
+ f 16/17/3 18/19/3 17/18/3
221
+ f 16/17/3 19/20/3 18/19/3
222
+ f 15/8/3 17/18/3 20/21/3
223
+ f 20/21/3 21/22/3 15/8/3
224
+ f 20/21/3 19/20/3 21/22/3
225
+ f 19/20/3 16/17/3 21/22/3
226
+ f 23/24/4 22/23/4 24/25/4
227
+ f 24/25/4 25/26/4 23/24/4
228
+ f 25/26/4 26/27/4 23/24/4
229
+ f 25/26/4 27/28/4 26/27/4
230
+ f 22/23/4 23/24/4 28/29/4
231
+ f 28/29/4 29/30/4 22/23/4
232
+ f 28/29/4 27/28/4 29/30/4
233
+ f 27/28/4 25/26/4 29/30/4
234
+ f 9/32/5 11/31/5 12/7/5
235
+ f 12/7/5 30/3/5 9/32/5
236
+ f 32/34/3 31/33/3 33/35/3
237
+ f 33/35/3 34/36/3 32/34/3
238
+ f 33/38/1 31/37/1 35/33/1
239
+ f 35/33/1 36/35/1 33/38/1
240
+ f 38/40/6 37/39/6 39/41/6
241
+ f 39/41/6 40/42/6 38/40/6
242
+ f 38/44/5 41/43/5 42/45/5
243
+ f 42/45/5 37/46/5 38/44/5
244
+ f 38/17/3 40/47/3 43/48/3
245
+ f 43/48/3 41/49/3 38/17/3
246
+ f 45/9/4 44/5/4 46/50/4
247
+ f 46/50/4 47/51/4 45/9/4
248
+ f 7/5/6 44/52/6 45/53/6
249
+ f 45/53/6 3/4/6 7/5/6
250
+ f 45/53/6 30/39/6 3/4/6
251
+ f 45/53/6 9/54/6 30/39/6
252
+ f 45/53/6 8/55/6 9/54/6
253
+ f 7/5/6 3/4/6 1/56/6
254
+ f 10/58/1 8/57/1 45/52/1
255
+ f 45/52/1 13/4/1 10/58/1
256
+ f 45/52/1 39/33/1 13/4/1
257
+ f 39/33/1 45/52/1 47/59/1
258
+ f 39/33/1 47/59/1 43/60/1
259
+ f 43/60/1 40/61/1 39/33/1
260
+ f 36/7/2 34/62/2 33/63/2
261
+ f 34/62/2 36/7/2 47/64/2
262
+ f 47/64/2 46/52/2 34/62/2
263
+ f 36/7/2 42/13/2 47/64/2
264
+ f 42/13/2 41/65/2 47/64/2
265
+ f 41/65/2 43/66/2 47/64/2
266
+ f 32/68/5 34/67/5 46/69/5
267
+ f 46/69/5 48/46/5 32/68/5
268
+ f 46/69/5 25/70/5 48/46/5
269
+ f 25/70/5 6/7/5 48/46/5
270
+ f 46/69/5 21/71/5 25/70/5
271
+ f 46/69/5 15/72/5 21/71/5
272
+ f 6/7/5 25/70/5 24/73/5
273
+ f 6/7/5 24/73/5 44/52/5
274
+ f 24/73/5 15/72/5 44/52/5
275
+ f 15/72/5 46/69/5 44/52/5
276
+ f 6/7/5 44/52/5 7/5/5
277
+ f 7/5/5 5/74/5 6/7/5
278
+ f 50/75/3 49/12/3 51/17/3
279
+ f 51/17/3 52/18/3 50/75/3
280
+ f 51/17/3 53/19/3 52/18/3
281
+ f 51/17/3 54/20/3 53/19/3
282
+ f 51/17/3 55/76/3 54/20/3
283
+ f 50/75/3 52/18/3 56/21/3
284
+ f 58/28/4 57/27/4 59/77/4
285
+ f 58/28/4 59/77/4 60/30/4
286
+ f 61/29/4 58/28/4 60/30/4
287
+ f 61/29/4 60/30/4 62/23/4
288
+ f 63/24/4 61/29/4 62/23/4
289
+ f 62/23/4 64/78/4 63/24/4
290
+ f 62/80/5 60/79/5 16/71/5
291
+ f 16/71/5 14/72/5 62/80/5
292
+ f 22/73/5 29/70/5 51/81/5
293
+ f 51/81/5 49/82/5 22/73/5
294
+ f 35/33/3 37/17/3 42/49/3
295
+ f 42/49/3 36/35/3 35/33/3
296
+ f 37/17/3 35/33/3 48/83/3
297
+ f 39/47/3 37/17/3 48/83/3
298
+ f 39/47/3 48/83/3 6/84/3
299
+ f 39/47/3 6/84/3 4/4/3
300
+ f 39/47/3 4/4/3 12/12/3
301
+ f 12/12/3 13/11/3 39/47/3
302
+ f 12/12/3 4/4/3 3/85/3
303
+ f 3/85/3 30/86/3 12/12/3
304
+ f 32/87/6 48/3/6 35/4/6
305
+ f 35/4/6 31/88/6 32/87/6
306
+ f 57/90/1 63/89/1 20/91/1
307
+ f 20/91/1 19/92/1 57/90/1
308
+ f 63/89/1 57/90/1 59/93/1
309
+ f 64/94/1 63/89/1 59/93/1
310
+ f 64/94/1 59/93/1 55/95/1
311
+ f 64/94/1 55/95/1 54/96/1
312
+ f 64/94/1 54/96/1 56/97/1
313
+ f 56/97/1 50/98/1 64/94/1
314
+ f 23/99/1 56/97/1 54/96/1
315
+ f 54/96/1 26/100/1 23/99/1
316
+ f 57/90/5 20/91/5 63/89/5
317
+ f 20/91/5 57/90/5 19/92/5
318
+ f 63/89/5 59/93/5 57/90/5
319
+ f 64/94/5 59/93/5 63/89/5
320
+ f 64/94/5 55/95/5 59/93/5
321
+ f 64/94/5 54/96/5 55/95/5
322
+ f 64/94/5 56/97/5 54/96/5
323
+ f 56/97/5 64/94/5 50/98/5
324
+ f 23/99/5 54/96/5 56/97/5
325
+ f 54/96/5 23/99/5 26/100/5
326
+ f 50/102/2 15/101/2 24/103/2
327
+ f 24/103/2 22/104/2 50/102/2
328
+ f 22/104/2 49/105/2 50/102/2
329
+ f 15/101/2 50/102/2 64/106/2
330
+ f 64/106/2 14/107/2 15/101/2
331
+ f 64/106/2 62/108/2 14/107/2
332
+ f 59/109/6 25/103/6 21/101/6
333
+ f 21/101/6 16/110/6 59/109/6
334
+ f 16/110/6 60/111/6 59/109/6
335
+ f 25/103/6 59/109/6 55/112/6
336
+ f 55/112/6 29/113/6 25/103/6
337
+ f 55/112/6 51/114/6 29/113/6
338
+ f 58/90/1 61/89/1 17/91/1
339
+ f 17/91/1 18/92/1 58/90/1
340
+ f 58/90/5 17/91/5 61/89/5
341
+ f 17/91/5 58/90/5 18/92/5
342
+ f 19/115/2 57/106/2 58/116/2
343
+ f 58/116/2 18/117/2 19/115/2
344
+ f 19/115/6 58/116/6 57/106/6
345
+ f 58/116/6 19/115/6 18/117/6
346
+ f 63/109/6 20/118/6 17/119/6
347
+ f 17/119/6 61/120/6 63/109/6
348
+ f 63/109/2 17/119/2 20/118/2
349
+ f 17/119/2 63/109/2 61/120/2
350
+ f 53/96/1 27/100/1 28/99/1
351
+ f 28/99/1 52/97/1 53/96/1
352
+ f 53/96/5 28/99/5 27/100/5
353
+ f 28/99/5 53/96/5 52/97/5
354
+ f 23/121/6 56/112/6 52/122/6
355
+ f 52/122/6 28/123/6 23/121/6
356
+ f 23/121/2 52/122/2 56/112/2
357
+ f 52/122/2 23/121/2 28/123/2
358
+ f 54/102/2 26/124/2 27/125/2
359
+ f 27/125/2 53/126/2 54/102/2
360
+ f 54/102/6 27/125/6 26/124/6
361
+ f 27/125/6 54/102/6 53/126/6
362
+ g cabinetTelevision
363
+
364
+
365
+
366
+
367
+ usemtl wood
368
+
369
+ f 2/2/1 1/1/1 3/3/1
370
+ f 3/3/1 4/4/1 2/2/1
371
+ f 6/3/2 5/5/2 2/6/2
372
+ f 2/6/2 4/7/2 6/3/2
373
+ f 7/5/3 1/3/3 2/4/3
374
+ f 2/4/3 5/8/3 7/5/3
375
+ f 9/10/3 8/9/3 10/11/3
376
+ f 10/11/3 11/12/3 9/10/3
377
+ f 13/14/2 12/13/2 11/15/2
378
+ f 11/15/2 10/16/2 13/14/2
379
+ f 15/8/3 14/12/3 16/17/3
380
+ f 16/17/3 17/18/3 15/8/3
381
+ f 16/17/3 18/19/3 17/18/3
382
+ f 16/17/3 19/20/3 18/19/3
383
+ f 15/8/3 17/18/3 20/21/3
384
+ f 20/21/3 21/22/3 15/8/3
385
+ f 20/21/3 19/20/3 21/22/3
386
+ f 19/20/3 16/17/3 21/22/3
387
+ f 23/24/4 22/23/4 24/25/4
388
+ f 24/25/4 25/26/4 23/24/4
389
+ f 25/26/4 26/27/4 23/24/4
390
+ f 25/26/4 27/28/4 26/27/4
391
+ f 22/23/4 23/24/4 28/29/4
392
+ f 28/29/4 29/30/4 22/23/4
393
+ f 28/29/4 27/28/4 29/30/4
394
+ f 27/28/4 25/26/4 29/30/4
395
+ f 9/32/5 11/31/5 12/7/5
396
+ f 12/7/5 30/3/5 9/32/5
397
+ f 32/34/3 31/33/3 33/35/3
398
+ f 33/35/3 34/36/3 32/34/3
399
+ f 33/38/1 31/37/1 35/33/1
400
+ f 35/33/1 36/35/1 33/38/1
401
+ f 38/40/6 37/39/6 39/41/6
402
+ f 39/41/6 40/42/6 38/40/6
403
+ f 38/44/5 41/43/5 42/45/5
404
+ f 42/45/5 37/46/5 38/44/5
405
+ f 38/17/3 40/47/3 43/48/3
406
+ f 43/48/3 41/49/3 38/17/3
407
+ f 45/9/4 44/5/4 46/50/4
408
+ f 46/50/4 47/51/4 45/9/4
409
+ f 7/5/6 44/52/6 45/53/6
410
+ f 45/53/6 3/4/6 7/5/6
411
+ f 45/53/6 30/39/6 3/4/6
412
+ f 45/53/6 9/54/6 30/39/6
413
+ f 45/53/6 8/55/6 9/54/6
414
+ f 7/5/6 3/4/6 1/56/6
415
+ f 10/58/1 8/57/1 45/52/1
416
+ f 45/52/1 13/4/1 10/58/1
417
+ f 45/52/1 39/33/1 13/4/1
418
+ f 39/33/1 45/52/1 47/59/1
419
+ f 39/33/1 47/59/1 43/60/1
420
+ f 43/60/1 40/61/1 39/33/1
421
+ f 36/7/2 34/62/2 33/63/2
422
+ f 34/62/2 36/7/2 47/64/2
423
+ f 47/64/2 46/52/2 34/62/2
424
+ f 36/7/2 42/13/2 47/64/2
425
+ f 42/13/2 41/65/2 47/64/2
426
+ f 41/65/2 43/66/2 47/64/2
427
+ f 32/68/5 34/67/5 46/69/5
428
+ f 46/69/5 48/46/5 32/68/5
429
+ f 46/69/5 25/70/5 48/46/5
430
+ f 25/70/5 6/7/5 48/46/5
431
+ f 46/69/5 21/71/5 25/70/5
432
+ f 46/69/5 15/72/5 21/71/5
433
+ f 6/7/5 25/70/5 24/73/5
434
+ f 6/7/5 24/73/5 44/52/5
435
+ f 24/73/5 15/72/5 44/52/5
436
+ f 15/72/5 46/69/5 44/52/5
437
+ f 6/7/5 44/52/5 7/5/5
438
+ f 7/5/5 5/74/5 6/7/5
439
+ f 50/75/3 49/12/3 51/17/3
440
+ f 51/17/3 52/18/3 50/75/3
441
+ f 51/17/3 53/19/3 52/18/3
442
+ f 51/17/3 54/20/3 53/19/3
443
+ f 51/17/3 55/76/3 54/20/3
444
+ f 50/75/3 52/18/3 56/21/3
445
+ f 58/28/4 57/27/4 59/77/4
446
+ f 58/28/4 59/77/4 60/30/4
447
+ f 61/29/4 58/28/4 60/30/4
448
+ f 61/29/4 60/30/4 62/23/4
449
+ f 63/24/4 61/29/4 62/23/4
450
+ f 62/23/4 64/78/4 63/24/4
451
+ f 62/80/5 60/79/5 16/71/5
452
+ f 16/71/5 14/72/5 62/80/5
453
+ f 22/73/5 29/70/5 51/81/5
454
+ f 51/81/5 49/82/5 22/73/5
455
+ f 35/33/3 37/17/3 42/49/3
456
+ f 42/49/3 36/35/3 35/33/3
457
+ f 37/17/3 35/33/3 48/83/3
458
+ f 39/47/3 37/17/3 48/83/3
459
+ f 39/47/3 48/83/3 6/84/3
460
+ f 39/47/3 6/84/3 4/4/3
461
+ f 39/47/3 4/4/3 12/12/3
462
+ f 12/12/3 13/11/3 39/47/3
463
+ f 12/12/3 4/4/3 3/85/3
464
+ f 3/85/3 30/86/3 12/12/3
465
+ f 32/87/6 48/3/6 35/4/6
466
+ f 35/4/6 31/88/6 32/87/6
467
+ f 57/90/1 63/89/1 20/91/1
468
+ f 20/91/1 19/92/1 57/90/1
469
+ f 63/89/1 57/90/1 59/93/1
470
+ f 64/94/1 63/89/1 59/93/1
471
+ f 64/94/1 59/93/1 55/95/1
472
+ f 64/94/1 55/95/1 54/96/1
473
+ f 64/94/1 54/96/1 56/97/1
474
+ f 56/97/1 50/98/1 64/94/1
475
+ f 23/99/1 56/97/1 54/96/1
476
+ f 54/96/1 26/100/1 23/99/1
477
+ f 57/90/5 20/91/5 63/89/5
478
+ f 20/91/5 57/90/5 19/92/5
479
+ f 63/89/5 59/93/5 57/90/5
480
+ f 64/94/5 59/93/5 63/89/5
481
+ f 64/94/5 55/95/5 59/93/5
482
+ f 64/94/5 54/96/5 55/95/5
483
+ f 64/94/5 56/97/5 54/96/5
484
+ f 56/97/5 64/94/5 50/98/5
485
+ f 23/99/5 54/96/5 56/97/5
486
+ f 54/96/5 23/99/5 26/100/5
487
+ f 50/102/2 15/101/2 24/103/2
488
+ f 24/103/2 22/104/2 50/102/2
489
+ f 22/104/2 49/105/2 50/102/2
490
+ f 15/101/2 50/102/2 64/106/2
491
+ f 64/106/2 14/107/2 15/101/2
492
+ f 64/106/2 62/108/2 14/107/2
493
+ f 59/109/6 25/103/6 21/101/6
494
+ f 21/101/6 16/110/6 59/109/6
495
+ f 16/110/6 60/111/6 59/109/6
496
+ f 25/103/6 59/109/6 55/112/6
497
+ f 55/112/6 29/113/6 25/103/6
498
+ f 55/112/6 51/114/6 29/113/6
499
+ f 58/90/1 61/89/1 17/91/1
500
+ f 17/91/1 18/92/1 58/90/1
501
+ f 58/90/5 17/91/5 61/89/5
502
+ f 17/91/5 58/90/5 18/92/5
503
+ f 19/115/2 57/106/2 58/116/2
504
+ f 58/116/2 18/117/2 19/115/2
505
+ f 19/115/6 58/116/6 57/106/6
506
+ f 58/116/6 19/115/6 18/117/6
507
+ f 63/109/6 20/118/6 17/119/6
508
+ f 17/119/6 61/120/6 63/109/6
509
+ f 63/109/2 17/119/2 20/118/2
510
+ f 17/119/2 63/109/2 61/120/2
511
+ f 53/96/1 27/100/1 28/99/1
512
+ f 28/99/1 52/97/1 53/96/1
513
+ f 53/96/5 28/99/5 27/100/5
514
+ f 28/99/5 53/96/5 52/97/5
515
+ f 23/121/6 56/112/6 52/122/6
516
+ f 52/122/6 28/123/6 23/121/6
517
+ f 23/121/2 52/122/2 56/112/2
518
+ f 52/122/2 23/121/2 28/123/2
519
+ f 54/102/2 26/124/2 27/125/2
520
+ f 27/125/2 53/126/2 54/102/2
521
+ f 54/102/6 27/125/6 26/124/6
522
+ f 27/125/6 54/102/6 53/126/6
modelos_3D/loungeChair.mtl ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl carpet
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.9433962 0.367176 0.3426486
6
+ Ks 0.330000 0.330000 0.330000
7
+
8
+ newmtl wood
9
+ Ka 0.000000 0.000000 0.000000
10
+ Kd 0.8962264 0.6015712 0.3931559
11
+ Ks 0.330000 0.330000 0.330000
12
+
modelos_3D/loungeChair.obj ADDED
@@ -0,0 +1,500 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib loungeChair.mtl
4
+
5
+ g loungeChair
6
+
7
+ v -0.3998286 0.33 0.02
8
+ v -0.3998286 0.23 0.02
9
+ v -0.3998286 0.37 0.06
10
+ v -0.3998286 0.23 0.3198286
11
+ v -0.3998286 0.37 0.3198286
12
+ v -0.05508572 0.42 0.3198286
13
+ v -0.05508572 0.37 0.3198286
14
+ v -0.05508572 0.42 0.41
15
+ v -0.05508572 0.37 0.41
16
+ v -0.4349143 0.42 0.3198286
17
+ v -0.3949143 0.46 0.3198286
18
+ v -0.4349143 0.42 0.41
19
+ v -0.3949143 0.46 0.41
20
+ v -0.49 0.37 0.06
21
+ v -0.4349143 0.37 0.3198286
22
+ v -0.4349143 0.37 0.41
23
+ v -0.49 0.37 0.41
24
+ v -0.49 0.33 0.02
25
+ v -0.09508572 0.46 0.3198286
26
+ v -0.09508572 0.46 0.41
27
+ v -0.49 0.05 0.02
28
+ v -0.49 0.05 0.06
29
+ v -0.49 0.05 0.37
30
+ v -0.49 0.05 0.41
31
+ v -1.127987E-17 0.33 0.02
32
+ v -1.797519E-17 0.05 0.02
33
+ v -1.127987E-17 0.37 0.06
34
+ v -1.797519E-17 0.05 0.06
35
+ v 0 0.37 0.41
36
+ v -8.516298E-16 0.05 0.37
37
+ v -8.516298E-16 0.05 0.41
38
+ v -0.04 0.05 0.41
39
+ v -0.45 0.05 0.41
40
+ v -0.04 0.05 0.37
41
+ v -0.45 0.05 0.06
42
+ v -0.45 0.05 0.37
43
+ v -0.45 0.05 0.02
44
+ v -0.04 0.05 0.02
45
+ v -0.04 0.05 0.06
46
+ v -0.09017144 0.23 0
47
+ v -0.09017144 0.23 0.02
48
+ v -0.3998286 0.23 0
49
+ v -0.09017144 0.23 0.3198286
50
+ v -0.3998286 0.1448143 0
51
+ v -0.09017144 0.1448143 0
52
+ v -0.3998286 0.1448143 0.02
53
+ v -0.09017144 0.1448143 0.02
54
+ v -0.09017144 0.33 0.02
55
+ v -0.09017144 0.37 0.06
56
+ v -0.09017144 0.37 0.3198286
57
+ v -0.45 9.023893E-17 0.41
58
+ v -0.45 9.023893E-17 0.37
59
+ v -0.49 9.023893E-17 0.41
60
+ v -0.49 9.023893E-17 0.37
61
+ v -0.49 0 0.02
62
+ v -0.45 0 0.02
63
+ v -0.04 9.023893E-17 0.37
64
+ v -8.516298E-16 9.023893E-17 0.37
65
+ v -8.516298E-16 9.023893E-17 0.41
66
+ v -1.797519E-17 0 0.06
67
+ v -1.797519E-17 0 0.02
68
+ v -0.04 0 0.06
69
+ v -0.04 0 0.02
70
+ v -0.45 0 0.06
71
+ v -0.49 0 0.06
72
+ v -0.04 9.023893E-17 0.41
73
+
74
+ vn 1 0 0
75
+ vn -0.7071068 0.7071068 0
76
+ vn 0 1 0
77
+ vn 0 0.7071068 -0.7071068
78
+ vn -1 0 0
79
+ vn 0 0 1
80
+ vn 0 -1 0
81
+ vn 0 0 -1
82
+ vn 0.7071068 0.7071068 0
83
+
84
+ vt -0.7874016 12.99213
85
+ vt -0.7874016 9.055119
86
+ vt -2.362205 14.56693
87
+ vt -12.59168 9.055119
88
+ vt -12.59168 14.56693
89
+ vt -12.59168 16.53543
90
+ vt -16.14173 16.53543
91
+ vt -16.14173 14.56693
92
+ vt 12.59168 -0.4151964
93
+ vt 12.59168 1.811912
94
+ vt 16.14173 -0.4151964
95
+ vt 16.14173 1.811912
96
+ vt 15.74128 2.362205
97
+ vt 15.74128 12.59168
98
+ vt 19.29134 2.362205
99
+ vt 17.12261 12.59168
100
+ vt 17.12261 16.14173
101
+ vt 19.29134 16.14173
102
+ vt 19.29134 9.743597
103
+ vt 15.74128 9.743597
104
+ vt 19.29134 11.97071
105
+ vt 15.74128 11.97071
106
+ vt 3.743532 12.59168
107
+ vt 3.743532 16.14173
108
+ vt 15.54781 12.59168
109
+ vt 15.54781 16.14173
110
+ vt 0.7874016 1.968504
111
+ vt 0.7874016 12.99213
112
+ vt 2.362205 1.968504
113
+ vt 2.362205 14.56693
114
+ vt 14.56693 1.968504
115
+ vt 16.14173 14.56693
116
+ vt 16.14173 1.968504
117
+ vt -0.7874016 1.968504
118
+ vt -2.362205 1.968504
119
+ vt -14.56693 1.968504
120
+ vt -16.14173 1.968504
121
+ vt -3.951606E-14 1.968504
122
+ vt -1.574803 1.968504
123
+ vt -5.987324E-15 14.56693
124
+ vt -17.71654 1.968504
125
+ vt -2.168729 14.56693
126
+ vt -19.29134 14.56693
127
+ vt -19.29134 1.968504
128
+ vt -17.12261 14.56693
129
+ vt -2.168729 16.53543
130
+ vt -17.12261 16.53543
131
+ vt -3.743532 18.11024
132
+ vt -15.54781 18.11024
133
+ vt -1.574803 16.14173
134
+ vt -1.574803 14.56693
135
+ vt -17.71654 16.14173
136
+ vt -17.71654 2.362205
137
+ vt -17.71654 14.56693
138
+ vt -19.29134 2.362205
139
+ vt -17.71654 0.7874016
140
+ vt -1.574803 0.7874016
141
+ vt -1.574803 2.362205
142
+ vt -3.345127E-14 14.56693
143
+ vt -6.302192E-16 2.362205
144
+ vt 3.550057 0
145
+ vt 3.550057 0.7874016
146
+ vt 15.74128 0
147
+ vt 3.550057 12.59168
148
+ vt 15.74128 0.7874016
149
+ vt 15.74128 5.701352
150
+ vt 3.550057 5.701352
151
+ vt 15.74128 9.055119
152
+ vt 3.550057 9.055119
153
+ vt 19.29134 1.968504
154
+ vt 17.71654 1.968504
155
+ vt 19.29134 12.99213
156
+ vt 1.574803 1.968504
157
+ vt 7.076846E-16 1.968504
158
+ vt 15.74128 12.99213
159
+ vt 4.440892E-16 12.99213
160
+ vt 3.550057 12.99213
161
+ vt -9.151615E-15 2.362205
162
+ vt 2.168729 12.59168
163
+ vt 3.550057 2.362205
164
+ vt 2.168729 16.14173
165
+ vt -9.595704E-15 16.14173
166
+ vt 3.550057 9.743597
167
+ vt 4.440892E-16 9.743597
168
+ vt 3.550057 11.97071
169
+ vt 4.440892E-16 11.97071
170
+ vt 0.7874016 9.055119
171
+ vt 12.59168 9.055119
172
+ vt 12.59168 14.56693
173
+ vt -12.59168 15.45295
174
+ vt -12.59168 13.22584
175
+ vt -16.14173 15.45295
176
+ vt -16.14173 13.22584
177
+ vt 17.12261 14.56693
178
+ vt 15.74128 14.56693
179
+ vt 17.12261 16.53543
180
+ vt 3.550057 14.56693
181
+ vt 2.168729 14.56693
182
+ vt 2.168729 16.53543
183
+ vt 15.54781 18.11024
184
+ vt 3.743532 18.11024
185
+ vt 12.59168 16.53543
186
+ vt 16.14173 16.53543
187
+ vt 0 9.055119
188
+ vt 0 5.701352
189
+ vt -0.7874016 5.701352
190
+ vt -3.550057 0.7874016
191
+ vt -3.550057 0
192
+ vt -15.74128 0.7874016
193
+ vt -15.74128 0
194
+ vt 0.7874016 5.701352
195
+ vt -19.29134 16.14173
196
+ vt -17.71654 1.49214E-13
197
+ vt -19.29134 1.49214E-13
198
+ vt 14.56693 -1.705303E-13
199
+ vt 16.14173 -1.705303E-13
200
+ vt 19.29134 3.552714E-15
201
+ vt 17.71654 3.552714E-15
202
+ vt -14.56693 3.552714E-15
203
+ vt -16.14173 3.552714E-15
204
+ vt 19.29134 0
205
+ vt 17.71654 0
206
+ vt 1.574803 3.552714E-15
207
+ vt 3.352874E-14 3.552714E-15
208
+ vt 3.352874E-14 1.968504
209
+ vt -7.076846E-16 2.362205
210
+ vt -7.076846E-16 0.7874016
211
+ vt -0.7874016 0
212
+ vt -2.362205 0
213
+ vt -17.71654 0
214
+ vt -19.29134 0
215
+ vt -7.076846E-16 0
216
+ vt -1.574803 0
217
+ vt -7.076846E-16 1.968504
218
+ vt 0.7874016 0
219
+ vt 2.362205 0
220
+ vt -19.29134 0.7874016
221
+ vt -3.352874E-14 3.552714E-15
222
+ vt -1.574803 3.552714E-15
223
+ vt 14.56693 3.552714E-15
224
+ vt 16.14173 3.552714E-15
225
+ vt -3.352874E-14 16.14173
226
+ vt -3.352874E-14 14.56693
227
+ vt 1.574803 0
228
+ vt 7.076846E-16 0
229
+
230
+ usemtl carpet
231
+
232
+ f 2/2/1 1/1/1 3/3/1
233
+ f 3/3/1 4/4/1 2/2/1
234
+ f 3/3/1 5/5/1 4/4/1
235
+ f 7/5/1 6/6/1 8/7/1
236
+ f 8/7/1 9/8/1 7/5/1
237
+ f 11/10/2 10/9/2 12/11/2
238
+ f 12/11/2 13/12/2 11/10/2
239
+ f 5/14/3 3/13/3 14/15/3
240
+ f 14/15/3 15/16/3 5/14/3
241
+ f 14/15/3 16/17/3 15/16/3
242
+ f 14/15/3 17/18/3 16/17/3
243
+ f 1/20/4 18/19/4 14/21/4
244
+ f 14/21/4 3/22/4 1/20/4
245
+ f 20/24/3 19/23/3 11/25/3
246
+ f 11/25/3 13/26/3 20/24/3
247
+ f 18/28/5 21/27/5 22/29/5
248
+ f 22/29/5 14/30/5 18/28/5
249
+ f 22/29/5 23/31/5 14/30/5
250
+ f 23/31/5 17/32/5 14/30/5
251
+ f 23/31/5 24/33/5 17/32/5
252
+ f 26/34/1 25/1/1 27/3/1
253
+ f 27/3/1 28/35/1 26/34/1
254
+ f 27/3/1 29/8/1 28/35/1
255
+ f 29/8/1 30/36/1 28/35/1
256
+ f 29/8/1 31/37/1 30/36/1
257
+ f 32/39/6 31/38/6 29/40/6
258
+ f 29/40/6 33/41/6 32/39/6
259
+ f 29/40/6 9/42/6 33/41/6
260
+ f 33/41/6 9/42/6 17/43/6
261
+ f 17/43/6 24/44/6 33/41/6
262
+ f 9/42/6 16/45/6 17/43/6
263
+ f 16/45/6 9/42/6 8/46/6
264
+ f 8/46/6 12/47/6 16/45/6
265
+ f 8/46/6 20/48/6 12/47/6
266
+ f 20/48/6 13/49/6 12/47/6
267
+ f 34/51/7 32/50/7 33/52/7
268
+ f 33/52/7 35/53/7 34/51/7
269
+ f 33/52/7 36/54/7 35/53/7
270
+ f 36/54/7 22/55/7 35/53/7
271
+ f 36/54/7 23/43/7 22/55/7
272
+ f 34/51/7 35/53/7 37/56/7
273
+ f 34/51/7 37/56/7 38/57/7
274
+ f 34/51/7 38/57/7 39/58/7
275
+ f 30/59/7 34/51/7 39/58/7
276
+ f 39/58/7 28/60/7 30/59/7
277
+ f 41/62/3 40/61/3 42/63/3
278
+ f 42/63/3 43/64/3 41/62/3
279
+ f 42/63/3 4/14/3 43/64/3
280
+ f 42/63/3 2/65/3 4/14/3
281
+ f 45/67/8 44/66/8 42/68/8
282
+ f 42/68/8 40/69/8 45/67/8
283
+ f 37/71/8 21/70/8 18/72/8
284
+ f 18/72/8 46/66/8 37/71/8
285
+ f 46/66/8 38/73/8 37/71/8
286
+ f 46/66/8 26/74/8 38/73/8
287
+ f 18/72/8 2/68/8 46/66/8
288
+ f 18/72/8 1/75/8 2/68/8
289
+ f 26/74/8 46/66/8 47/67/8
290
+ f 47/67/8 25/76/8 26/74/8
291
+ f 47/67/8 41/69/8 25/76/8
292
+ f 41/69/8 48/77/8 25/76/8
293
+ f 7/79/3 27/78/3 49/80/3
294
+ f 49/80/3 50/64/3 7/79/3
295
+ f 27/78/3 7/79/3 9/81/3
296
+ f 9/81/3 29/82/3 27/78/3
297
+ f 25/84/4 48/83/4 49/85/4
298
+ f 49/85/4 27/86/4 25/84/4
299
+ f 48/28/5 41/87/5 43/88/5
300
+ f 43/88/5 49/30/5 48/28/5
301
+ f 43/88/5 50/89/5 49/30/5
302
+ f 6/91/9 19/90/9 20/92/9
303
+ f 20/92/9 8/93/9 6/91/9
304
+ f 5/95/8 15/94/8 10/96/8
305
+ f 10/96/8 50/97/8 5/95/8
306
+ f 10/96/8 7/98/8 50/97/8
307
+ f 10/96/8 6/99/8 7/98/8
308
+ f 10/96/8 11/100/8 6/99/8
309
+ f 11/100/8 19/101/8 6/99/8
310
+ f 5/95/8 50/97/8 43/69/8
311
+ f 43/69/8 4/68/8 5/95/8
312
+ f 10/102/5 15/89/5 16/32/5
313
+ f 16/32/5 12/103/5 10/102/5
314
+ f 45/105/1 40/104/1 41/2/1
315
+ f 41/2/1 47/106/1 45/105/1
316
+ f 45/108/7 47/107/7 46/109/7
317
+ f 46/109/7 44/110/7 45/108/7
318
+ f 42/104/5 44/105/5 46/111/5
319
+ f 46/111/5 2/87/5 42/104/5
320
+
321
+ usemtl wood
322
+
323
+ f 52/54/7 51/52/7 53/112/7
324
+ f 53/112/7 54/43/7 52/54/7
325
+ f 53/114/6 51/113/6 33/41/6
326
+ f 33/41/6 24/44/6 53/114/6
327
+ f 23/31/5 54/115/5 53/116/5
328
+ f 53/116/5 24/33/5 23/31/5
329
+ f 52/118/8 54/117/8 23/70/8
330
+ f 23/70/8 36/71/8 52/118/8
331
+ f 52/119/1 36/36/1 33/37/1
332
+ f 33/37/1 51/120/1 52/119/1
333
+ f 56/122/8 55/121/8 21/70/8
334
+ f 21/70/8 37/71/8 56/122/8
335
+ f 58/124/8 57/123/8 34/73/8
336
+ f 34/73/8 30/125/8 58/124/8
337
+ f 58/119/1 30/36/1 31/37/1
338
+ f 31/37/1 59/120/1 58/119/1
339
+ f 61/127/7 60/126/7 62/58/7
340
+ f 62/58/7 63/57/7 61/127/7
341
+ f 56/128/1 37/34/1 35/35/1
342
+ f 35/35/1 64/129/1 56/128/1
343
+ f 61/128/1 26/34/1 28/35/1
344
+ f 28/35/1 60/129/1 61/128/1
345
+ f 65/131/6 64/130/6 35/41/6
346
+ f 35/41/6 22/44/6 65/131/6
347
+ f 62/133/6 60/132/6 28/134/6
348
+ f 28/134/6 39/39/6 62/133/6
349
+ f 38/27/5 63/135/5 62/136/5
350
+ f 62/136/5 39/29/5 38/27/5
351
+ f 21/27/5 55/135/5 65/136/5
352
+ f 65/136/5 22/29/5 21/27/5
353
+ f 56/56/7 64/53/7 65/55/7
354
+ f 65/55/7 55/137/7 56/56/7
355
+ f 66/139/6 59/138/6 31/38/6
356
+ f 31/38/6 32/39/6 66/139/6
357
+ f 34/31/5 57/140/5 66/141/5
358
+ f 66/141/5 32/33/5 34/31/5
359
+ f 58/143/7 59/142/7 66/50/7
360
+ f 66/50/7 57/51/7 58/143/7
361
+ f 61/145/8 63/144/8 38/73/8
362
+ f 38/73/8 26/74/8 61/145/8
363
+ g loungeChair
364
+
365
+
366
+
367
+
368
+ usemtl carpet
369
+
370
+ f 2/2/1 1/1/1 3/3/1
371
+ f 3/3/1 4/4/1 2/2/1
372
+ f 3/3/1 5/5/1 4/4/1
373
+ f 7/5/1 6/6/1 8/7/1
374
+ f 8/7/1 9/8/1 7/5/1
375
+ f 11/10/2 10/9/2 12/11/2
376
+ f 12/11/2 13/12/2 11/10/2
377
+ f 5/14/3 3/13/3 14/15/3
378
+ f 14/15/3 15/16/3 5/14/3
379
+ f 14/15/3 16/17/3 15/16/3
380
+ f 14/15/3 17/18/3 16/17/3
381
+ f 1/20/4 18/19/4 14/21/4
382
+ f 14/21/4 3/22/4 1/20/4
383
+ f 20/24/3 19/23/3 11/25/3
384
+ f 11/25/3 13/26/3 20/24/3
385
+ f 18/28/5 21/27/5 22/29/5
386
+ f 22/29/5 14/30/5 18/28/5
387
+ f 22/29/5 23/31/5 14/30/5
388
+ f 23/31/5 17/32/5 14/30/5
389
+ f 23/31/5 24/33/5 17/32/5
390
+ f 26/34/1 25/1/1 27/3/1
391
+ f 27/3/1 28/35/1 26/34/1
392
+ f 27/3/1 29/8/1 28/35/1
393
+ f 29/8/1 30/36/1 28/35/1
394
+ f 29/8/1 31/37/1 30/36/1
395
+ f 32/39/6 31/38/6 29/40/6
396
+ f 29/40/6 33/41/6 32/39/6
397
+ f 29/40/6 9/42/6 33/41/6
398
+ f 33/41/6 9/42/6 17/43/6
399
+ f 17/43/6 24/44/6 33/41/6
400
+ f 9/42/6 16/45/6 17/43/6
401
+ f 16/45/6 9/42/6 8/46/6
402
+ f 8/46/6 12/47/6 16/45/6
403
+ f 8/46/6 20/48/6 12/47/6
404
+ f 20/48/6 13/49/6 12/47/6
405
+ f 34/51/7 32/50/7 33/52/7
406
+ f 33/52/7 35/53/7 34/51/7
407
+ f 33/52/7 36/54/7 35/53/7
408
+ f 36/54/7 22/55/7 35/53/7
409
+ f 36/54/7 23/43/7 22/55/7
410
+ f 34/51/7 35/53/7 37/56/7
411
+ f 34/51/7 37/56/7 38/57/7
412
+ f 34/51/7 38/57/7 39/58/7
413
+ f 30/59/7 34/51/7 39/58/7
414
+ f 39/58/7 28/60/7 30/59/7
415
+ f 41/62/3 40/61/3 42/63/3
416
+ f 42/63/3 43/64/3 41/62/3
417
+ f 42/63/3 4/14/3 43/64/3
418
+ f 42/63/3 2/65/3 4/14/3
419
+ f 45/67/8 44/66/8 42/68/8
420
+ f 42/68/8 40/69/8 45/67/8
421
+ f 37/71/8 21/70/8 18/72/8
422
+ f 18/72/8 46/66/8 37/71/8
423
+ f 46/66/8 38/73/8 37/71/8
424
+ f 46/66/8 26/74/8 38/73/8
425
+ f 18/72/8 2/68/8 46/66/8
426
+ f 18/72/8 1/75/8 2/68/8
427
+ f 26/74/8 46/66/8 47/67/8
428
+ f 47/67/8 25/76/8 26/74/8
429
+ f 47/67/8 41/69/8 25/76/8
430
+ f 41/69/8 48/77/8 25/76/8
431
+ f 7/79/3 27/78/3 49/80/3
432
+ f 49/80/3 50/64/3 7/79/3
433
+ f 27/78/3 7/79/3 9/81/3
434
+ f 9/81/3 29/82/3 27/78/3
435
+ f 25/84/4 48/83/4 49/85/4
436
+ f 49/85/4 27/86/4 25/84/4
437
+ f 48/28/5 41/87/5 43/88/5
438
+ f 43/88/5 49/30/5 48/28/5
439
+ f 43/88/5 50/89/5 49/30/5
440
+ f 6/91/9 19/90/9 20/92/9
441
+ f 20/92/9 8/93/9 6/91/9
442
+ f 5/95/8 15/94/8 10/96/8
443
+ f 10/96/8 50/97/8 5/95/8
444
+ f 10/96/8 7/98/8 50/97/8
445
+ f 10/96/8 6/99/8 7/98/8
446
+ f 10/96/8 11/100/8 6/99/8
447
+ f 11/100/8 19/101/8 6/99/8
448
+ f 5/95/8 50/97/8 43/69/8
449
+ f 43/69/8 4/68/8 5/95/8
450
+ f 10/102/5 15/89/5 16/32/5
451
+ f 16/32/5 12/103/5 10/102/5
452
+ f 45/105/1 40/104/1 41/2/1
453
+ f 41/2/1 47/106/1 45/105/1
454
+ f 45/108/7 47/107/7 46/109/7
455
+ f 46/109/7 44/110/7 45/108/7
456
+ f 42/104/5 44/105/5 46/111/5
457
+ f 46/111/5 2/87/5 42/104/5
458
+
459
+ usemtl wood
460
+
461
+ f 52/54/7 51/52/7 53/112/7
462
+ f 53/112/7 54/43/7 52/54/7
463
+ f 53/114/6 51/113/6 33/41/6
464
+ f 33/41/6 24/44/6 53/114/6
465
+ f 23/31/5 54/115/5 53/116/5
466
+ f 53/116/5 24/33/5 23/31/5
467
+ f 52/118/8 54/117/8 23/70/8
468
+ f 23/70/8 36/71/8 52/118/8
469
+ f 52/119/1 36/36/1 33/37/1
470
+ f 33/37/1 51/120/1 52/119/1
471
+ f 56/122/8 55/121/8 21/70/8
472
+ f 21/70/8 37/71/8 56/122/8
473
+ f 58/124/8 57/123/8 34/73/8
474
+ f 34/73/8 30/125/8 58/124/8
475
+ f 58/119/1 30/36/1 31/37/1
476
+ f 31/37/1 59/120/1 58/119/1
477
+ f 61/127/7 60/126/7 62/58/7
478
+ f 62/58/7 63/57/7 61/127/7
479
+ f 56/128/1 37/34/1 35/35/1
480
+ f 35/35/1 64/129/1 56/128/1
481
+ f 61/128/1 26/34/1 28/35/1
482
+ f 28/35/1 60/129/1 61/128/1
483
+ f 65/131/6 64/130/6 35/41/6
484
+ f 35/41/6 22/44/6 65/131/6
485
+ f 62/133/6 60/132/6 28/134/6
486
+ f 28/134/6 39/39/6 62/133/6
487
+ f 38/27/5 63/135/5 62/136/5
488
+ f 62/136/5 39/29/5 38/27/5
489
+ f 21/27/5 55/135/5 65/136/5
490
+ f 65/136/5 22/29/5 21/27/5
491
+ f 56/56/7 64/53/7 65/55/7
492
+ f 65/55/7 55/137/7 56/56/7
493
+ f 66/139/6 59/138/6 31/38/6
494
+ f 31/38/6 32/39/6 66/139/6
495
+ f 34/31/5 57/140/5 66/141/5
496
+ f 66/141/5 32/33/5 34/31/5
497
+ f 58/143/7 59/142/7 66/50/7
498
+ f 66/50/7 57/51/7 58/143/7
499
+ f 61/145/8 63/144/8 38/73/8
500
+ f 38/73/8 26/74/8 61/145/8
modelos_3D/loungeDesignSofaCorner.mtl ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl carpetBlue
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.3561766 0.51664 0.8679245
6
+ Ks 0.330000 0.330000 0.330000
7
+
8
+ newmtl metal
9
+ Ka 0.000000 0.000000 0.000000
10
+ Kd 0.7406105 0.8228667 0.8396226
11
+ Ks 0.330000 0.330000 0.330000
12
+
modelos_3D/loungeDesignSofaCorner.obj ADDED
@@ -0,0 +1,727 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib loungeDesignSofaCorner.mtl
4
+
5
+ g loungeDesignSofaCorner
6
+
7
+ v -0.9398286 0.05 0.9398286
8
+ v -0.8923386 0.05 1.282339
9
+ v -0.1601714 0.05 0.9398286
10
+ v -0.8923386 0.05 1.332339
11
+ v -0.9423386 0.05 1.282339
12
+ v -0.9598285 0.05 0.1601714
13
+ v -0.9398286 0.05 0.1601714
14
+ v -0.1601714 0.05 0.9598285
15
+ v -0.06749 0.05 0.9773185
16
+ v -0.06749 0.05 1.027319
17
+ v -0.06749 0.05 1.282339
18
+ v -0.06749 0.05 1.332339
19
+ v -1.349828 0.05 1.349828
20
+ v -0.01749 0.05 1.332339
21
+ v 0 0.05 1.349828
22
+ v 0 0.05 0.9598285
23
+ v -0.9423386 0.05 1.332339
24
+ v -1.282339 0.05 1.332339
25
+ v -0.9773185 0.05 0.06749
26
+ v -0.9773185 0.05 0.01749001
27
+ v -1.027319 0.05 0.06749
28
+ v -1.282339 0.05 0.01749
29
+ v -1.282339 0.05 0.06749
30
+ v -1.282339 0.05 0.8923386
31
+ v -1.332339 0.05 0.06749
32
+ v -1.332339 0.05 0.8923386
33
+ v -1.332339 0.05 1.332339
34
+ v -1.332339 0.05 1.282339
35
+ v -1.332339 0.05 0.9423386
36
+ v -1.349828 0.05 0
37
+ v -0.9598285 0.05 8.218493E-09
38
+ v -1.027318 0.05 0.01749001
39
+ v -1.332339 0.05 0.01749
40
+ v -1.282339 0.05 0.9423386
41
+ v -1.282339 0.05 1.282339
42
+ v -0.01749 0.05 0.9773185
43
+ v -0.01749 0.05 1.282339
44
+ v -0.01749 0.05 1.027319
45
+ v -1.349828 0.33 0
46
+ v -0.9598285 0.33 8.218493E-09
47
+ v -0.9598285 0.33 0.1601714
48
+ v -0.9598285 0.23 0.1601714
49
+ v -1.259657 0.4 0.1601714
50
+ v -1.243694 0.33 0.1601714
51
+ v -1.259657 0.4 1.259657
52
+ v -1.22089 0.23 0.1601714
53
+ v -1.22089 0.23 1.22089
54
+ v -0.9398286 0.23 0.1601714
55
+ v -0.9398286 0.23 0.9398286
56
+ v -1.349828 0.33 0.1601714
57
+ v -1.349828 0.4 0.1601714
58
+ v -1.349828 0.4 1.349828
59
+ v 0 0.33 1.349828
60
+ v -0.1601714 0.33 1.349828
61
+ v -0.1601714 0.4 1.349828
62
+ v -0.1601714 0.23 0.9398286
63
+ v -0.1601714 0.23 0.9598285
64
+ v -0.1601714 0.4 1.259657
65
+ v 0 0.33 0.9598285
66
+ v -0.1601714 0.33 0.9598285
67
+ v -0.1601714 0.23 1.22089
68
+ v -0.1601714 0.33 1.243694
69
+ v -1.324829 1.804779E-16 0.025
70
+ v -1.289848 1.804779E-16 0.025
71
+ v -1.289848 1.804779E-16 0.05998
72
+ v -1.324829 1.804779E-16 0.05998
73
+ v -1.019809 1.804779E-16 0.02500001
74
+ v -1.019809 1.804779E-16 0.05998001
75
+ v -1.289849 0 0.9348286
76
+ v -1.324829 0 0.9348286
77
+ v -0.9848285 1.804779E-16 0.02500001
78
+ v -0.9848285 1.804779E-16 0.05998001
79
+ v -1.324829 0 0.8998486
80
+ v -1.289849 0 0.8998486
81
+ v -0.025 0 1.019809
82
+ v -0.05998 0 1.019809
83
+ v -0.025 0 0.9848285
84
+ v -0.05998 0 0.9848285
85
+ v -0.025 0 1.324829
86
+ v -0.05998 0 1.324829
87
+ v -0.05998 0 1.289849
88
+ v -0.025 0 1.289849
89
+ v -1.289849 5.752732E-16 1.289849
90
+ v -1.289849 5.696332E-16 1.324829
91
+ v -1.324829 5.752732E-16 1.324829
92
+ v -1.324829 5.752732E-16 1.289849
93
+
94
+ vn 0 -1 0
95
+ vn 0 0 -1
96
+ vn 1 0 0
97
+ vn 0.9749711 0.222332 0
98
+ vn 0 1 0
99
+ vn 0 0 1
100
+ vn -1 0 0
101
+ vn 0 0.222332 -0.9749711
102
+ vn 0 -0.1485339 -0.9889073
103
+ vn 0.9889073 -0.1485339 0
104
+ vn -0.9889073 -0.1485339 0
105
+ vn 0 -0.1485339 0.9889073
106
+
107
+ vt -37.00113 37.00113
108
+ vt -35.13144 50.48577
109
+ vt -6.305962 37.00113
110
+ vt -35.13144 52.45427
111
+ vt -37.09995 50.48577
112
+ vt -37.78852 6.305963
113
+ vt -37.00113 6.305963
114
+ vt -6.305962 37.78852
115
+ vt -2.657087 38.47711
116
+ vt -2.657087 40.44561
117
+ vt -2.657087 50.48577
118
+ vt -2.657087 52.45427
119
+ vt -53.14286 53.14286
120
+ vt -0.6885827 52.45427
121
+ vt -4.866815E-17 53.14286
122
+ vt -4.866815E-17 37.78852
123
+ vt -37.09995 52.45427
124
+ vt -50.48577 52.45427
125
+ vt -38.47711 2.657087
126
+ vt -38.47711 0.688583
127
+ vt -40.44561 2.657087
128
+ vt -50.48577 0.6885827
129
+ vt -50.48577 2.657087
130
+ vt -50.48577 35.13144
131
+ vt -52.45427 2.657087
132
+ vt -52.45427 35.13144
133
+ vt -52.45427 52.45427
134
+ vt -52.45427 50.48577
135
+ vt -52.45427 37.09995
136
+ vt -53.14286 -9.686729E-17
137
+ vt -37.78852 3.235627E-07
138
+ vt -40.44561 0.688583
139
+ vt -52.45427 0.6885827
140
+ vt -50.48577 37.09995
141
+ vt -50.48577 50.48577
142
+ vt -0.6885827 38.47711
143
+ vt -0.6885827 50.48577
144
+ vt -0.6885827 40.44561
145
+ vt 53.14286 1.968504
146
+ vt 37.78852 1.968504
147
+ vt 53.14286 12.99213
148
+ vt 37.78852 12.99213
149
+ vt -1.119883E-06 12.99213
150
+ vt -1.119883E-06 1.968504
151
+ vt -6.305963 12.99213
152
+ vt -6.305963 1.968504
153
+ vt -6.305963 9.055119
154
+ vt -6.305963 26.37994
155
+ vt -6.305963 23.55329
156
+ vt -49.5928 26.37994
157
+ vt -6.305963 19.51521
158
+ vt -48.06655 19.51521
159
+ vt -37.00113 9.055119
160
+ vt -37.00113 1.968504
161
+ vt 37.00113 1.968504
162
+ vt 37.78852 9.055119
163
+ vt 37.00113 9.055119
164
+ vt 48.96434 12.99213
165
+ vt 49.5928 15.74803
166
+ vt 53.14286 15.74803
167
+ vt 37.78852 3.235628E-07
168
+ vt 37.78852 6.305963
169
+ vt 53.14286 2.101413E-14
170
+ vt 48.96434 6.305962
171
+ vt 53.14286 6.305962
172
+ vt -37.78852 9.055119
173
+ vt -48.06655 9.055119
174
+ vt -37.78852 12.99213
175
+ vt -48.96434 12.99213
176
+ vt 7.820101E-07 1.968504
177
+ vt 7.820101E-07 12.99213
178
+ vt 6.305963 12.99213
179
+ vt 6.305963 15.74803
180
+ vt 1.516024E-13 1.968504
181
+ vt -53.14286 1.968504
182
+ vt 1.516024E-13 12.99213
183
+ vt -6.305962 12.99213
184
+ vt -53.14286 15.74803
185
+ vt -6.305962 15.74803
186
+ vt 6.305962 1.968504
187
+ vt 6.305962 9.055119
188
+ vt -37.78852 1.968504
189
+ vt 49.5928 6.305962
190
+ vt 49.5928 49.5928
191
+ vt 53.14286 53.14286
192
+ vt 6.305962 53.14286
193
+ vt 6.305962 49.5928
194
+ vt -53.14286 12.99213
195
+ vt 0 1.968504
196
+ vt 0 12.99213
197
+ vt 6.305962 12.99213
198
+ vt 37.00113 6.305963
199
+ vt 37.00113 37.00113
200
+ vt 48.06655 48.06655
201
+ vt 6.305962 48.06655
202
+ vt 6.305962 37.78852
203
+ vt 6.305962 37.00113
204
+ vt 48.06655 6.305962
205
+ vt 48.06655 19.51521
206
+ vt 6.305962 19.51521
207
+ vt 49.5928 26.37994
208
+ vt 6.305962 23.55329
209
+ vt 6.305962 26.37994
210
+ vt 5.107615E-15 37.78852
211
+ vt 5.107615E-15 53.14286
212
+ vt 6.305962 48.96434
213
+ vt 48.06655 9.055119
214
+ vt -49.5928 15.74803
215
+ vt 52.1586 -0.1461949
216
+ vt 50.78144 -0.1461949
217
+ vt 52.45427 1.84439
218
+ vt 50.48577 1.84439
219
+ vt -50.78144 0.984252
220
+ vt -52.1586 0.984252
221
+ vt -50.78144 2.361417
222
+ vt -52.1586 2.361417
223
+ vt -0.6885838 -5.552179
224
+ vt -0.9842531 -7.542764
225
+ vt -2.657088 -5.552179
226
+ vt -2.361418 -7.542764
227
+ vt 0.6885838 7.954212
228
+ vt 2.657088 7.954212
229
+ vt 0.9842531 5.963627
230
+ vt 2.361418 5.963627
231
+ vt 0.6885838 9.737905
232
+ vt 2.657088 9.737905
233
+ vt 0.9842531 7.74732
234
+ vt 2.361418 7.74732
235
+ vt -50.78144 5.466682
236
+ vt -52.1586 5.466682
237
+ vt -50.48577 7.457267
238
+ vt -52.45427 7.457267
239
+ vt -38.77278 0.9842523
240
+ vt -40.14994 0.9842522
241
+ vt -38.77278 2.361418
242
+ vt -40.14994 2.361418
243
+ vt 52.1586 -5.262126
244
+ vt 50.78144 -5.262126
245
+ vt 52.45427 -3.271541
246
+ vt 50.48577 -3.271541
247
+ vt -50.78144 0.3507507
248
+ vt -52.1586 0.3507507
249
+ vt -50.48577 2.341336
250
+ vt -52.45427 2.341336
251
+ vt -50.78144 35.42711
252
+ vt -52.1586 35.42711
253
+ vt -50.78144 36.80428
254
+ vt -52.1586 36.80428
255
+ vt -0.6885838 -3.768486
256
+ vt -0.9842531 -5.759071
257
+ vt -2.657088 -3.768486
258
+ vt -2.361418 -5.759071
259
+ vt -35.13144 -5.552179
260
+ vt -35.42711 -7.542764
261
+ vt -37.09995 -5.552179
262
+ vt -36.80428 -7.542764
263
+ vt -38.77278 0.3507507
264
+ vt -40.14994 0.3507507
265
+ vt -38.47711 2.341336
266
+ vt -40.44561 2.341336
267
+ vt 40.14994 -0.1461949
268
+ vt 38.77278 -0.1461949
269
+ vt 40.44561 1.84439
270
+ vt 38.47711 1.84439
271
+ vt 35.13144 9.737905
272
+ vt 37.09995 9.737905
273
+ vt 35.42711 7.74732
274
+ vt 36.80428 7.74732
275
+ vt -0.984252 5.963627
276
+ vt -2.361417 5.963627
277
+ vt -0.6885827 7.954212
278
+ vt -2.657087 7.954212
279
+ vt -0.984252 40.14994
280
+ vt -0.984252 38.77278
281
+ vt -2.361417 40.14994
282
+ vt -2.361417 38.77278
283
+ vt -0.984252 7.74732
284
+ vt -2.361417 7.74732
285
+ vt -0.6885827 9.737905
286
+ vt -2.657087 9.737905
287
+ vt 38.47711 2.341335
288
+ vt 40.44561 2.341335
289
+ vt 38.77278 0.3507505
290
+ vt 40.14994 0.3507505
291
+ vt 2.361417 -7.542764
292
+ vt 0.984252 -7.542764
293
+ vt 2.657087 -5.552179
294
+ vt 0.6885827 -5.552179
295
+ vt -0.984252 52.1586
296
+ vt -0.984252 50.78144
297
+ vt -2.361417 52.1586
298
+ vt -2.361417 50.78144
299
+ vt -50.48577 1.84439
300
+ vt -50.78144 -0.1461948
301
+ vt -52.45427 1.84439
302
+ vt -52.1586 -0.1461948
303
+ vt 50.48577 2.341335
304
+ vt 52.45427 2.341335
305
+ vt 50.78144 0.3507505
306
+ vt 52.1586 0.3507505
307
+ vt -38.47711 1.84439
308
+ vt -38.77278 -0.1461948
309
+ vt -40.44561 1.84439
310
+ vt -40.14994 -0.1461948
311
+ vt 2.361417 -5.759071
312
+ vt 0.984252 -5.759071
313
+ vt 2.657087 -3.768486
314
+ vt 0.6885827 -3.768486
315
+ vt -50.48577 -5.552179
316
+ vt -50.78144 -7.542764
317
+ vt -52.45427 -5.552179
318
+ vt -52.1586 -7.542764
319
+ vt -50.78144 7.74732
320
+ vt -52.1586 7.74732
321
+ vt -50.48577 9.737905
322
+ vt -52.45427 9.737905
323
+ vt 52.1586 -7.542764
324
+ vt 50.78144 -7.542764
325
+ vt 52.45427 -5.552179
326
+ vt 50.48577 -5.552179
327
+ vt 50.48577 9.737905
328
+ vt 52.45427 9.737905
329
+ vt 50.78144 7.74732
330
+ vt 52.1586 7.74732
331
+ vt -50.78144 52.1586
332
+ vt -50.78144 50.78144
333
+ vt -52.1586 52.1586
334
+ vt -52.1586 50.78144
335
+
336
+ usemtl carpetBlue
337
+
338
+ f 2/2/1 1/1/1 3/3/1
339
+ f 3/3/1 4/4/1 2/2/1
340
+ f 2/2/1 5/5/1 1/1/1
341
+ f 1/1/1 5/5/1 6/6/1
342
+ f 6/6/1 7/7/1 1/1/1
343
+ f 4/4/1 3/3/1 8/8/1
344
+ f 4/4/1 8/8/1 9/9/1
345
+ f 4/4/1 9/9/1 10/10/1
346
+ f 4/4/1 10/10/1 11/11/1
347
+ f 4/4/1 11/11/1 12/12/1
348
+ f 13/13/1 4/4/1 12/12/1
349
+ f 13/13/1 12/12/1 14/14/1
350
+ f 15/15/1 13/13/1 14/14/1
351
+ f 14/14/1 16/16/1 15/15/1
352
+ f 13/13/1 17/17/1 4/4/1
353
+ f 13/13/1 5/5/1 17/17/1
354
+ f 13/13/1 18/18/1 5/5/1
355
+ f 18/18/1 6/6/1 5/5/1
356
+ f 18/18/1 19/19/1 6/6/1
357
+ f 19/19/1 20/20/1 6/6/1
358
+ f 18/18/1 21/21/1 19/19/1
359
+ f 18/18/1 22/22/1 21/21/1
360
+ f 18/18/1 23/23/1 22/22/1
361
+ f 18/18/1 24/24/1 23/23/1
362
+ f 25/25/1 23/23/1 24/24/1
363
+ f 24/24/1 26/26/1 25/25/1
364
+ f 13/13/1 27/27/1 18/18/1
365
+ f 13/13/1 28/28/1 27/27/1
366
+ f 13/13/1 29/29/1 28/28/1
367
+ f 13/13/1 30/30/1 29/29/1
368
+ f 21/21/1 22/22/1 30/30/1
369
+ f 25/25/1 26/26/1 30/30/1
370
+ f 26/26/1 29/29/1 30/30/1
371
+ f 20/20/1 30/30/1 31/31/1
372
+ f 31/31/1 6/6/1 20/20/1
373
+ f 20/20/1 32/32/1 30/30/1
374
+ f 32/32/1 21/21/1 30/30/1
375
+ f 22/22/1 33/33/1 30/30/1
376
+ f 33/33/1 25/25/1 30/30/1
377
+ f 28/28/1 29/29/1 34/34/1
378
+ f 35/35/1 34/34/1 24/24/1
379
+ f 35/35/1 28/28/1 34/34/1
380
+ f 24/24/1 18/18/1 35/35/1
381
+ f 36/36/1 8/8/1 16/16/1
382
+ f 16/16/1 14/14/1 36/36/1
383
+ f 14/14/1 37/37/1 36/36/1
384
+ f 37/37/1 38/38/1 36/36/1
385
+ f 36/36/1 9/9/1 8/8/1
386
+ f 38/38/1 37/37/1 11/11/1
387
+ f 11/11/1 10/10/1 38/38/1
388
+ f 31/40/2 30/39/2 39/41/2
389
+ f 39/41/2 40/42/2 31/40/2
390
+ f 31/44/3 40/43/3 41/45/3
391
+ f 41/45/3 6/46/3 31/44/3
392
+ f 41/45/3 42/47/3 6/46/3
393
+ f 44/49/4 43/48/4 45/50/4
394
+ f 45/50/4 46/51/4 44/49/4
395
+ f 45/50/4 47/52/4 46/51/4
396
+ f 7/46/3 48/47/3 49/53/3
397
+ f 49/53/3 1/54/3 7/46/3
398
+ f 7/55/2 6/40/2 42/56/2
399
+ f 42/56/2 48/57/2 7/55/2
400
+ f 43/59/2 44/58/2 50/41/2
401
+ f 50/41/2 51/60/2 43/59/2
402
+ f 41/62/5 40/61/5 39/63/5
403
+ f 39/63/5 44/64/5 41/62/5
404
+ f 39/63/5 50/65/5 44/64/5
405
+ f 46/67/6 42/66/6 41/68/6
406
+ f 41/68/6 44/69/6 46/67/6
407
+ f 39/71/7 30/70/7 13/39/7
408
+ f 13/39/7 50/72/7 39/71/7
409
+ f 13/39/7 51/73/7 50/72/7
410
+ f 13/39/7 52/60/7 51/73/7
411
+ f 13/75/6 15/74/6 53/76/6
412
+ f 53/76/6 54/77/6 13/75/6
413
+ f 54/77/6 52/78/6 13/75/6
414
+ f 54/77/6 55/79/6 52/78/6
415
+ f 3/80/2 1/55/2 49/57/2
416
+ f 49/57/2 56/81/2 3/80/2
417
+ f 3/54/3 56/53/3 57/66/3
418
+ f 57/66/3 8/82/3 3/54/3
419
+ f 45/84/5 43/83/5 51/65/5
420
+ f 45/84/5 51/65/5 52/85/5
421
+ f 45/84/5 52/85/5 55/86/5
422
+ f 55/86/5 58/87/5 45/84/5
423
+ f 16/82/3 59/68/3 53/88/3
424
+ f 53/88/3 15/75/3 16/82/3
425
+ f 59/90/2 16/89/2 8/80/2
426
+ f 8/80/2 57/81/2 59/90/2
427
+ f 57/81/2 60/91/2 59/90/2
428
+ f 49/93/5 48/92/5 42/62/5
429
+ f 49/93/5 42/62/5 47/94/5
430
+ f 49/93/5 47/94/5 61/95/5
431
+ f 49/93/5 61/95/5 57/96/5
432
+ f 57/96/5 56/97/5 49/93/5
433
+ f 42/62/5 46/98/5 47/94/5
434
+ f 61/100/8 47/99/8 45/101/8
435
+ f 45/101/8 62/102/8 61/100/8
436
+ f 45/101/8 58/103/8 62/102/8
437
+ f 53/105/5 59/104/5 60/96/5
438
+ f 60/96/5 54/86/5 53/105/5
439
+ f 60/96/5 62/106/5 54/86/5
440
+ f 60/42/7 57/56/7 61/107/7
441
+ f 61/107/7 62/58/7 60/42/7
442
+ f 54/88/3 62/69/3 58/108/3
443
+ f 58/108/3 55/78/3 54/88/3
444
+
445
+ usemtl metal
446
+
447
+ f 64/110/9 63/109/9 33/111/9
448
+ f 33/111/9 22/112/9 64/110/9
449
+ f 63/114/1 64/113/1 65/115/1
450
+ f 65/115/1 66/116/1 63/114/1
451
+ f 64/118/10 22/117/10 23/119/10
452
+ f 23/119/10 65/120/10 64/118/10
453
+ f 21/122/11 32/121/11 67/123/11
454
+ f 67/123/11 68/124/11 21/122/11
455
+ f 25/126/11 33/125/11 63/127/11
456
+ f 63/127/11 66/128/11 25/126/11
457
+ f 70/130/12 69/129/12 34/131/12
458
+ f 34/131/12 29/132/12 70/130/12
459
+ f 67/134/1 71/133/1 72/135/1
460
+ f 72/135/1 68/136/1 67/134/1
461
+ f 74/138/9 73/137/9 26/139/9
462
+ f 26/139/9 24/140/9 74/138/9
463
+ f 66/142/12 65/141/12 23/143/12
464
+ f 23/143/12 25/144/12 66/142/12
465
+ f 73/146/1 74/145/1 69/147/1
466
+ f 69/147/1 70/148/1 73/146/1
467
+ f 71/150/10 20/149/10 19/151/10
468
+ f 19/151/10 72/152/10 71/150/10
469
+ f 74/154/10 24/153/10 34/155/10
470
+ f 34/155/10 69/156/10 74/154/10
471
+ f 68/158/12 72/157/12 19/159/12
472
+ f 19/159/12 21/160/12 68/158/12
473
+ f 71/162/9 67/161/9 32/163/9
474
+ f 32/163/9 20/164/9 71/162/9
475
+ f 29/166/11 26/165/11 73/167/11
476
+ f 73/167/11 70/168/11 29/166/11
477
+ f 76/170/12 75/169/12 38/171/12
478
+ f 38/171/12 10/172/12 76/170/12
479
+ f 77/174/1 75/173/1 76/175/1
480
+ f 76/175/1 78/176/1 77/174/1
481
+ f 80/178/12 79/177/12 14/179/12
482
+ f 14/179/12 12/180/12 80/178/12
483
+ f 10/182/11 9/181/11 78/183/11
484
+ f 78/183/11 76/184/11 10/182/11
485
+ f 82/186/9 81/185/9 11/187/9
486
+ f 11/187/9 37/188/9 82/186/9
487
+ f 82/190/1 79/189/1 80/191/1
488
+ f 80/191/1 81/192/1 82/190/1
489
+ f 82/194/10 37/193/10 14/195/10
490
+ f 14/195/10 79/196/10 82/194/10
491
+ f 12/198/11 11/197/11 81/199/11
492
+ f 81/199/11 80/200/11 12/198/11
493
+ f 77/202/10 36/201/10 38/203/10
494
+ f 38/203/10 75/204/10 77/202/10
495
+ f 77/206/9 78/205/9 9/207/9
496
+ f 9/207/9 36/208/9 77/206/9
497
+ f 83/210/10 35/209/10 18/211/10
498
+ f 18/211/10 84/212/10 83/210/10
499
+ f 85/214/12 84/213/12 18/215/12
500
+ f 18/215/12 27/216/12 85/214/12
501
+ f 83/218/9 86/217/9 28/219/9
502
+ f 28/219/9 35/220/9 83/218/9
503
+ f 27/222/11 28/221/11 86/223/11
504
+ f 86/223/11 85/224/11 27/222/11
505
+ f 83/226/1 84/225/1 85/227/1
506
+ f 85/227/1 86/228/1 83/226/1
507
+ g loungeDesignSofaCorner
508
+
509
+
510
+
511
+
512
+ usemtl carpetBlue
513
+
514
+ f 2/2/1 1/1/1 3/3/1
515
+ f 3/3/1 4/4/1 2/2/1
516
+ f 2/2/1 5/5/1 1/1/1
517
+ f 1/1/1 5/5/1 6/6/1
518
+ f 6/6/1 7/7/1 1/1/1
519
+ f 4/4/1 3/3/1 8/8/1
520
+ f 4/4/1 8/8/1 9/9/1
521
+ f 4/4/1 9/9/1 10/10/1
522
+ f 4/4/1 10/10/1 11/11/1
523
+ f 4/4/1 11/11/1 12/12/1
524
+ f 13/13/1 4/4/1 12/12/1
525
+ f 13/13/1 12/12/1 14/14/1
526
+ f 15/15/1 13/13/1 14/14/1
527
+ f 14/14/1 16/16/1 15/15/1
528
+ f 13/13/1 17/17/1 4/4/1
529
+ f 13/13/1 5/5/1 17/17/1
530
+ f 13/13/1 18/18/1 5/5/1
531
+ f 18/18/1 6/6/1 5/5/1
532
+ f 18/18/1 19/19/1 6/6/1
533
+ f 19/19/1 20/20/1 6/6/1
534
+ f 18/18/1 21/21/1 19/19/1
535
+ f 18/18/1 22/22/1 21/21/1
536
+ f 18/18/1 23/23/1 22/22/1
537
+ f 18/18/1 24/24/1 23/23/1
538
+ f 25/25/1 23/23/1 24/24/1
539
+ f 24/24/1 26/26/1 25/25/1
540
+ f 13/13/1 27/27/1 18/18/1
541
+ f 13/13/1 28/28/1 27/27/1
542
+ f 13/13/1 29/29/1 28/28/1
543
+ f 13/13/1 30/30/1 29/29/1
544
+ f 21/21/1 22/22/1 30/30/1
545
+ f 25/25/1 26/26/1 30/30/1
546
+ f 26/26/1 29/29/1 30/30/1
547
+ f 20/20/1 30/30/1 31/31/1
548
+ f 31/31/1 6/6/1 20/20/1
549
+ f 20/20/1 32/32/1 30/30/1
550
+ f 32/32/1 21/21/1 30/30/1
551
+ f 22/22/1 33/33/1 30/30/1
552
+ f 33/33/1 25/25/1 30/30/1
553
+ f 28/28/1 29/29/1 34/34/1
554
+ f 35/35/1 34/34/1 24/24/1
555
+ f 35/35/1 28/28/1 34/34/1
556
+ f 24/24/1 18/18/1 35/35/1
557
+ f 36/36/1 8/8/1 16/16/1
558
+ f 16/16/1 14/14/1 36/36/1
559
+ f 14/14/1 37/37/1 36/36/1
560
+ f 37/37/1 38/38/1 36/36/1
561
+ f 36/36/1 9/9/1 8/8/1
562
+ f 38/38/1 37/37/1 11/11/1
563
+ f 11/11/1 10/10/1 38/38/1
564
+ f 31/40/2 30/39/2 39/41/2
565
+ f 39/41/2 40/42/2 31/40/2
566
+ f 31/44/3 40/43/3 41/45/3
567
+ f 41/45/3 6/46/3 31/44/3
568
+ f 41/45/3 42/47/3 6/46/3
569
+ f 44/49/4 43/48/4 45/50/4
570
+ f 45/50/4 46/51/4 44/49/4
571
+ f 45/50/4 47/52/4 46/51/4
572
+ f 7/46/3 48/47/3 49/53/3
573
+ f 49/53/3 1/54/3 7/46/3
574
+ f 7/55/2 6/40/2 42/56/2
575
+ f 42/56/2 48/57/2 7/55/2
576
+ f 43/59/2 44/58/2 50/41/2
577
+ f 50/41/2 51/60/2 43/59/2
578
+ f 41/62/5 40/61/5 39/63/5
579
+ f 39/63/5 44/64/5 41/62/5
580
+ f 39/63/5 50/65/5 44/64/5
581
+ f 46/67/6 42/66/6 41/68/6
582
+ f 41/68/6 44/69/6 46/67/6
583
+ f 39/71/7 30/70/7 13/39/7
584
+ f 13/39/7 50/72/7 39/71/7
585
+ f 13/39/7 51/73/7 50/72/7
586
+ f 13/39/7 52/60/7 51/73/7
587
+ f 13/75/6 15/74/6 53/76/6
588
+ f 53/76/6 54/77/6 13/75/6
589
+ f 54/77/6 52/78/6 13/75/6
590
+ f 54/77/6 55/79/6 52/78/6
591
+ f 3/80/2 1/55/2 49/57/2
592
+ f 49/57/2 56/81/2 3/80/2
593
+ f 3/54/3 56/53/3 57/66/3
594
+ f 57/66/3 8/82/3 3/54/3
595
+ f 45/84/5 43/83/5 51/65/5
596
+ f 45/84/5 51/65/5 52/85/5
597
+ f 45/84/5 52/85/5 55/86/5
598
+ f 55/86/5 58/87/5 45/84/5
599
+ f 16/82/3 59/68/3 53/88/3
600
+ f 53/88/3 15/75/3 16/82/3
601
+ f 59/90/2 16/89/2 8/80/2
602
+ f 8/80/2 57/81/2 59/90/2
603
+ f 57/81/2 60/91/2 59/90/2
604
+ f 49/93/5 48/92/5 42/62/5
605
+ f 49/93/5 42/62/5 47/94/5
606
+ f 49/93/5 47/94/5 61/95/5
607
+ f 49/93/5 61/95/5 57/96/5
608
+ f 57/96/5 56/97/5 49/93/5
609
+ f 42/62/5 46/98/5 47/94/5
610
+ f 61/100/8 47/99/8 45/101/8
611
+ f 45/101/8 62/102/8 61/100/8
612
+ f 45/101/8 58/103/8 62/102/8
613
+ f 53/105/5 59/104/5 60/96/5
614
+ f 60/96/5 54/86/5 53/105/5
615
+ f 60/96/5 62/106/5 54/86/5
616
+ f 60/42/7 57/56/7 61/107/7
617
+ f 61/107/7 62/58/7 60/42/7
618
+ f 54/88/3 62/69/3 58/108/3
619
+ f 58/108/3 55/78/3 54/88/3
620
+
621
+ usemtl metal
622
+
623
+ f 64/110/9 63/109/9 33/111/9
624
+ f 33/111/9 22/112/9 64/110/9
625
+ f 63/114/1 64/113/1 65/115/1
626
+ f 65/115/1 66/116/1 63/114/1
627
+ f 64/118/10 22/117/10 23/119/10
628
+ f 23/119/10 65/120/10 64/118/10
629
+ f 21/122/11 32/121/11 67/123/11
630
+ f 67/123/11 68/124/11 21/122/11
631
+ f 25/126/11 33/125/11 63/127/11
632
+ f 63/127/11 66/128/11 25/126/11
633
+ f 70/130/12 69/129/12 34/131/12
634
+ f 34/131/12 29/132/12 70/130/12
635
+ f 67/134/1 71/133/1 72/135/1
636
+ f 72/135/1 68/136/1 67/134/1
637
+ f 74/138/9 73/137/9 26/139/9
638
+ f 26/139/9 24/140/9 74/138/9
639
+ f 66/142/12 65/141/12 23/143/12
640
+ f 23/143/12 25/144/12 66/142/12
641
+ f 73/146/1 74/145/1 69/147/1
642
+ f 69/147/1 70/148/1 73/146/1
643
+ f 71/150/10 20/149/10 19/151/10
644
+ f 19/151/10 72/152/10 71/150/10
645
+ f 74/154/10 24/153/10 34/155/10
646
+ f 34/155/10 69/156/10 74/154/10
647
+ f 68/158/12 72/157/12 19/159/12
648
+ f 19/159/12 21/160/12 68/158/12
649
+ f 71/162/9 67/161/9 32/163/9
650
+ f 32/163/9 20/164/9 71/162/9
651
+ f 29/166/11 26/165/11 73/167/11
652
+ f 73/167/11 70/168/11 29/166/11
653
+ f 76/170/12 75/169/12 38/171/12
654
+ f 38/171/12 10/172/12 76/170/12
655
+ f 77/174/1 75/173/1 76/175/1
656
+ f 76/175/1 78/176/1 77/174/1
657
+ f 80/178/12 79/177/12 14/179/12
658
+ f 14/179/12 12/180/12 80/178/12
659
+ f 10/182/11 9/181/11 78/183/11
660
+ f 78/183/11 76/184/11 10/182/11
661
+ f 82/186/9 81/185/9 11/187/9
662
+ f 11/187/9 37/188/9 82/186/9
663
+ f 82/190/1 79/189/1 80/191/1
664
+ f 80/191/1 81/192/1 82/190/1
665
+ f 82/194/10 37/193/10 14/195/10
666
+ f 14/195/10 79/196/10 82/194/10
667
+ f 12/198/11 11/197/11 81/199/11
668
+ f 81/199/11 80/200/11 12/198/11
669
+ f 77/202/10 36/201/10 38/203/10
670
+ f 38/203/10 75/204/10 77/202/10
671
+ f 77/206/9 78/205/9 9/207/9
672
+ f 9/207/9 36/208/9 77/206/9
673
+ f 83/210/10 35/209/10 18/211/10
674
+ f 18/211/10 84/212/10 83/210/10
675
+ f 85/214/12 84/213/12 18/215/12
676
+ f 18/215/12 27/216/12 85/214/12
677
+ f 83/218/9 86/217/9 28/219/9
678
+ f 28/219/9 35/220/9 83/218/9
679
+ f 27/222/11 28/221/11 86/223/11
680
+ f 86/223/11 85/224/11 27/222/11
681
+ f 83/226/1 84/225/1 85/227/1
682
+ f 85/227/1 86/228/1 83/226/1
683
+ g Group
684
+
685
+ v -0.8998486 0 1.289849
686
+ v -0.8998486 0 1.324829
687
+ v -0.9348286 0 1.289849
688
+ v -0.9348286 0 1.324829
689
+
690
+ vn 0.9889073 -0.1485339 -7.309142E-18
691
+ vn -0.9889073 -0.1485339 -7.309142E-18
692
+ vn -3.672265E-18 -0.1485339 -0.9889073
693
+ vn -3.672265E-18 -0.1485339 0.9889073
694
+ vn -2.472342E-17 -1 -4.920858E-17
695
+
696
+ vt 0 -0.2923895
697
+ vt 0.2956693 1.698195
698
+ vt 1.968504 -0.2923895
699
+ vt 1.672835 1.698195
700
+ vt 0 -9.002843E-15
701
+ vt -1.968504 -9.002843E-15
702
+ vt -0.2956693 1.990585
703
+ vt -1.672835 1.990585
704
+ vt 1.968504 -9.004482E-15
705
+ vt 1.672835 1.990585
706
+ vt 0.2956693 1.990585
707
+ vt 1.569451E-18 -0.2923895
708
+ vt -1.968504 -0.2923895
709
+ vt -0.2956693 1.698195
710
+ vt -1.672835 1.698195
711
+ vt 0.2956693 0.2956693
712
+ vt 0.2956693 1.672835
713
+ vt 1.672835 0.2956693
714
+ vt 1.672835 1.672835
715
+
716
+ usemtl metal
717
+
718
+ f 87/230/13 2/229/13 4/231/13
719
+ f 4/231/13 88/232/13 87/230/13
720
+ f 17/234/14 5/233/14 89/235/14
721
+ f 89/235/14 90/236/14 17/234/14
722
+ f 5/233/15 2/237/15 87/238/15
723
+ f 87/238/15 89/239/15 5/233/15
724
+ f 4/241/16 17/240/16 90/242/16
725
+ f 90/242/16 88/243/16 4/241/16
726
+ f 90/245/17 89/244/17 87/246/17
727
+ f 87/246/17 88/247/17 90/245/17
modelos_3D/loungeSofa.mtl ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl carpet
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.9433962 0.367176 0.3426486
6
+ Ks 0.330000 0.330000 0.330000
7
+
8
+ newmtl wood
9
+ Ka 0.000000 0.000000 0.000000
10
+ Kd 0.8962264 0.6015712 0.3931559
11
+ Ks 0.330000 0.330000 0.330000
12
+
modelos_3D/loungeSofa.obj ADDED
@@ -0,0 +1,498 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib loungeSofa.mtl
4
+
5
+ g loungeSofa
6
+
7
+ v -0.8898285 0.33 0.02
8
+ v -0.8898285 0.23 0.02
9
+ v -0.8898285 0.37 0.06
10
+ v -0.8898285 0.23 0.3198286
11
+ v -0.8898285 0.37 0.3198286
12
+ v -0.05508572 0.42 0.3198286
13
+ v -0.05508572 0.37 0.3198286
14
+ v -0.05508572 0.42 0.41
15
+ v -0.05508572 0.37 0.41
16
+ v -0.9249142 0.42 0.3198286
17
+ v -0.8849143 0.46 0.3198286
18
+ v -0.9249142 0.42 0.41
19
+ v -0.8849143 0.46 0.41
20
+ v -0.98 0.37 0.06
21
+ v -0.9249142 0.37 0.3198286
22
+ v -0.9249142 0.37 0.41
23
+ v -0.98 0.37 0.41
24
+ v -0.98 0.33 0.02
25
+ v -0.09508572 0.46 0.3198286
26
+ v -0.09508572 0.46 0.41
27
+ v -0.98 0.05 0.02
28
+ v -0.98 0.05 0.06
29
+ v -0.98 0.05 0.37
30
+ v -0.98 0.05 0.41
31
+ v 0 0.33 0.02
32
+ v 0 0.05 0.02
33
+ v 0 0.37 0.06
34
+ v 0 0.05 0.06
35
+ v 0 0.37 0.41
36
+ v -9.023893E-16 0.05 0.37
37
+ v -9.023893E-16 0.05 0.41
38
+ v -0.04 0.05 0.41
39
+ v -0.94 0.05 0.41
40
+ v -0.04 0.05 0.37
41
+ v -0.94 0.05 0.06
42
+ v -0.94 0.05 0.37
43
+ v -0.94 0.05 0.02
44
+ v -0.04 0.05 0.02
45
+ v -0.04 0.05 0.06
46
+ v -0.09017144 0.23 0
47
+ v -0.09017144 0.23 0.02
48
+ v -0.8898285 0.23 0
49
+ v -0.09017144 0.23 0.3198286
50
+ v -0.8898285 0.1448143 0
51
+ v -0.09017144 0.1448143 0
52
+ v -0.09017144 0.1448143 0.02
53
+ v -0.8898285 0.1448143 0.02
54
+ v -0.09017144 0.33 0.02
55
+ v -0.09017144 0.37 0.06
56
+ v -0.09017144 0.37 0.3198286
57
+ v -0.94 9.023893E-17 0.41
58
+ v -0.94 9.023893E-17 0.37
59
+ v -0.98 9.023893E-17 0.41
60
+ v -0.98 9.023893E-17 0.37
61
+ v -0.98 0 0.02
62
+ v -0.94 0 0.02
63
+ v -0.04 9.023893E-17 0.37
64
+ v -9.023893E-16 9.023893E-17 0.37
65
+ v -9.023893E-16 9.023893E-17 0.41
66
+ v 0 0 0.06
67
+ v 0 0 0.02
68
+ v -0.04 0 0.06
69
+ v -0.04 0 0.02
70
+ v -0.94 0 0.06
71
+ v -0.98 0 0.06
72
+ v -0.04 9.023893E-17 0.41
73
+
74
+ vn 1 0 0
75
+ vn -0.7071068 0.7071068 0
76
+ vn 0 1 0
77
+ vn 0 0.7071068 -0.7071068
78
+ vn -1 0 0
79
+ vn 0 0 1
80
+ vn 0 -1 0
81
+ vn 0 0 -1
82
+ vn 0.7071068 0.7071068 0
83
+
84
+ vt -0.7874016 12.99213
85
+ vt -0.7874016 9.055119
86
+ vt -2.362205 14.56693
87
+ vt -12.59168 9.055119
88
+ vt -12.59168 14.56693
89
+ vt -12.59168 16.53543
90
+ vt -16.14173 16.53543
91
+ vt -16.14173 14.56693
92
+ vt 12.59168 -14.05623
93
+ vt 12.59168 -11.82912
94
+ vt 16.14173 -14.05623
95
+ vt 16.14173 -11.82912
96
+ vt 35.03262 2.362205
97
+ vt 35.03262 12.59168
98
+ vt 38.58268 2.362205
99
+ vt 36.41395 12.59168
100
+ vt 36.41395 16.14173
101
+ vt 38.58268 16.14173
102
+ vt 38.58268 9.743597
103
+ vt 35.03262 9.743597
104
+ vt 38.58268 11.97071
105
+ vt 35.03262 11.97071
106
+ vt 3.743532 12.59168
107
+ vt 3.743532 16.14173
108
+ vt 34.83915 12.59168
109
+ vt 34.83915 16.14173
110
+ vt 0.7874016 1.968504
111
+ vt 0.7874016 12.99213
112
+ vt 2.362205 1.968504
113
+ vt 2.362205 14.56693
114
+ vt 14.56693 1.968504
115
+ vt 16.14173 14.56693
116
+ vt 16.14173 1.968504
117
+ vt -0.7874016 1.968504
118
+ vt -2.362205 1.968504
119
+ vt -14.56693 1.968504
120
+ vt -16.14173 1.968504
121
+ vt -3.787312E-14 1.968504
122
+ vt -1.574803 1.968504
123
+ vt -2.345981E-15 14.56693
124
+ vt -37.00787 1.968504
125
+ vt -2.168729 14.56693
126
+ vt -38.58268 14.56693
127
+ vt -38.58268 1.968504
128
+ vt -36.41395 14.56693
129
+ vt -2.168729 16.53543
130
+ vt -36.41395 16.53543
131
+ vt -3.743532 18.11024
132
+ vt -34.83915 18.11024
133
+ vt -1.574803 16.14173
134
+ vt -1.574803 14.56693
135
+ vt -37.00787 16.14173
136
+ vt -37.00787 2.362205
137
+ vt -37.00787 14.56693
138
+ vt -38.58268 2.362205
139
+ vt -37.00787 0.7874016
140
+ vt -1.574803 0.7874016
141
+ vt -1.574803 2.362205
142
+ vt -3.55391E-14 14.56693
143
+ vt -1.196101E-17 2.362205
144
+ vt 3.550057 0
145
+ vt 3.550057 0.7874016
146
+ vt 35.03262 0
147
+ vt 3.550057 12.59168
148
+ vt 35.03262 0.7874016
149
+ vt 35.03262 5.701352
150
+ vt 3.550057 5.701352
151
+ vt 35.03262 9.055119
152
+ vt 3.550057 9.055119
153
+ vt -3.550057 0.7874016
154
+ vt -3.550057 0
155
+ vt -35.03262 0.7874016
156
+ vt -35.03262 0
157
+ vt 0 5.701352
158
+ vt 0 9.055119
159
+ vt 0.7874016 5.701352
160
+ vt 0.7874016 9.055119
161
+ vt -0.7874016 5.701352
162
+ vt 38.58268 1.968504
163
+ vt 37.00787 1.968504
164
+ vt 38.58268 12.99213
165
+ vt 35.03262 12.99213
166
+ vt 0 1.968504
167
+ vt 1.574803 1.968504
168
+ vt 0 12.99213
169
+ vt 3.550057 12.99213
170
+ vt -9.595704E-15 2.362205
171
+ vt -9.595704E-15 16.14173
172
+ vt 3.550057 2.362205
173
+ vt 2.168729 12.59168
174
+ vt 2.168729 16.14173
175
+ vt 3.550057 9.743597
176
+ vt 0 9.743597
177
+ vt 3.550057 11.97071
178
+ vt 0 11.97071
179
+ vt 12.59168 9.055119
180
+ vt 12.59168 14.56693
181
+ vt -12.59168 15.45295
182
+ vt -12.59168 13.22584
183
+ vt -16.14173 15.45295
184
+ vt -16.14173 13.22584
185
+ vt 36.41395 14.56693
186
+ vt 35.03262 14.56693
187
+ vt 36.41395 16.53543
188
+ vt 3.550057 14.56693
189
+ vt 2.168729 14.56693
190
+ vt 2.168729 16.53543
191
+ vt 34.83915 18.11024
192
+ vt 3.743532 18.11024
193
+ vt 12.59168 16.53543
194
+ vt 16.14173 16.53543
195
+ vt -38.58268 16.14173
196
+ vt -37.00787 1.200817E-13
197
+ vt -38.58268 1.200817E-13
198
+ vt 14.56693 -2.7498E-13
199
+ vt 16.14173 -2.7498E-13
200
+ vt 38.58268 3.552714E-15
201
+ vt 37.00787 3.552714E-15
202
+ vt -14.56693 3.552714E-15
203
+ vt -16.14173 3.552714E-15
204
+ vt 38.58268 0
205
+ vt 37.00787 0
206
+ vt 1.574803 3.552714E-15
207
+ vt 3.552714E-14 3.552714E-15
208
+ vt 3.552714E-14 1.968504
209
+ vt 0 2.362205
210
+ vt 0 0.7874016
211
+ vt -0.7874016 0
212
+ vt -2.362205 0
213
+ vt -37.00787 0
214
+ vt -38.58268 0
215
+ vt 0 0
216
+ vt -1.574803 0
217
+ vt 0.7874016 0
218
+ vt 2.362205 0
219
+ vt -38.58268 0.7874016
220
+ vt -3.552714E-14 3.552714E-15
221
+ vt -1.574803 3.552714E-15
222
+ vt 14.56693 3.552714E-15
223
+ vt 16.14173 3.552714E-15
224
+ vt -3.552714E-14 16.14173
225
+ vt -3.552714E-14 14.56693
226
+ vt 1.574803 0
227
+
228
+ usemtl carpet
229
+
230
+ f 2/2/1 1/1/1 3/3/1
231
+ f 3/3/1 4/4/1 2/2/1
232
+ f 3/3/1 5/5/1 4/4/1
233
+ f 7/5/1 6/6/1 8/7/1
234
+ f 8/7/1 9/8/1 7/5/1
235
+ f 11/10/2 10/9/2 12/11/2
236
+ f 12/11/2 13/12/2 11/10/2
237
+ f 5/14/3 3/13/3 14/15/3
238
+ f 14/15/3 15/16/3 5/14/3
239
+ f 14/15/3 16/17/3 15/16/3
240
+ f 14/15/3 17/18/3 16/17/3
241
+ f 1/20/4 18/19/4 14/21/4
242
+ f 14/21/4 3/22/4 1/20/4
243
+ f 20/24/3 19/23/3 11/25/3
244
+ f 11/25/3 13/26/3 20/24/3
245
+ f 18/28/5 21/27/5 22/29/5
246
+ f 22/29/5 14/30/5 18/28/5
247
+ f 22/29/5 23/31/5 14/30/5
248
+ f 23/31/5 17/32/5 14/30/5
249
+ f 23/31/5 24/33/5 17/32/5
250
+ f 26/34/1 25/1/1 27/3/1
251
+ f 27/3/1 28/35/1 26/34/1
252
+ f 27/3/1 29/8/1 28/35/1
253
+ f 29/8/1 30/36/1 28/35/1
254
+ f 29/8/1 31/37/1 30/36/1
255
+ f 32/39/6 31/38/6 29/40/6
256
+ f 29/40/6 33/41/6 32/39/6
257
+ f 29/40/6 9/42/6 33/41/6
258
+ f 33/41/6 9/42/6 17/43/6
259
+ f 17/43/6 24/44/6 33/41/6
260
+ f 9/42/6 16/45/6 17/43/6
261
+ f 16/45/6 9/42/6 8/46/6
262
+ f 8/46/6 12/47/6 16/45/6
263
+ f 8/46/6 20/48/6 12/47/6
264
+ f 20/48/6 13/49/6 12/47/6
265
+ f 34/51/7 32/50/7 33/52/7
266
+ f 33/52/7 35/53/7 34/51/7
267
+ f 33/52/7 36/54/7 35/53/7
268
+ f 36/54/7 22/55/7 35/53/7
269
+ f 36/54/7 23/43/7 22/55/7
270
+ f 34/51/7 35/53/7 37/56/7
271
+ f 34/51/7 37/56/7 38/57/7
272
+ f 34/51/7 38/57/7 39/58/7
273
+ f 30/59/7 34/51/7 39/58/7
274
+ f 39/58/7 28/60/7 30/59/7
275
+ f 41/62/3 40/61/3 42/63/3
276
+ f 42/63/3 43/64/3 41/62/3
277
+ f 42/63/3 4/14/3 43/64/3
278
+ f 42/63/3 2/65/3 4/14/3
279
+ f 45/67/8 44/66/8 42/68/8
280
+ f 42/68/8 40/69/8 45/67/8
281
+ f 45/71/7 46/70/7 47/72/7
282
+ f 47/72/7 44/73/7 45/71/7
283
+ f 42/75/5 44/74/5 47/76/5
284
+ f 47/76/5 2/77/5 42/75/5
285
+ f 45/74/1 40/75/1 41/2/1
286
+ f 41/2/1 46/78/1 45/74/1
287
+ f 37/80/8 21/79/8 18/81/8
288
+ f 18/81/8 47/66/8 37/80/8
289
+ f 18/81/8 2/68/8 47/66/8
290
+ f 18/81/8 1/82/8 2/68/8
291
+ f 37/80/8 47/66/8 46/67/8
292
+ f 37/80/8 46/67/8 26/83/8
293
+ f 26/83/8 38/84/8 37/80/8
294
+ f 46/67/8 25/85/8 26/83/8
295
+ f 46/67/8 41/69/8 25/85/8
296
+ f 41/69/8 48/86/8 25/85/8
297
+ f 29/88/3 27/87/3 49/89/3
298
+ f 49/89/3 7/90/3 29/88/3
299
+ f 49/89/3 50/64/3 7/90/3
300
+ f 29/88/3 7/90/3 9/91/3
301
+ f 25/93/4 48/92/4 49/94/4
302
+ f 49/94/4 27/95/4 25/93/4
303
+ f 48/28/5 41/77/5 43/96/5
304
+ f 43/96/5 49/30/5 48/28/5
305
+ f 43/96/5 50/97/5 49/30/5
306
+ f 6/99/9 19/98/9 20/100/9
307
+ f 20/100/9 8/101/9 6/99/9
308
+ f 5/103/8 15/102/8 10/104/8
309
+ f 10/104/8 50/105/8 5/103/8
310
+ f 10/104/8 7/106/8 50/105/8
311
+ f 10/104/8 6/107/8 7/106/8
312
+ f 10/104/8 11/108/8 6/107/8
313
+ f 11/108/8 19/109/8 6/107/8
314
+ f 5/103/8 50/105/8 43/69/8
315
+ f 43/69/8 4/68/8 5/103/8
316
+ f 10/110/5 15/97/5 16/32/5
317
+ f 16/32/5 12/111/5 10/110/5
318
+
319
+ usemtl wood
320
+
321
+ f 52/54/7 51/52/7 53/112/7
322
+ f 53/112/7 54/43/7 52/54/7
323
+ f 53/114/6 51/113/6 33/41/6
324
+ f 33/41/6 24/44/6 53/114/6
325
+ f 23/31/5 54/115/5 53/116/5
326
+ f 53/116/5 24/33/5 23/31/5
327
+ f 52/118/8 54/117/8 23/79/8
328
+ f 23/79/8 36/80/8 52/118/8
329
+ f 52/119/1 36/36/1 33/37/1
330
+ f 33/37/1 51/120/1 52/119/1
331
+ f 56/122/8 55/121/8 21/79/8
332
+ f 21/79/8 37/80/8 56/122/8
333
+ f 58/124/8 57/123/8 34/84/8
334
+ f 34/84/8 30/125/8 58/124/8
335
+ f 58/119/1 30/36/1 31/37/1
336
+ f 31/37/1 59/120/1 58/119/1
337
+ f 61/127/7 60/126/7 62/58/7
338
+ f 62/58/7 63/57/7 61/127/7
339
+ f 56/128/1 37/34/1 35/35/1
340
+ f 35/35/1 64/129/1 56/128/1
341
+ f 61/128/1 26/34/1 28/35/1
342
+ f 28/35/1 60/129/1 61/128/1
343
+ f 65/131/6 64/130/6 35/41/6
344
+ f 35/41/6 22/44/6 65/131/6
345
+ f 62/133/6 60/132/6 28/83/6
346
+ f 28/83/6 39/39/6 62/133/6
347
+ f 38/27/5 63/134/5 62/135/5
348
+ f 62/135/5 39/29/5 38/27/5
349
+ f 21/27/5 55/134/5 65/135/5
350
+ f 65/135/5 22/29/5 21/27/5
351
+ f 56/56/7 64/53/7 65/55/7
352
+ f 65/55/7 55/136/7 56/56/7
353
+ f 66/138/6 59/137/6 31/38/6
354
+ f 31/38/6 32/39/6 66/138/6
355
+ f 34/31/5 57/139/5 66/140/5
356
+ f 66/140/5 32/33/5 34/31/5
357
+ f 58/142/7 59/141/7 66/50/7
358
+ f 66/50/7 57/51/7 58/142/7
359
+ f 61/132/8 63/143/8 38/84/8
360
+ f 38/84/8 26/83/8 61/132/8
361
+ g loungeSofa
362
+
363
+
364
+
365
+
366
+ usemtl carpet
367
+
368
+ f 2/2/1 1/1/1 3/3/1
369
+ f 3/3/1 4/4/1 2/2/1
370
+ f 3/3/1 5/5/1 4/4/1
371
+ f 7/5/1 6/6/1 8/7/1
372
+ f 8/7/1 9/8/1 7/5/1
373
+ f 11/10/2 10/9/2 12/11/2
374
+ f 12/11/2 13/12/2 11/10/2
375
+ f 5/14/3 3/13/3 14/15/3
376
+ f 14/15/3 15/16/3 5/14/3
377
+ f 14/15/3 16/17/3 15/16/3
378
+ f 14/15/3 17/18/3 16/17/3
379
+ f 1/20/4 18/19/4 14/21/4
380
+ f 14/21/4 3/22/4 1/20/4
381
+ f 20/24/3 19/23/3 11/25/3
382
+ f 11/25/3 13/26/3 20/24/3
383
+ f 18/28/5 21/27/5 22/29/5
384
+ f 22/29/5 14/30/5 18/28/5
385
+ f 22/29/5 23/31/5 14/30/5
386
+ f 23/31/5 17/32/5 14/30/5
387
+ f 23/31/5 24/33/5 17/32/5
388
+ f 26/34/1 25/1/1 27/3/1
389
+ f 27/3/1 28/35/1 26/34/1
390
+ f 27/3/1 29/8/1 28/35/1
391
+ f 29/8/1 30/36/1 28/35/1
392
+ f 29/8/1 31/37/1 30/36/1
393
+ f 32/39/6 31/38/6 29/40/6
394
+ f 29/40/6 33/41/6 32/39/6
395
+ f 29/40/6 9/42/6 33/41/6
396
+ f 33/41/6 9/42/6 17/43/6
397
+ f 17/43/6 24/44/6 33/41/6
398
+ f 9/42/6 16/45/6 17/43/6
399
+ f 16/45/6 9/42/6 8/46/6
400
+ f 8/46/6 12/47/6 16/45/6
401
+ f 8/46/6 20/48/6 12/47/6
402
+ f 20/48/6 13/49/6 12/47/6
403
+ f 34/51/7 32/50/7 33/52/7
404
+ f 33/52/7 35/53/7 34/51/7
405
+ f 33/52/7 36/54/7 35/53/7
406
+ f 36/54/7 22/55/7 35/53/7
407
+ f 36/54/7 23/43/7 22/55/7
408
+ f 34/51/7 35/53/7 37/56/7
409
+ f 34/51/7 37/56/7 38/57/7
410
+ f 34/51/7 38/57/7 39/58/7
411
+ f 30/59/7 34/51/7 39/58/7
412
+ f 39/58/7 28/60/7 30/59/7
413
+ f 41/62/3 40/61/3 42/63/3
414
+ f 42/63/3 43/64/3 41/62/3
415
+ f 42/63/3 4/14/3 43/64/3
416
+ f 42/63/3 2/65/3 4/14/3
417
+ f 45/67/8 44/66/8 42/68/8
418
+ f 42/68/8 40/69/8 45/67/8
419
+ f 45/71/7 46/70/7 47/72/7
420
+ f 47/72/7 44/73/7 45/71/7
421
+ f 42/75/5 44/74/5 47/76/5
422
+ f 47/76/5 2/77/5 42/75/5
423
+ f 45/74/1 40/75/1 41/2/1
424
+ f 41/2/1 46/78/1 45/74/1
425
+ f 37/80/8 21/79/8 18/81/8
426
+ f 18/81/8 47/66/8 37/80/8
427
+ f 18/81/8 2/68/8 47/66/8
428
+ f 18/81/8 1/82/8 2/68/8
429
+ f 37/80/8 47/66/8 46/67/8
430
+ f 37/80/8 46/67/8 26/83/8
431
+ f 26/83/8 38/84/8 37/80/8
432
+ f 46/67/8 25/85/8 26/83/8
433
+ f 46/67/8 41/69/8 25/85/8
434
+ f 41/69/8 48/86/8 25/85/8
435
+ f 29/88/3 27/87/3 49/89/3
436
+ f 49/89/3 7/90/3 29/88/3
437
+ f 49/89/3 50/64/3 7/90/3
438
+ f 29/88/3 7/90/3 9/91/3
439
+ f 25/93/4 48/92/4 49/94/4
440
+ f 49/94/4 27/95/4 25/93/4
441
+ f 48/28/5 41/77/5 43/96/5
442
+ f 43/96/5 49/30/5 48/28/5
443
+ f 43/96/5 50/97/5 49/30/5
444
+ f 6/99/9 19/98/9 20/100/9
445
+ f 20/100/9 8/101/9 6/99/9
446
+ f 5/103/8 15/102/8 10/104/8
447
+ f 10/104/8 50/105/8 5/103/8
448
+ f 10/104/8 7/106/8 50/105/8
449
+ f 10/104/8 6/107/8 7/106/8
450
+ f 10/104/8 11/108/8 6/107/8
451
+ f 11/108/8 19/109/8 6/107/8
452
+ f 5/103/8 50/105/8 43/69/8
453
+ f 43/69/8 4/68/8 5/103/8
454
+ f 10/110/5 15/97/5 16/32/5
455
+ f 16/32/5 12/111/5 10/110/5
456
+
457
+ usemtl wood
458
+
459
+ f 52/54/7 51/52/7 53/112/7
460
+ f 53/112/7 54/43/7 52/54/7
461
+ f 53/114/6 51/113/6 33/41/6
462
+ f 33/41/6 24/44/6 53/114/6
463
+ f 23/31/5 54/115/5 53/116/5
464
+ f 53/116/5 24/33/5 23/31/5
465
+ f 52/118/8 54/117/8 23/79/8
466
+ f 23/79/8 36/80/8 52/118/8
467
+ f 52/119/1 36/36/1 33/37/1
468
+ f 33/37/1 51/120/1 52/119/1
469
+ f 56/122/8 55/121/8 21/79/8
470
+ f 21/79/8 37/80/8 56/122/8
471
+ f 58/124/8 57/123/8 34/84/8
472
+ f 34/84/8 30/125/8 58/124/8
473
+ f 58/119/1 30/36/1 31/37/1
474
+ f 31/37/1 59/120/1 58/119/1
475
+ f 61/127/7 60/126/7 62/58/7
476
+ f 62/58/7 63/57/7 61/127/7
477
+ f 56/128/1 37/34/1 35/35/1
478
+ f 35/35/1 64/129/1 56/128/1
479
+ f 61/128/1 26/34/1 28/35/1
480
+ f 28/35/1 60/129/1 61/128/1
481
+ f 65/131/6 64/130/6 35/41/6
482
+ f 35/41/6 22/44/6 65/131/6
483
+ f 62/133/6 60/132/6 28/83/6
484
+ f 28/83/6 39/39/6 62/133/6
485
+ f 38/27/5 63/134/5 62/135/5
486
+ f 62/135/5 39/29/5 38/27/5
487
+ f 21/27/5 55/134/5 65/135/5
488
+ f 65/135/5 22/29/5 21/27/5
489
+ f 56/56/7 64/53/7 65/55/7
490
+ f 65/55/7 55/136/7 56/56/7
491
+ f 66/138/6 59/137/6 31/38/6
492
+ f 31/38/6 32/39/6 66/138/6
493
+ f 34/31/5 57/139/5 66/140/5
494
+ f 66/140/5 32/33/5 34/31/5
495
+ f 58/142/7 59/141/7 66/50/7
496
+ f 66/50/7 57/51/7 58/142/7
497
+ f 61/132/8 63/143/8 38/84/8
498
+ f 38/84/8 26/83/8 61/132/8
modelos_3D/tableCoffee.mtl ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl wood
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.8962264 0.6015712 0.3931559
6
+ Ks 0.330000 0.330000 0.330000
7
+
modelos_3D/tableCoffee.obj ADDED
@@ -0,0 +1,446 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib tableCoffee.mtl
4
+
5
+ g tableCoffee
6
+
7
+ v -0.16 0.07 -0.06
8
+ v -0.2 0.07 -0.06
9
+ v -0.16 0.18 -0.06
10
+ v -0.2 0.18 -0.06
11
+ v 0.4209961 0.07 -0.06
12
+ v -0.16 0.05 -0.06
13
+ v 0.4209961 0.05 -0.06
14
+ v -0.16 7.219114E-16 -0.06
15
+ v -0.2 7.219114E-16 -0.06
16
+ v -0.2 0.05 -0.06
17
+ v 0.4609961 0.05 -0.06
18
+ v 0.4209961 3.609557E-16 -0.06
19
+ v 0.4609961 3.609557E-16 -0.06
20
+ v 0.4609961 0.07 -0.06
21
+ v 0.4609961 0.18 -0.06
22
+ v 0.4209961 0.18 -0.06
23
+ v -0.16 0.05 0.26
24
+ v -0.2 0.05 0.26
25
+ v 0.4209961 0.05 0.26
26
+ v 0.4209961 0.05 0.3
27
+ v -0.16 0.05 0.3
28
+ v 0.4209961 0.05 -0.1
29
+ v -0.16 0.05 -0.1
30
+ v 0.4609961 0.05 0.26
31
+ v 0.4209961 0 0.26
32
+ v 0.4609961 0 0.26
33
+ v -0.16 0.07 0.26
34
+ v 0.4209961 0.07 0.26
35
+ v 0.4609961 0.07 0.26
36
+ v 0.4209961 0.18 0.26
37
+ v 0.4609961 0.18 0.26
38
+ v -0.16 -3.609557E-16 0.26
39
+ v -0.2 -3.609557E-16 0.26
40
+ v -0.2 0.07 0.26
41
+ v -0.2 0.18 0.26
42
+ v -0.16 0.18 0.26
43
+ v -0.16 0 -0.1
44
+ v -0.2 0 -0.1
45
+ v 0.4609961 0.23 -0.1
46
+ v 0.4609961 0.23 0.3
47
+ v -0.2 0.23 -0.1
48
+ v -0.2 0.23 0.3
49
+ v -0.2 0 0.3
50
+ v 0.4609961 0 -0.1
51
+ v 0.4609961 0 0.3
52
+ v -0.16 0.18 -0.1
53
+ v -0.16 0.18 0.3
54
+ v 0.4209961 0.18 -0.1
55
+ v 0.4209961 0.18 0.3
56
+ v -0.16 0.07 -0.1
57
+ v 0.4209961 0.07 -0.1
58
+ v 0.4209961 0 -0.1
59
+ v 0.4209961 0 0.3
60
+ v 0.4209961 0.07 0.3
61
+ v -0.16 0.07 0.3
62
+ v -0.16 0 0.3
63
+
64
+ vn 0 0 1
65
+ vn 0 -1 0
66
+ vn 0 0 -1
67
+ vn 0 1 0
68
+ vn -1 0 0
69
+ vn 1 0 0
70
+
71
+ vt -6.299212 2.755906
72
+ vt -7.874016 2.755906
73
+ vt -6.299212 7.086614
74
+ vt -7.874016 7.086614
75
+ vt 16.57465 2.755906
76
+ vt -6.299212 1.968504
77
+ vt 16.57465 1.968504
78
+ vt -6.299212 1.136868E-14
79
+ vt -7.874016 1.136868E-14
80
+ vt -7.874016 1.968504
81
+ vt 18.14945 1.968504
82
+ vt 16.57465 5.684342E-15
83
+ vt 18.14945 5.684342E-15
84
+ vt 18.14945 2.755906
85
+ vt 18.14945 7.086614
86
+ vt 16.57465 7.086614
87
+ vt -6.299212 10.23622
88
+ vt -6.299212 -2.362205
89
+ vt -7.874016 10.23622
90
+ vt -7.874016 -2.362205
91
+ vt 16.57465 10.23622
92
+ vt 16.57465 11.81102
93
+ vt -6.299212 11.81102
94
+ vt 16.57465 -2.362205
95
+ vt 16.57465 -3.937008
96
+ vt -6.299212 -3.937008
97
+ vt 18.14945 -2.362205
98
+ vt 18.14945 10.23622
99
+ vt -16.57465 0
100
+ vt -18.14945 0
101
+ vt -16.57465 1.968504
102
+ vt -18.14945 1.968504
103
+ vt 6.299212 1.968504
104
+ vt 6.299212 2.755906
105
+ vt -16.57465 2.755906
106
+ vt -18.14945 2.755906
107
+ vt -16.57465 7.086614
108
+ vt -18.14945 7.086614
109
+ vt 7.874016 1.968504
110
+ vt 6.299212 2.273737E-14
111
+ vt 7.874016 2.273737E-14
112
+ vt 7.874016 2.755906
113
+ vt 7.874016 7.086614
114
+ vt 6.299212 7.086614
115
+ vt -7.874016 -3.937008
116
+ vt -18.14945 -3.937008
117
+ vt -18.14945 11.81102
118
+ vt 7.874016 -3.937008
119
+ vt 7.874016 11.81102
120
+ vt -2.362205 7.086614
121
+ vt -2.362205 2.755906
122
+ vt -2.362205 3.243747E-14
123
+ vt -2.362205 1.968504
124
+ vt 10.23622 2.755906
125
+ vt 10.23622 1.968504
126
+ vt 10.23622 7.086614
127
+ vt -3.937008 9.055119
128
+ vt -3.937008 4.015755E-15
129
+ vt 11.81102 9.055119
130
+ vt 11.81102 4.015755E-15
131
+ vt 10.23622 -1.01951E-14
132
+ vt 3.937008 -9.256236E-15
133
+ vt 2.362205 7.086614
134
+ vt 3.937008 9.055119
135
+ vt -11.81102 9.055119
136
+ vt -10.23622 7.086614
137
+ vt -10.23622 1.968504
138
+ vt -10.23622 -9.256236E-15
139
+ vt -11.81102 -9.256236E-15
140
+ vt 2.362205 4.954618E-15
141
+ vt 2.362205 2.755906
142
+ vt 2.362205 1.968504
143
+ vt -10.23622 2.755906
144
+ vt 7.874016 0
145
+ vt 6.299212 0
146
+ vt 7.874016 9.055119
147
+ vt -18.14945 9.055119
148
+ vt 18.14945 11.81102
149
+ vt 18.14945 -3.937008
150
+ vt 10.23622 -2.991357E-14
151
+ vt 11.81102 -2.991357E-14
152
+ vt 11.81102 1.968504
153
+ vt 11.81102 2.755906
154
+ vt 11.81102 7.086614
155
+ vt -3.937008 2.755906
156
+ vt -3.937008 7.086614
157
+ vt -2.362205 -7.552986E-14
158
+ vt -3.937008 1.968504
159
+ vt -3.937008 -8.974071E-14
160
+ vt 3.937008 2.755906
161
+ vt 3.937008 7.086614
162
+ vt 3.937008 1.968504
163
+ vt 3.937008 0
164
+ vt 2.362205 2.842171E-14
165
+ vt -11.81102 7.086614
166
+ vt -11.81102 2.755906
167
+ vt -10.23622 -1.421085E-14
168
+ vt -11.81102 0
169
+ vt -11.81102 1.968504
170
+ vt -7.874016 11.81102
171
+ vt 6.299212 -2.362205
172
+ vt 6.299212 10.23622
173
+ vt 7.874016 -2.362205
174
+ vt 7.874016 10.23622
175
+ vt -16.57465 10.23622
176
+ vt -16.57465 11.81102
177
+ vt 6.299212 11.81102
178
+ vt -16.57465 -2.362205
179
+ vt -16.57465 -3.937008
180
+ vt 6.299212 -3.937008
181
+ vt -18.14945 10.23622
182
+ vt -18.14945 -2.362205
183
+ vt 18.14945 0
184
+ vt 16.57465 0
185
+ vt 18.14945 9.055119
186
+ vt -7.874016 9.055119
187
+ vt -7.874016 0
188
+ vt -6.299212 0
189
+
190
+ usemtl wood
191
+
192
+ f 2/2/1 1/1/1 3/3/1
193
+ f 3/3/1 4/4/1 2/2/1
194
+ f 5/5/1 1/1/1 6/6/1
195
+ f 6/6/1 7/7/1 5/5/1
196
+ f 9/9/1 8/8/1 6/6/1
197
+ f 6/6/1 10/10/1 9/9/1
198
+ f 11/11/1 7/7/1 12/12/1
199
+ f 12/12/1 13/13/1 11/11/1
200
+ f 5/5/1 14/14/1 15/15/1
201
+ f 15/15/1 16/16/1 5/5/1
202
+ f 6/18/2 17/17/2 18/19/2
203
+ f 18/19/2 10/20/2 6/18/2
204
+ f 17/17/2 19/21/2 20/22/2
205
+ f 20/22/2 21/23/2 17/17/2
206
+ f 22/25/2 7/24/2 6/18/2
207
+ f 6/18/2 23/26/2 22/25/2
208
+ f 19/21/2 7/24/2 11/27/2
209
+ f 11/27/2 24/28/2 19/21/2
210
+ f 26/30/3 25/29/3 19/31/3
211
+ f 19/31/3 24/32/3 26/30/3
212
+ f 19/31/3 17/33/3 27/34/3
213
+ f 27/34/3 28/35/3 19/31/3
214
+ f 29/36/3 28/35/3 30/37/3
215
+ f 30/37/3 31/38/3 29/36/3
216
+ f 18/39/3 17/33/3 32/40/3
217
+ f 32/40/3 33/41/3 18/39/3
218
+ f 27/34/3 34/42/3 35/43/3
219
+ f 35/43/3 36/44/3 27/34/3
220
+ f 37/26/2 8/18/2 9/20/2
221
+ f 9/20/2 38/45/2 37/26/2
222
+ f 40/47/4 39/46/4 41/48/4
223
+ f 41/48/4 42/49/4 40/47/4
224
+ f 2/51/5 4/50/5 9/52/5
225
+ f 9/52/5 10/53/5 2/51/5
226
+ f 10/53/5 34/54/5 2/51/5
227
+ f 10/53/5 18/55/5 34/54/5
228
+ f 18/55/5 35/56/5 34/54/5
229
+ f 9/52/5 4/50/5 41/57/5
230
+ f 41/57/5 38/58/5 9/52/5
231
+ f 4/50/5 42/59/5 41/57/5
232
+ f 4/50/5 35/56/5 42/59/5
233
+ f 35/56/5 18/55/5 42/59/5
234
+ f 18/55/5 43/60/5 42/59/5
235
+ f 18/55/5 33/61/5 43/60/5
236
+ f 15/63/6 44/62/6 39/64/6
237
+ f 39/64/6 40/65/6 15/63/6
238
+ f 40/65/6 31/66/6 15/63/6
239
+ f 40/65/6 24/67/6 31/66/6
240
+ f 40/65/6 26/68/6 24/67/6
241
+ f 40/65/6 45/69/6 26/68/6
242
+ f 13/70/6 44/62/6 15/63/6
243
+ f 15/63/6 14/71/6 13/70/6
244
+ f 14/71/6 11/72/6 13/70/6
245
+ f 14/71/6 29/73/6 11/72/6
246
+ f 29/73/6 24/67/6 11/72/6
247
+ f 29/73/6 31/66/6 24/67/6
248
+ f 3/18/2 36/17/2 35/19/2
249
+ f 35/19/2 4/20/2 3/18/2
250
+ f 36/17/2 3/18/2 46/26/2
251
+ f 47/23/2 36/17/2 46/26/2
252
+ f 47/23/2 46/26/2 48/25/2
253
+ f 47/23/2 48/25/2 16/24/2
254
+ f 47/23/2 16/24/2 30/21/2
255
+ f 30/21/2 49/22/2 47/23/2
256
+ f 30/21/2 16/24/2 15/27/2
257
+ f 15/27/2 31/28/2 30/21/2
258
+ f 37/75/3 38/74/3 41/76/3
259
+ f 41/76/3 23/33/3 37/75/3
260
+ f 41/76/3 50/34/3 23/33/3
261
+ f 50/34/3 22/31/3 23/33/3
262
+ f 41/76/3 46/44/3 50/34/3
263
+ f 41/76/3 48/37/3 46/44/3
264
+ f 22/31/3 50/34/3 51/35/3
265
+ f 22/31/3 51/35/3 39/77/3
266
+ f 51/35/3 48/37/3 39/77/3
267
+ f 48/37/3 41/76/3 39/77/3
268
+ f 22/31/3 39/77/3 44/30/3
269
+ f 44/30/3 52/29/3 22/31/3
270
+ f 26/28/2 45/78/2 53/22/2
271
+ f 53/22/2 25/21/2 26/28/2
272
+ f 44/79/2 13/27/2 12/24/2
273
+ f 12/24/2 52/25/2 44/79/2
274
+ f 28/54/5 5/51/5 7/53/5
275
+ f 7/53/5 19/55/5 28/54/5
276
+ f 19/55/5 25/80/5 53/81/5
277
+ f 53/81/5 20/82/5 19/55/5
278
+ f 30/56/5 28/54/5 54/83/5
279
+ f 54/83/5 49/84/5 30/56/5
280
+ f 48/86/5 51/85/5 5/51/5
281
+ f 5/51/5 16/50/5 48/86/5
282
+ f 12/87/5 7/53/5 22/88/5
283
+ f 22/88/5 52/89/5 12/87/5
284
+ f 6/72/6 1/71/6 27/73/6
285
+ f 27/73/6 17/67/6 6/72/6
286
+ f 3/63/6 1/71/6 50/90/6
287
+ f 50/90/6 46/91/6 3/63/6
288
+ f 37/93/6 23/92/6 6/72/6
289
+ f 6/72/6 8/94/6 37/93/6
290
+ f 27/73/6 36/66/6 47/95/6
291
+ f 47/95/6 55/96/6 27/73/6
292
+ f 56/98/6 32/97/6 17/67/6
293
+ f 17/67/6 21/99/6 56/98/6
294
+ f 32/17/2 56/23/2 43/100/2
295
+ f 43/100/2 33/19/2 32/17/2
296
+ f 27/102/4 1/101/4 2/103/4
297
+ f 2/103/4 34/104/4 27/102/4
298
+ f 54/106/4 28/105/4 27/102/4
299
+ f 27/102/4 55/107/4 54/106/4
300
+ f 1/101/4 5/108/4 51/109/4
301
+ f 51/109/4 50/110/4 1/101/4
302
+ f 5/108/4 28/105/4 29/111/4
303
+ f 29/111/4 14/112/4 5/108/4
304
+ f 53/114/1 45/113/1 40/115/1
305
+ f 40/115/1 20/7/1 53/114/1
306
+ f 40/115/1 54/5/1 20/7/1
307
+ f 54/5/1 21/6/1 20/7/1
308
+ f 40/115/1 49/16/1 54/5/1
309
+ f 40/115/1 47/3/1 49/16/1
310
+ f 21/6/1 54/5/1 55/1/1
311
+ f 21/6/1 55/1/1 42/116/1
312
+ f 55/1/1 47/3/1 42/116/1
313
+ f 47/3/1 40/115/1 42/116/1
314
+ f 21/6/1 42/116/1 43/117/1
315
+ f 43/117/1 56/118/1 21/6/1
316
+ g tableCoffee
317
+
318
+
319
+
320
+
321
+ usemtl wood
322
+
323
+ f 2/2/1 1/1/1 3/3/1
324
+ f 3/3/1 4/4/1 2/2/1
325
+ f 5/5/1 1/1/1 6/6/1
326
+ f 6/6/1 7/7/1 5/5/1
327
+ f 9/9/1 8/8/1 6/6/1
328
+ f 6/6/1 10/10/1 9/9/1
329
+ f 11/11/1 7/7/1 12/12/1
330
+ f 12/12/1 13/13/1 11/11/1
331
+ f 5/5/1 14/14/1 15/15/1
332
+ f 15/15/1 16/16/1 5/5/1
333
+ f 6/18/2 17/17/2 18/19/2
334
+ f 18/19/2 10/20/2 6/18/2
335
+ f 17/17/2 19/21/2 20/22/2
336
+ f 20/22/2 21/23/2 17/17/2
337
+ f 22/25/2 7/24/2 6/18/2
338
+ f 6/18/2 23/26/2 22/25/2
339
+ f 19/21/2 7/24/2 11/27/2
340
+ f 11/27/2 24/28/2 19/21/2
341
+ f 26/30/3 25/29/3 19/31/3
342
+ f 19/31/3 24/32/3 26/30/3
343
+ f 19/31/3 17/33/3 27/34/3
344
+ f 27/34/3 28/35/3 19/31/3
345
+ f 29/36/3 28/35/3 30/37/3
346
+ f 30/37/3 31/38/3 29/36/3
347
+ f 18/39/3 17/33/3 32/40/3
348
+ f 32/40/3 33/41/3 18/39/3
349
+ f 27/34/3 34/42/3 35/43/3
350
+ f 35/43/3 36/44/3 27/34/3
351
+ f 37/26/2 8/18/2 9/20/2
352
+ f 9/20/2 38/45/2 37/26/2
353
+ f 40/47/4 39/46/4 41/48/4
354
+ f 41/48/4 42/49/4 40/47/4
355
+ f 2/51/5 4/50/5 9/52/5
356
+ f 9/52/5 10/53/5 2/51/5
357
+ f 10/53/5 34/54/5 2/51/5
358
+ f 10/53/5 18/55/5 34/54/5
359
+ f 18/55/5 35/56/5 34/54/5
360
+ f 9/52/5 4/50/5 41/57/5
361
+ f 41/57/5 38/58/5 9/52/5
362
+ f 4/50/5 42/59/5 41/57/5
363
+ f 4/50/5 35/56/5 42/59/5
364
+ f 35/56/5 18/55/5 42/59/5
365
+ f 18/55/5 43/60/5 42/59/5
366
+ f 18/55/5 33/61/5 43/60/5
367
+ f 15/63/6 44/62/6 39/64/6
368
+ f 39/64/6 40/65/6 15/63/6
369
+ f 40/65/6 31/66/6 15/63/6
370
+ f 40/65/6 24/67/6 31/66/6
371
+ f 40/65/6 26/68/6 24/67/6
372
+ f 40/65/6 45/69/6 26/68/6
373
+ f 13/70/6 44/62/6 15/63/6
374
+ f 15/63/6 14/71/6 13/70/6
375
+ f 14/71/6 11/72/6 13/70/6
376
+ f 14/71/6 29/73/6 11/72/6
377
+ f 29/73/6 24/67/6 11/72/6
378
+ f 29/73/6 31/66/6 24/67/6
379
+ f 3/18/2 36/17/2 35/19/2
380
+ f 35/19/2 4/20/2 3/18/2
381
+ f 36/17/2 3/18/2 46/26/2
382
+ f 47/23/2 36/17/2 46/26/2
383
+ f 47/23/2 46/26/2 48/25/2
384
+ f 47/23/2 48/25/2 16/24/2
385
+ f 47/23/2 16/24/2 30/21/2
386
+ f 30/21/2 49/22/2 47/23/2
387
+ f 30/21/2 16/24/2 15/27/2
388
+ f 15/27/2 31/28/2 30/21/2
389
+ f 37/75/3 38/74/3 41/76/3
390
+ f 41/76/3 23/33/3 37/75/3
391
+ f 41/76/3 50/34/3 23/33/3
392
+ f 50/34/3 22/31/3 23/33/3
393
+ f 41/76/3 46/44/3 50/34/3
394
+ f 41/76/3 48/37/3 46/44/3
395
+ f 22/31/3 50/34/3 51/35/3
396
+ f 22/31/3 51/35/3 39/77/3
397
+ f 51/35/3 48/37/3 39/77/3
398
+ f 48/37/3 41/76/3 39/77/3
399
+ f 22/31/3 39/77/3 44/30/3
400
+ f 44/30/3 52/29/3 22/31/3
401
+ f 26/28/2 45/78/2 53/22/2
402
+ f 53/22/2 25/21/2 26/28/2
403
+ f 44/79/2 13/27/2 12/24/2
404
+ f 12/24/2 52/25/2 44/79/2
405
+ f 28/54/5 5/51/5 7/53/5
406
+ f 7/53/5 19/55/5 28/54/5
407
+ f 19/55/5 25/80/5 53/81/5
408
+ f 53/81/5 20/82/5 19/55/5
409
+ f 30/56/5 28/54/5 54/83/5
410
+ f 54/83/5 49/84/5 30/56/5
411
+ f 48/86/5 51/85/5 5/51/5
412
+ f 5/51/5 16/50/5 48/86/5
413
+ f 12/87/5 7/53/5 22/88/5
414
+ f 22/88/5 52/89/5 12/87/5
415
+ f 6/72/6 1/71/6 27/73/6
416
+ f 27/73/6 17/67/6 6/72/6
417
+ f 3/63/6 1/71/6 50/90/6
418
+ f 50/90/6 46/91/6 3/63/6
419
+ f 37/93/6 23/92/6 6/72/6
420
+ f 6/72/6 8/94/6 37/93/6
421
+ f 27/73/6 36/66/6 47/95/6
422
+ f 47/95/6 55/96/6 27/73/6
423
+ f 56/98/6 32/97/6 17/67/6
424
+ f 17/67/6 21/99/6 56/98/6
425
+ f 32/17/2 56/23/2 43/100/2
426
+ f 43/100/2 33/19/2 32/17/2
427
+ f 27/102/4 1/101/4 2/103/4
428
+ f 2/103/4 34/104/4 27/102/4
429
+ f 54/106/4 28/105/4 27/102/4
430
+ f 27/102/4 55/107/4 54/106/4
431
+ f 1/101/4 5/108/4 51/109/4
432
+ f 51/109/4 50/110/4 1/101/4
433
+ f 5/108/4 28/105/4 29/111/4
434
+ f 29/111/4 14/112/4 5/108/4
435
+ f 53/114/1 45/113/1 40/115/1
436
+ f 40/115/1 20/7/1 53/114/1
437
+ f 40/115/1 54/5/1 20/7/1
438
+ f 54/5/1 21/6/1 20/7/1
439
+ f 40/115/1 49/16/1 54/5/1
440
+ f 40/115/1 47/3/1 49/16/1
441
+ f 21/6/1 54/5/1 55/1/1
442
+ f 21/6/1 55/1/1 42/116/1
443
+ f 55/1/1 47/3/1 42/116/1
444
+ f 47/3/1 40/115/1 42/116/1
445
+ f 21/6/1 42/116/1 43/117/1
446
+ f 43/117/1 56/118/1 21/6/1
modelos_3D/wall.mtl ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl wood
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.8962264 0.6015712 0.3931559
6
+ Ks 0.330000 0.330000 0.330000
7
+
8
+ newmtl _defaultMat
9
+ Ka 0.000000 0.000000 0.000000
10
+ Kd 1 1 1
11
+ Ks 0.330000 0.330000 0.330000
12
+
13
+ newmtl metalDark
14
+ Ka 0.000000 0.000000 0.000000
15
+ Kd 0.3058824 0.3882353 0.3882353
16
+ Ks 0.330000 0.330000 0.330000
17
+
modelos_3D/wall.obj ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib wall.mtl
4
+
5
+ g wall
6
+
7
+ v 0 0 0.05
8
+ v 0 0 0
9
+ v -1 0 0.05
10
+ v -1 0 0
11
+ v 0 1.289532 0
12
+ v 0 1.289532 0.05
13
+ v -1 1.289532 0
14
+ v -1 1.289532 0.05
15
+
16
+ vn 0 -1 0
17
+ vn 0 1 0
18
+ vn 1 0 0
19
+ vn -1 0 0
20
+ vn 0 0 -1
21
+ vn 0 0 1
22
+
23
+ vt 0 1.968504
24
+ vt 0 0
25
+ vt -39.37008 1.968504
26
+ vt -39.37008 0
27
+ vt 39.37008 0
28
+ vt 39.37008 1.968504
29
+ vt -39.37008 50.76897
30
+ vt 0 50.76897
31
+
32
+ usemtl wood
33
+
34
+ f 2/2/1 1/1/1 3/3/1
35
+ f 3/3/1 4/4/1 2/2/1
36
+ f 6/1/2 5/2/2 7/5/2
37
+ f 7/5/2 8/6/2 6/1/2
38
+
39
+ usemtl _defaultMat
40
+
41
+ f 2/3/3 5/4/3 6/2/3
42
+ f 6/3/3 1/4/3 2/2/3
43
+ f 7/5/4 4/6/4 3/1/4
44
+ f 3/5/4 8/6/4 7/1/4
45
+ f 2/8/5 4/7/5 7/4/5
46
+ f 7/8/5 5/7/5 2/4/5
47
+
48
+ usemtl metalDark
49
+
50
+ f 3/4/6 1/2/6 6/8/6
51
+ f 6/8/6 8/7/6 3/4/6
52
+ g wall
53
+
54
+
55
+
56
+
57
+ usemtl wood
58
+
59
+ f 2/2/1 1/1/1 3/3/1
60
+ f 3/3/1 4/4/1 2/2/1
61
+ f 6/1/2 5/2/2 7/5/2
62
+ f 7/5/2 8/6/2 6/1/2
63
+
64
+ usemtl _defaultMat
65
+
66
+ f 2/3/3 5/4/3 6/2/3
67
+ f 6/3/3 1/4/3 2/2/3
68
+ f 7/5/4 4/6/4 3/1/4
69
+ f 3/5/4 8/6/4 7/1/4
70
+ f 2/8/5 4/7/5 7/4/5
71
+ f 7/8/5 5/7/5 2/4/5
72
+
73
+ usemtl metalDark
74
+
75
+ f 3/4/6 1/2/6 6/8/6
76
+ f 6/8/6 8/7/6 3/4/6
modelos_3D/wallCorner.mtl ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl metalDark
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.3058824 0.3882353 0.3882353
6
+ Ks 0.330000 0.330000 0.330000
7
+
8
+ newmtl _defaultMat
9
+ Ka 0.000000 0.000000 0.000000
10
+ Kd 1 1 1
11
+ Ks 0.330000 0.330000 0.330000
12
+
13
+ newmtl wood
14
+ Ka 0.000000 0.000000 0.000000
15
+ Kd 0.8962264 0.6015712 0.3931559
16
+ Ks 0.330000 0.330000 0.330000
17
+
modelos_3D/wallCorner.obj ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib wallCorner.mtl
4
+
5
+ g wallCorner
6
+
7
+ v -0.5 1.289532 0.1
8
+ v -0.5 -9.023893E-17 0.1
9
+ v -0.5 1.289532 0.55
10
+ v -0.5 0 0.55
11
+ v 0 0 0.05
12
+ v -0.45 0 0.05
13
+ v 0 1.289532 0.05
14
+ v -0.45 1.289532 0.05
15
+ v -0.45 0 0
16
+ v 0 0 0
17
+ v -0.45 1.289532 0
18
+ v 0 1.289532 0
19
+ v -0.55 0 0.55
20
+ v -0.55 1.289532 0.55
21
+ v -0.55 -9.023893E-17 0.1
22
+ v -0.55 1.289532 0.1
23
+
24
+ vn 1 0 0
25
+ vn 0 0 1
26
+ vn 0.7071068 0 0.7071068
27
+ vn 0 0 -1
28
+ vn -1 0 0
29
+ vn -0.7071068 0 -0.7071068
30
+ vn 0 1 0
31
+ vn 0 -1 0
32
+
33
+ vt -3.937008 50.76897
34
+ vt -3.937008 -3.552714E-15
35
+ vt -21.65354 50.76897
36
+ vt -21.65354 4.935487E-32
37
+ vt 0 0
38
+ vt -17.71654 0
39
+ vt 0 50.76897
40
+ vt -17.71654 50.76897
41
+ vt -13.91943 50.76897
42
+ vt -13.91943 0
43
+ vt -16.70331 50.76897
44
+ vt -16.70331 -3.552714E-15
45
+ vt 19.68504 3.937008
46
+ vt 19.68504 21.65354
47
+ vt 21.65354 21.65354
48
+ vt -21.65354 21.65354
49
+ vt -19.68504 3.937008
50
+ vt -21.65354 3.937008
51
+ vt 0 1.968504
52
+ vt 17.71654 0
53
+ vt 17.71654 1.968504
54
+ vt 21.65354 3.937008
55
+ vt -19.68504 21.65354
56
+ vt -17.71654 1.712476E-31
57
+ vt -17.71654 1.968504
58
+
59
+ usemtl metalDark
60
+
61
+ f 2/2/1 1/1/1 3/3/1
62
+ f 3/3/1 4/4/1 2/2/1
63
+ f 6/6/2 5/5/2 7/7/2
64
+ f 7/7/2 8/8/2 6/6/2
65
+ f 6/10/3 8/9/3 1/11/3
66
+ f 1/11/3 2/12/3 6/10/3
67
+
68
+ usemtl _defaultMat
69
+
70
+ f 10/7/4 9/8/4 11/6/4
71
+ f 11/7/4 12/8/4 10/6/4
72
+ f 10/7/1 12/8/1 7/6/1
73
+ f 7/7/1 5/8/1 10/6/1
74
+ f 13/14/2 4/13/2 3/15/2
75
+ f 3/14/2 14/13/2 13/15/2
76
+ f 16/17/5 15/16/5 13/18/5
77
+ f 13/17/5 14/16/5 16/18/5
78
+ f 11/17/6 9/16/6 15/18/6
79
+ f 15/17/6 16/16/6 11/18/6
80
+
81
+ usemtl wood
82
+
83
+ f 7/19/7 12/5/7 11/20/7
84
+ f 11/20/7 8/21/7 7/19/7
85
+ f 11/20/7 16/22/7 8/21/7
86
+ f 16/22/7 1/13/7 8/21/7
87
+ f 16/22/7 14/15/7 1/13/7
88
+ f 3/14/7 1/13/7 14/15/7
89
+ f 2/17/8 4/23/8 13/16/8
90
+ f 2/17/8 13/16/8 15/18/8
91
+ f 2/17/8 15/18/8 9/24/8
92
+ f 6/25/8 2/17/8 9/24/8
93
+ f 6/25/8 9/24/8 10/5/8
94
+ f 10/5/8 5/19/8 6/25/8
95
+ g wallCorner
96
+
97
+
98
+
99
+
100
+ usemtl metalDark
101
+
102
+ f 2/2/1 1/1/1 3/3/1
103
+ f 3/3/1 4/4/1 2/2/1
104
+ f 6/6/2 5/5/2 7/7/2
105
+ f 7/7/2 8/8/2 6/6/2
106
+ f 6/10/3 8/9/3 1/11/3
107
+ f 1/11/3 2/12/3 6/10/3
108
+
109
+ usemtl _defaultMat
110
+
111
+ f 10/7/4 9/8/4 11/6/4
112
+ f 11/7/4 12/8/4 10/6/4
113
+ f 10/7/1 12/8/1 7/6/1
114
+ f 7/7/1 5/8/1 10/6/1
115
+ f 13/14/2 4/13/2 3/15/2
116
+ f 3/14/2 14/13/2 13/15/2
117
+ f 16/17/5 15/16/5 13/18/5
118
+ f 13/17/5 14/16/5 16/18/5
119
+ f 11/17/6 9/16/6 15/18/6
120
+ f 15/17/6 16/16/6 11/18/6
121
+
122
+ usemtl wood
123
+
124
+ f 7/19/7 12/5/7 11/20/7
125
+ f 11/20/7 8/21/7 7/19/7
126
+ f 11/20/7 16/22/7 8/21/7
127
+ f 16/22/7 1/13/7 8/21/7
128
+ f 16/22/7 14/15/7 1/13/7
129
+ f 3/14/7 1/13/7 14/15/7
130
+ f 2/17/8 4/23/8 13/16/8
131
+ f 2/17/8 13/16/8 15/18/8
132
+ f 2/17/8 15/18/8 9/24/8
133
+ f 6/25/8 2/17/8 9/24/8
134
+ f 6/25/8 9/24/8 10/5/8
135
+ f 10/5/8 5/19/8 6/25/8
modelos_3D/wallDoorway.mtl ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl _defaultMat
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 1 1 1
6
+ Ks 0.330000 0.330000 0.330000
7
+
8
+ newmtl wood
9
+ Ka 0.000000 0.000000 0.000000
10
+ Kd 0.8962264 0.6015712 0.3931559
11
+ Ks 0.330000 0.330000 0.330000
12
+
13
+ newmtl metalDark
14
+ Ka 0.000000 0.000000 0.000000
15
+ Kd 0.3058824 0.3882353 0.3882353
16
+ Ks 0.330000 0.330000 0.330000
17
+
modelos_3D/wallDoorway.obj ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib wallDoorway.mtl
4
+
5
+ g wallDoorway
6
+
7
+ v 0 1.289532 0
8
+ v 0 0 0
9
+ v 0 1.289532 0.05
10
+ v 0 0 0.05
11
+ v -1 0 0
12
+ v -1 1.289532 0
13
+ v -1 0 0.05
14
+ v -1 1.289532 0.05
15
+ v -0.743 3.038049E-17 0
16
+ v -0.743 1.009532 0
17
+ v -0.257 1.852689E-18 0
18
+ v -0.257 1.009532 0
19
+ v -0.743 1.460998E-17 0.05
20
+ v -0.743 7.309353E-17 -0.01955
21
+ v -0.743 1.688743E-17 0.06955
22
+ v -0.71465 2.283045E-16 -0.01955
23
+ v -0.71465 2.283045E-16 0.06955
24
+ v -0.257 1.009532 0.05
25
+ v -0.257 6.591026E-18 0.05
26
+ v -0.257 1.009532 0.06955
27
+ v -0.257 1.688743E-17 0.06955
28
+ v -0.28535 1.606253E-16 0.06955
29
+ v -0.28535 0.9811817 0.06955
30
+ v -0.71465 0.9811817 0.06955
31
+ v -0.743 1.009532 0.06955
32
+ v -0.257 0 -0.01955
33
+ v -0.28535 1.606253E-16 -0.01955
34
+ v -0.28535 0.9811817 -0.01955
35
+ v -0.71465 0.9811817 -0.01955
36
+ v -0.743 1.009532 -0.01955
37
+ v -0.257 1.009532 -0.01955
38
+ v -0.743 1.009532 0.05
39
+
40
+ vn 1 0 0
41
+ vn -1 0 0
42
+ vn 0 0 -1
43
+ vn 0 1 0
44
+ vn 0 -1 0
45
+ vn 0 0 1
46
+
47
+ vt 0 0
48
+ vt 39.37008 1.968504
49
+ vt 39.37008 0
50
+ vt 0 1.968504
51
+ vt 2.738189 39.74535
52
+ vt 2.738189 6.648595E-16
53
+ vt 1.968504 39.74535
54
+ vt -29.25197 1.968504
55
+ vt -29.25197 -3.7391E-30
56
+ vt -39.37008 1.968504
57
+ vt -39.37008 -4.597524E-30
58
+ vt -29.25197 -0.769685
59
+ vt -29.25197 2.738189
60
+ vt -28.13583 -0.769685
61
+ vt -28.13583 2.738189
62
+ vt -1.968504 39.74535
63
+ vt -1.968504 2.594892E-16
64
+ vt -2.738189 39.74535
65
+ vt -2.738189 6.648595E-16
66
+ vt -10.11811 6.648595E-16
67
+ vt -11.23425 6.32383E-15
68
+ vt -10.11811 39.74535
69
+ vt -11.23425 38.6292
70
+ vt -28.13583 38.6292
71
+ vt -29.25197 39.74535
72
+ vt -28.13583 8.988366E-15
73
+ vt -29.25197 6.648595E-16
74
+ vt -10.11811 2.738189
75
+ vt -10.11811 1.968504
76
+ vt -11.23425 2.738189
77
+ vt -10.11811 -2.892525E-31
78
+ vt -10.11811 -0.769685
79
+ vt -11.23425 -0.769685
80
+ vt 29.25197 2.877698E-15
81
+ vt 28.13583 8.988366E-15
82
+ vt 29.25197 39.74535
83
+ vt 28.13583 38.6292
84
+ vt 11.23425 38.6292
85
+ vt 10.11811 39.74535
86
+ vt 11.23425 6.32383E-15
87
+ vt 10.11811 0
88
+ vt -0.769685 6.32383E-15
89
+ vt -0.769685 38.6292
90
+ vt 2.738189 6.32383E-15
91
+ vt 2.738189 38.6292
92
+ vt 10.11811 1.968504
93
+ vt 10.11811 2.738189
94
+ vt 29.25197 1.968504
95
+ vt 29.25197 2.738189
96
+ vt 1.968504 5.751963E-16
97
+ vt 0.769685 38.6292
98
+ vt 0.769685 8.988366E-15
99
+ vt -2.738189 38.6292
100
+ vt -2.738189 8.988366E-15
101
+ vt -0.769685 2.877698E-15
102
+ vt -0.769685 39.74535
103
+ vt 0 1.196083E-15
104
+ vt 0 39.74535
105
+ vt 10.11811 -0.769685
106
+ vt 10.11811 -1.834566E-13
107
+ vt 29.25197 -0.769685
108
+ vt 29.25197 -1.834566E-13
109
+ vt 0.769685 39.74535
110
+ vt 0.769685 0
111
+ vt 0 7.294053E-17
112
+ vt -10.11811 2.594892E-16
113
+ vt 0 50.76897
114
+ vt -39.37008 50.76897
115
+ vt -29.25197 5.751963E-16
116
+ vt -39.37008 0
117
+
118
+ usemtl _defaultMat
119
+
120
+ f 2/1/1 1/1/1 3/1/1
121
+ f 3/1/1 4/1/1 2/1/1
122
+ f 6/3/2 5/2/2 7/4/2
123
+ f 7/3/2 8/2/2 6/4/2
124
+ f 9/6/3 5/5/3 6/7/3
125
+ f 6/6/3 10/5/3 9/7/3
126
+ f 1/6/3 2/5/3 11/7/3
127
+ f 11/6/3 12/5/3 1/7/3
128
+ f 12/6/3 10/5/3 1/7/3
129
+ f 10/6/3 6/5/3 1/7/3
130
+
131
+ usemtl wood
132
+
133
+ f 3/4/4 1/1/4 6/3/4
134
+ f 6/3/4 8/2/4 3/4/4
135
+ f 9/9/5 13/8/5 7/10/5
136
+ f 7/10/5 5/11/5 9/9/5
137
+ f 13/8/5 9/9/5 14/12/5
138
+ f 15/13/5 13/8/5 14/12/5
139
+ f 15/13/5 14/12/5 16/14/5
140
+ f 16/14/5 17/15/5 15/13/5
141
+ f 19/17/1 18/16/1 20/18/1
142
+ f 20/18/1 21/19/1 19/17/1
143
+ f 22/21/6 21/20/6 20/22/6
144
+ f 20/22/6 23/23/6 22/21/6
145
+ f 20/22/6 24/24/6 23/23/6
146
+ f 24/24/6 20/22/6 25/25/6
147
+ f 17/26/6 24/24/6 25/25/6
148
+ f 25/25/6 15/27/6 17/26/6
149
+ f 19/29/5 21/28/5 22/30/5
150
+ f 22/30/5 11/31/5 19/29/5
151
+ f 22/30/5 26/32/5 11/31/5
152
+ f 22/30/5 27/33/5 26/32/5
153
+ f 19/29/5 11/31/5 2/1/5
154
+ f 2/1/5 4/4/5 19/29/5
155
+ f 28/33/5 23/30/5 24/15/5
156
+ f 24/15/5 29/14/5 28/33/5
157
+ f 16/35/3 14/34/3 30/36/3
158
+ f 30/36/3 29/37/3 16/35/3
159
+ f 30/36/3 28/38/3 29/37/3
160
+ f 28/38/3 30/36/3 31/39/3
161
+ f 27/40/3 28/38/3 31/39/3
162
+ f 31/39/3 26/41/3 27/40/3
163
+ f 28/43/2 27/42/2 22/44/2
164
+ f 22/44/2 23/45/2 28/43/2
165
+ f 20/47/4 18/46/4 32/48/4
166
+ f 32/48/4 25/49/4 20/47/4
167
+ f 32/7/2 13/50/2 15/6/2
168
+ f 15/6/2 25/5/2 32/7/2
169
+ f 16/52/1 29/51/1 24/53/1
170
+ f 24/53/1 17/54/1 16/52/1
171
+ f 30/56/2 14/55/2 9/57/2
172
+ f 9/57/2 10/58/2 30/56/2
173
+ f 12/60/4 31/59/4 30/61/4
174
+ f 30/61/4 10/62/4 12/60/4
175
+ f 26/64/1 31/63/1 12/58/1
176
+ f 12/58/1 11/65/1 26/64/1
177
+
178
+ usemtl metalDark
179
+
180
+ f 19/66/6 4/1/6 3/67/6
181
+ f 3/67/6 18/22/6 19/66/6
182
+ f 3/67/6 32/25/6 18/22/6
183
+ f 32/25/6 3/67/6 8/68/6
184
+ f 13/69/6 32/25/6 8/68/6
185
+ f 8/68/6 7/70/6 13/69/6
186
+ g wallDoorway
187
+
188
+
189
+
190
+
191
+ usemtl _defaultMat
192
+
193
+ f 2/1/1 1/1/1 3/1/1
194
+ f 3/1/1 4/1/1 2/1/1
195
+ f 6/3/2 5/2/2 7/4/2
196
+ f 7/3/2 8/2/2 6/4/2
197
+ f 9/6/3 5/5/3 6/7/3
198
+ f 6/6/3 10/5/3 9/7/3
199
+ f 1/6/3 2/5/3 11/7/3
200
+ f 11/6/3 12/5/3 1/7/3
201
+ f 12/6/3 10/5/3 1/7/3
202
+ f 10/6/3 6/5/3 1/7/3
203
+
204
+ usemtl wood
205
+
206
+ f 3/4/4 1/1/4 6/3/4
207
+ f 6/3/4 8/2/4 3/4/4
208
+ f 9/9/5 13/8/5 7/10/5
209
+ f 7/10/5 5/11/5 9/9/5
210
+ f 13/8/5 9/9/5 14/12/5
211
+ f 15/13/5 13/8/5 14/12/5
212
+ f 15/13/5 14/12/5 16/14/5
213
+ f 16/14/5 17/15/5 15/13/5
214
+ f 19/17/1 18/16/1 20/18/1
215
+ f 20/18/1 21/19/1 19/17/1
216
+ f 22/21/6 21/20/6 20/22/6
217
+ f 20/22/6 23/23/6 22/21/6
218
+ f 20/22/6 24/24/6 23/23/6
219
+ f 24/24/6 20/22/6 25/25/6
220
+ f 17/26/6 24/24/6 25/25/6
221
+ f 25/25/6 15/27/6 17/26/6
222
+ f 19/29/5 21/28/5 22/30/5
223
+ f 22/30/5 11/31/5 19/29/5
224
+ f 22/30/5 26/32/5 11/31/5
225
+ f 22/30/5 27/33/5 26/32/5
226
+ f 19/29/5 11/31/5 2/1/5
227
+ f 2/1/5 4/4/5 19/29/5
228
+ f 28/33/5 23/30/5 24/15/5
229
+ f 24/15/5 29/14/5 28/33/5
230
+ f 16/35/3 14/34/3 30/36/3
231
+ f 30/36/3 29/37/3 16/35/3
232
+ f 30/36/3 28/38/3 29/37/3
233
+ f 28/38/3 30/36/3 31/39/3
234
+ f 27/40/3 28/38/3 31/39/3
235
+ f 31/39/3 26/41/3 27/40/3
236
+ f 28/43/2 27/42/2 22/44/2
237
+ f 22/44/2 23/45/2 28/43/2
238
+ f 20/47/4 18/46/4 32/48/4
239
+ f 32/48/4 25/49/4 20/47/4
240
+ f 32/7/2 13/50/2 15/6/2
241
+ f 15/6/2 25/5/2 32/7/2
242
+ f 16/52/1 29/51/1 24/53/1
243
+ f 24/53/1 17/54/1 16/52/1
244
+ f 30/56/2 14/55/2 9/57/2
245
+ f 9/57/2 10/58/2 30/56/2
246
+ f 12/60/4 31/59/4 30/61/4
247
+ f 30/61/4 10/62/4 12/60/4
248
+ f 26/64/1 31/63/1 12/58/1
249
+ f 12/58/1 11/65/1 26/64/1
250
+
251
+ usemtl metalDark
252
+
253
+ f 19/66/6 4/1/6 3/67/6
254
+ f 3/67/6 18/22/6 19/66/6
255
+ f 3/67/6 32/25/6 18/22/6
256
+ f 32/25/6 3/67/6 8/68/6
257
+ f 13/69/6 32/25/6 8/68/6
258
+ f 8/68/6 7/70/6 13/69/6
modelos_3D/wallWindow.mtl ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ newmtl wood
4
+ Ka 0.000000 0.000000 0.000000
5
+ Kd 0.8962264 0.6015712 0.3931559
6
+ Ks 0.330000 0.330000 0.330000
7
+
8
+ newmtl metalDark
9
+ Ka 0.000000 0.000000 0.000000
10
+ Kd 0.3058824 0.3882353 0.3882353
11
+ Ks 0.330000 0.330000 0.330000
12
+
13
+ newmtl _defaultMat
14
+ Ka 0.000000 0.000000 0.000000
15
+ Kd 1 1 1
16
+ Ks 0.330000 0.330000 0.330000
17
+
18
+ newmtl glass
19
+ Ka 0.000000 0.000000 0.000000
20
+ Kd 0.6980392 0.827451 0.7686275
21
+ Ks 0.330000 0.330000 0.330000
22
+
modelos_3D/wallWindow.obj ADDED
@@ -0,0 +1,391 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Created by Kenney (www.kenney.nl)
2
+
3
+ mtllib wallWindow.mtl
4
+
5
+ g wallWindow
6
+
7
+ v -0.2630005 1.106531 0.05
8
+ v -0.2630005 1.106531 0.06955
9
+ v -0.7369995 1.106531 0.05
10
+ v -0.7369995 1.106531 0.06955
11
+ v -0.2630005 0.3430005 0.06955
12
+ v -0.2630005 0.3430005 0.05
13
+ v -0.7369995 0.3430005 0.06955
14
+ v -0.7369995 0.3430005 0.05
15
+ v -0.3127084 0.3927084 0.06955
16
+ v -0.3127084 1.056823 0.06955
17
+ v -0.6872916 1.056823 0.06955
18
+ v -0.6872916 0.3927084 0.06955
19
+ v -0.2630005 0.3430005 -0.01955
20
+ v -0.6872916 0.3927084 -0.01955
21
+ v -0.7369995 0.3430005 -0.01955
22
+ v -0.7369995 1.106531 -0.01955
23
+ v -0.6872916 1.056823 -0.01955
24
+ v -0.3127084 1.056823 -0.01955
25
+ v -0.3127084 0.3927084 -0.01955
26
+ v -0.2630005 1.106531 -0.01955
27
+ v -0.2630005 1.106531 0
28
+ v -0.7369995 1.106531 0
29
+ v -0.2630005 0.3430005 0
30
+ v -0.7369995 0.3430005 0
31
+ v 0 0 0.05
32
+ v 0 0 0
33
+ v -1 0 0.05
34
+ v -1 0 0
35
+ v 0 1.289532 0
36
+ v 0 1.289532 0.05
37
+ v -1 1.289532 0
38
+ v -1 1.289532 0.05
39
+
40
+ vn 0 1 0
41
+ vn 0 -1 0
42
+ vn -1 0 0
43
+ vn 0 0 1
44
+ vn 1 0 0
45
+ vn 0 0 -1
46
+
47
+ vt 10.35435 1.968504
48
+ vt 10.35435 2.738189
49
+ vt 29.01573 1.968504
50
+ vt 29.01573 2.738189
51
+ vt -10.35435 2.738189
52
+ vt -10.35435 1.968504
53
+ vt -29.01573 2.738189
54
+ vt -29.01573 1.968504
55
+ vt 1.968504 13.50396
56
+ vt 1.968504 43.56422
57
+ vt 2.738189 13.50396
58
+ vt 2.738189 43.56422
59
+ vt -29.01573 13.50396
60
+ vt -12.31135 15.46096
61
+ vt -10.35435 13.50396
62
+ vt -10.35435 43.56422
63
+ vt -12.31135 41.60722
64
+ vt -27.05872 41.60722
65
+ vt -27.05872 15.46096
66
+ vt -29.01573 43.56422
67
+ vt -1.968504 43.56422
68
+ vt -1.968504 13.50396
69
+ vt -2.738189 43.56422
70
+ vt -2.738189 13.50396
71
+ vt 10.35435 13.50396
72
+ vt 27.05872 15.46096
73
+ vt 29.01573 13.50396
74
+ vt 29.01573 43.56422
75
+ vt 27.05872 41.60722
76
+ vt 12.31135 41.60722
77
+ vt 12.31135 15.46096
78
+ vt 10.35435 43.56422
79
+ vt 10.35435 -0.769685
80
+ vt 10.35435 0
81
+ vt 29.01573 -0.769685
82
+ vt 29.01573 0
83
+ vt 0.769685 43.56422
84
+ vt 0.769685 13.50396
85
+ vt 0 43.56422
86
+ vt 0 13.50396
87
+ vt -10.35435 0
88
+ vt -10.35435 -0.769685
89
+ vt -29.01573 0
90
+ vt -29.01573 -0.769685
91
+ vt -0.769685 13.50396
92
+ vt -0.769685 43.56422
93
+ vt 0 1.968504
94
+ vt 0 0
95
+ vt -39.37008 1.968504
96
+ vt -39.37008 0
97
+ vt 39.37008 0
98
+ vt 39.37008 1.968504
99
+ vt 0.769685 41.60722
100
+ vt 0.769685 15.46096
101
+ vt -2.738189 41.60722
102
+ vt -2.738189 15.46096
103
+ vt -12.31135 2.738189
104
+ vt -12.31135 -0.769685
105
+ vt -27.05872 2.738189
106
+ vt -27.05872 -0.769685
107
+ vt 12.31135 -0.769685
108
+ vt 12.31135 2.738189
109
+ vt 27.05872 -0.769685
110
+ vt 27.05872 2.738189
111
+ vt -0.769685 15.46096
112
+ vt -0.769685 41.60722
113
+ vt 2.738189 15.46096
114
+ vt 2.738189 41.60722
115
+ vt 0 50.76897
116
+ vt -39.37008 50.76897
117
+
118
+ usemtl wood
119
+
120
+ f 2/2/1 1/1/1 3/3/1
121
+ f 3/3/1 4/4/1 2/2/1
122
+ f 6/6/2 5/5/2 7/7/2
123
+ f 7/7/2 8/8/2 6/6/2
124
+ f 3/10/3 8/9/3 7/11/3
125
+ f 7/11/3 4/12/3 3/10/3
126
+ f 9/14/4 7/13/4 5/15/4
127
+ f 5/15/4 2/16/4 9/14/4
128
+ f 2/16/4 10/17/4 9/14/4
129
+ f 2/16/4 11/18/4 10/17/4
130
+ f 7/13/4 9/14/4 12/19/4
131
+ f 12/19/4 4/20/4 7/13/4
132
+ f 12/19/4 11/18/4 4/20/4
133
+ f 11/18/4 2/16/4 4/20/4
134
+ f 6/22/5 1/21/5 2/23/5
135
+ f 2/23/5 5/24/5 6/22/5
136
+ f 14/26/6 13/25/6 15/27/6
137
+ f 15/27/6 16/28/6 14/26/6
138
+ f 16/28/6 17/29/6 14/26/6
139
+ f 16/28/6 18/30/6 17/29/6
140
+ f 13/25/6 14/26/6 19/31/6
141
+ f 19/31/6 20/32/6 13/25/6
142
+ f 19/31/6 18/30/6 20/32/6
143
+ f 18/30/6 16/28/6 20/32/6
144
+ f 21/34/1 20/33/1 16/35/1
145
+ f 16/35/1 22/36/1 21/34/1
146
+ f 13/38/5 20/37/5 21/39/5
147
+ f 21/39/5 23/40/5 13/38/5
148
+ f 13/42/2 23/41/2 24/43/2
149
+ f 24/43/2 15/44/2 13/42/2
150
+ f 16/46/3 15/45/3 24/40/3
151
+ f 24/40/3 22/39/3 16/46/3
152
+ f 26/48/2 25/47/2 27/49/2
153
+ f 27/49/2 28/50/2 26/48/2
154
+ f 30/47/1 29/48/1 31/51/1
155
+ f 31/51/1 32/52/1 30/47/1
156
+ f 14/54/5 17/53/5 11/55/5
157
+ f 11/55/5 12/56/5 14/54/5
158
+ f 18/58/2 10/57/2 11/59/2
159
+ f 11/59/2 17/60/2 18/58/2
160
+ f 9/62/1 19/61/1 14/63/1
161
+ f 14/63/1 12/64/1 9/62/1
162
+ f 18/66/3 19/65/3 9/67/3
163
+ f 9/67/3 10/68/3 18/66/3
164
+
165
+ usemtl metalDark
166
+
167
+ f 6/15/4 27/50/4 25/48/4
168
+ f 25/48/4 30/69/4 6/15/4
169
+ f 30/69/4 1/16/4 6/15/4
170
+ f 30/69/4 3/20/4 1/16/4
171
+ f 27/50/4 6/15/4 8/13/4
172
+ f 8/13/4 32/70/4 27/50/4
173
+ f 8/13/4 3/20/4 32/70/4
174
+ f 3/20/4 30/69/4 32/70/4
175
+
176
+ usemtl _defaultMat
177
+
178
+ f 24/20/6 26/69/6 28/70/6
179
+ f 28/20/6 31/69/6 24/70/6
180
+ f 31/20/6 22/69/6 24/70/6
181
+ f 31/20/6 21/69/6 22/70/6
182
+ f 23/20/6 29/69/6 26/70/6
183
+ f 26/20/6 24/69/6 23/70/6
184
+ f 23/20/6 21/69/6 29/70/6
185
+ f 21/20/6 31/69/6 29/70/6
186
+ f 26/20/5 29/69/5 30/70/5
187
+ f 30/20/5 25/69/5 26/70/5
188
+ f 31/51/3 28/52/3 27/47/3
189
+ f 27/51/3 32/52/3 31/47/3
190
+ g wallWindow
191
+
192
+
193
+
194
+
195
+ usemtl wood
196
+
197
+ f 2/2/1 1/1/1 3/3/1
198
+ f 3/3/1 4/4/1 2/2/1
199
+ f 6/6/2 5/5/2 7/7/2
200
+ f 7/7/2 8/8/2 6/6/2
201
+ f 3/10/3 8/9/3 7/11/3
202
+ f 7/11/3 4/12/3 3/10/3
203
+ f 9/14/4 7/13/4 5/15/4
204
+ f 5/15/4 2/16/4 9/14/4
205
+ f 2/16/4 10/17/4 9/14/4
206
+ f 2/16/4 11/18/4 10/17/4
207
+ f 7/13/4 9/14/4 12/19/4
208
+ f 12/19/4 4/20/4 7/13/4
209
+ f 12/19/4 11/18/4 4/20/4
210
+ f 11/18/4 2/16/4 4/20/4
211
+ f 6/22/5 1/21/5 2/23/5
212
+ f 2/23/5 5/24/5 6/22/5
213
+ f 14/26/6 13/25/6 15/27/6
214
+ f 15/27/6 16/28/6 14/26/6
215
+ f 16/28/6 17/29/6 14/26/6
216
+ f 16/28/6 18/30/6 17/29/6
217
+ f 13/25/6 14/26/6 19/31/6
218
+ f 19/31/6 20/32/6 13/25/6
219
+ f 19/31/6 18/30/6 20/32/6
220
+ f 18/30/6 16/28/6 20/32/6
221
+ f 21/34/1 20/33/1 16/35/1
222
+ f 16/35/1 22/36/1 21/34/1
223
+ f 13/38/5 20/37/5 21/39/5
224
+ f 21/39/5 23/40/5 13/38/5
225
+ f 13/42/2 23/41/2 24/43/2
226
+ f 24/43/2 15/44/2 13/42/2
227
+ f 16/46/3 15/45/3 24/40/3
228
+ f 24/40/3 22/39/3 16/46/3
229
+ f 26/48/2 25/47/2 27/49/2
230
+ f 27/49/2 28/50/2 26/48/2
231
+ f 30/47/1 29/48/1 31/51/1
232
+ f 31/51/1 32/52/1 30/47/1
233
+ f 14/54/5 17/53/5 11/55/5
234
+ f 11/55/5 12/56/5 14/54/5
235
+ f 18/58/2 10/57/2 11/59/2
236
+ f 11/59/2 17/60/2 18/58/2
237
+ f 9/62/1 19/61/1 14/63/1
238
+ f 14/63/1 12/64/1 9/62/1
239
+ f 18/66/3 19/65/3 9/67/3
240
+ f 9/67/3 10/68/3 18/66/3
241
+
242
+ usemtl metalDark
243
+
244
+ f 6/15/4 27/50/4 25/48/4
245
+ f 25/48/4 30/69/4 6/15/4
246
+ f 30/69/4 1/16/4 6/15/4
247
+ f 30/69/4 3/20/4 1/16/4
248
+ f 27/50/4 6/15/4 8/13/4
249
+ f 8/13/4 32/70/4 27/50/4
250
+ f 8/13/4 3/20/4 32/70/4
251
+ f 3/20/4 30/69/4 32/70/4
252
+
253
+ usemtl _defaultMat
254
+
255
+ f 24/20/6 26/69/6 28/70/6
256
+ f 28/20/6 31/69/6 24/70/6
257
+ f 31/20/6 22/69/6 24/70/6
258
+ f 31/20/6 21/69/6 22/70/6
259
+ f 23/20/6 29/69/6 26/70/6
260
+ f 26/20/6 24/69/6 23/70/6
261
+ f 23/20/6 21/69/6 29/70/6
262
+ f 21/20/6 31/69/6 29/70/6
263
+ f 26/20/5 29/69/5 30/70/5
264
+ f 30/20/5 25/69/5 26/70/5
265
+ f 31/51/3 28/52/3 27/47/3
266
+ f 27/51/3 32/52/3 31/47/3
267
+ g window
268
+
269
+ v -0.6380731 0.4419269 0.025
270
+ v -0.3619269 0.4419269 0.025
271
+ v -0.6380731 1.007605 0.025
272
+ v -0.3619269 1.007605 0.025
273
+ v -0.6380731 1.007605 0.012725
274
+ v -0.6380731 0.4419269 0.012725
275
+ v -0.6380731 1.007605 0.037275
276
+ v -0.6380731 0.4419269 0.037275
277
+ v -0.3619269 1.007605 0.012725
278
+ v -0.3619269 1.007605 0.037275
279
+ v -0.3619269 0.4419269 0.012725
280
+ v -0.3619269 0.4419269 0.037275
281
+ v -0.6872916 0.3927084 0.012725
282
+ v -0.6872916 1.056823 0.012725
283
+ v -0.6872916 0.3927084 0.037275
284
+ v -0.6872916 1.056823 0.037275
285
+ v -0.3127084 1.056823 0.012725
286
+ v -0.3127084 1.056823 0.037275
287
+ v -0.3127084 0.3927084 0.037275
288
+ v -0.3127084 0.3927084 0.012725
289
+
290
+
291
+ vt 12.80964 1.937735
292
+ vt 1.937735 1.937735
293
+ vt 12.80964 24.20852
294
+ vt 1.937735 24.20852
295
+ vt -0.3937008 24.20852
296
+ vt -0.3937008 1.937735
297
+ vt -0.8769685 24.20852
298
+ vt -0.8769685 1.937735
299
+ vt -1.360236 24.20852
300
+ vt -1.360236 1.937735
301
+ vt -1.937735 0.8769685
302
+ vt -1.937735 0.3937008
303
+ vt -12.80964 0.8769685
304
+ vt -12.80964 0.3937008
305
+ vt -12.80964 1.360236
306
+ vt -1.937735 1.360236
307
+ vt 0.3937008 1.937735
308
+ vt 0.3937008 24.20852
309
+ vt 0.8769685 1.937735
310
+ vt 0.8769685 24.20852
311
+ vt 1.360236 1.937735
312
+ vt 1.360236 24.20852
313
+ vt 1.937735 0.3937008
314
+ vt 1.937735 0.8769685
315
+ vt 12.80964 0.3937008
316
+ vt 12.80964 0.8769685
317
+ vt 1.937735 1.360236
318
+ vt 12.80964 1.360236
319
+ vt 0.3937008 0
320
+ vt 0.3937008 26.14626
321
+ vt 1.360236 0
322
+ vt 1.360236 26.14626
323
+ vt 0 0.3937008
324
+ vt 0 1.360236
325
+ vt 14.74737 0.3937008
326
+ vt 14.74737 1.360236
327
+ vt -14.74737 0
328
+ vt -1.937735 1.937735
329
+ vt 0 26.14626
330
+ vt -1.937735 24.20852
331
+ vt -12.80964 24.20852
332
+ vt -12.80964 1.937735
333
+ vt -14.74737 26.14626
334
+ vt 14.74737 0
335
+ vt 14.74737 26.14626
336
+ vt -14.74737 1.360236
337
+ vt -14.74737 0.3937008
338
+ vt -0.3937008 26.14626
339
+ vt -0.3937008 0
340
+ vt -1.360236 26.14626
341
+ vt -1.360236 0
342
+
343
+ usemtl glass
344
+
345
+ f 34/72/6 33/71/6 35/73/6
346
+ f 35/73/6 36/74/6 34/72/6
347
+ f 34/72/4 35/73/4 33/71/4
348
+ f 35/73/4 34/72/4 36/74/4
349
+
350
+ usemtl wood
351
+
352
+ f 38/76/5 37/75/5 35/77/5
353
+ f 35/77/5 33/78/5 38/76/5
354
+ f 33/78/5 35/77/5 39/79/5
355
+ f 39/79/5 40/80/5 33/78/5
356
+ f 41/82/2 36/81/2 35/83/2
357
+ f 35/83/2 37/84/2 41/82/2
358
+ f 39/85/2 35/83/2 36/81/2
359
+ f 36/81/2 42/86/2 39/85/2
360
+ f 41/88/3 43/87/3 34/89/3
361
+ f 34/89/3 36/90/3 41/88/3
362
+ f 36/90/3 34/89/3 44/91/3
363
+ f 44/91/3 42/92/3 36/90/3
364
+ f 34/94/1 43/93/1 38/95/1
365
+ f 38/95/1 33/96/1 34/94/1
366
+ f 44/97/1 34/94/1 33/96/1
367
+ f 33/96/1 40/98/1 44/97/1
368
+ f 46/100/3 45/99/3 47/101/3
369
+ f 47/101/3 48/102/3 46/100/3
370
+ f 50/104/1 49/103/1 46/105/1
371
+ f 46/105/1 48/106/1 50/104/1
372
+ f 44/108/4 47/107/4 51/48/4
373
+ f 51/48/4 50/109/4 44/108/4
374
+ f 50/109/4 42/110/4 44/108/4
375
+ f 50/109/4 39/111/4 42/110/4
376
+ f 47/107/4 44/108/4 40/112/4
377
+ f 40/112/4 48/113/4 47/107/4
378
+ f 40/112/4 39/111/4 48/113/4
379
+ f 39/111/4 50/109/4 48/113/4
380
+ f 38/71/6 52/48/6 45/114/6
381
+ f 45/114/6 46/115/6 38/71/6
382
+ f 46/115/6 37/73/6 38/71/6
383
+ f 46/115/6 41/74/6 37/73/6
384
+ f 52/48/6 38/71/6 43/72/6
385
+ f 43/72/6 49/109/6 52/48/6
386
+ f 43/72/6 41/74/6 49/109/6
387
+ f 41/74/6 46/115/6 49/109/6
388
+ f 52/103/2 51/104/2 47/116/2
389
+ f 47/116/2 45/117/2 52/103/2
390
+ f 52/119/5 49/118/5 50/120/5
391
+ f 50/120/5 51/121/5 52/119/5