Upload 43 files
Browse files- horizonnet/__init__.py +0 -0
- horizonnet/__pycache__/__init__.cpython-39.pyc +0 -0
- horizonnet/__pycache__/dataset.cpython-39.pyc +0 -0
- horizonnet/__pycache__/inference.cpython-39.pyc +0 -0
- horizonnet/__pycache__/model.cpython-39.pyc +0 -0
- horizonnet/dataset.py +280 -0
- horizonnet/inference.py +223 -0
- horizonnet/misc/__init__.py +0 -0
- horizonnet/misc/__pycache__/__init__.cpython-39.pyc +0 -0
- horizonnet/misc/__pycache__/panostretch.cpython-39.pyc +0 -0
- horizonnet/misc/__pycache__/post_proc.cpython-39.pyc +0 -0
- horizonnet/misc/__pycache__/utils.cpython-39.pyc +0 -0
- horizonnet/misc/gen_txt_structured3d.py +52 -0
- horizonnet/misc/pano_lsd_align.py +914 -0
- horizonnet/misc/panostretch.py +178 -0
- horizonnet/misc/post_proc.py +359 -0
- horizonnet/misc/structured3d_extract_zip.py +61 -0
- horizonnet/misc/structured3d_prepare_dataset.py +57 -0
- horizonnet/misc/utils.py +77 -0
- horizonnet/misc/zind_prepare_dataset.py +106 -0
- horizonnet/model.py +281 -0
- horizonnet/preprocess.py +82 -0
- horizonnet/traduccion.py +231 -0
- modelos_3D/bookcaseOpen.mtl +7 -0
- modelos_3D/bookcaseOpen.obj +993 -0
- modelos_3D/cabinetTelevision.mtl +7 -0
- modelos_3D/cabinetTelevision.obj +522 -0
- modelos_3D/loungeChair.mtl +12 -0
- modelos_3D/loungeChair.obj +500 -0
- modelos_3D/loungeDesignSofaCorner.mtl +12 -0
- modelos_3D/loungeDesignSofaCorner.obj +727 -0
- modelos_3D/loungeSofa.mtl +12 -0
- modelos_3D/loungeSofa.obj +498 -0
- modelos_3D/tableCoffee.mtl +7 -0
- modelos_3D/tableCoffee.obj +446 -0
- modelos_3D/wall.mtl +17 -0
- modelos_3D/wall.obj +76 -0
- modelos_3D/wallCorner.mtl +17 -0
- modelos_3D/wallCorner.obj +135 -0
- modelos_3D/wallDoorway.mtl +17 -0
- modelos_3D/wallDoorway.obj +258 -0
- modelos_3D/wallWindow.mtl +22 -0
- 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
|