Codels
3,2 k tris12,5 × 7,50 × 12,5 m

Utiliser dans le code

Remixer dans l’éditeur
Module ES autonome — ne dépend que de three. Appelez la fonction factory et ajoutez le groupe à votre scène.
/**
 * Japanese House — Codels 3D model library
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 3,176 · Size (W × H × D): 12.53 × 7.50 × 12.52 m
 *
 * Usage:
 *   import { createJapaneseHouse } from './japanese-house.js';
 *   
 *   const model = createJapaneseHouse();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

// Deterministic vertex displacement (organic low-poly look).
function jitter(geometry, amount, seed) {
  const pos = geometry.attributes.position;
  const h = (a, b, c, s) => {
    let x = Math.imul(a, 73856093) ^ Math.imul(b, 19349663) ^ Math.imul(c, 83492791) ^ Math.imul(s, 2654435761);
    x = Math.imul(x ^ (x >>> 16), 2246822507);
    x = Math.imul(x ^ (x >>> 13), 3266489909);
    return ((x ^ (x >>> 16)) >>> 0) / 4294967295 - 0.5;
  };
  for (let i = 0; i < pos.count; i++) {
    const x = pos.getX(i), y = pos.getY(i), z = pos.getZ(i);
    const qx = Math.round(x * 1000), qy = Math.round(y * 1000), qz = Math.round(z * 1000);
    pos.setXYZ(i, x + h(qx, qy, qz, seed) * 2 * amount, y + h(qx, qy, qz, seed + 1) * 2 * amount, z + h(qx, qy, qz, seed + 2) * 2 * amount);
  }
  pos.needsUpdate = true;
  geometry.computeVertexNormals();
  return geometry;
}

// Revolve a 2D profile [[radius, y], ...] around the Y axis.
function lathe(points, segments, phiStart = 0, phiLength = Math.PI * 2) {
  return new THREE.LatheGeometry(points.map(([x, y]) => new THREE.Vector2(x, y)), segments, phiStart, phiLength);
}

// Extrude a 2D outline along Z (centered). bevel = [thickness, size, segments].
function extrude(outline, depth, holes = [], bevel = null) {
  const shape = new THREE.Shape(outline.map(([x, y]) => new THREE.Vector2(x, y)));
  for (const hole of holes) shape.holes.push(new THREE.Path(hole.map(([x, y]) => new THREE.Vector2(x, y))));
  const options = bevel
    ? { depth, bevelEnabled: true, bevelThickness: bevel[0], bevelSize: bevel[1], bevelSegments: bevel[2] }
    : { depth, bevelEnabled: false };
  return new THREE.ExtrudeGeometry(shape, options).translate(0, 0, -depth / 2);
}

export function createJapaneseHouse() {
  const root = new THREE.Group();
  root.name = 'JapaneseHouse';

  // Materials
  const plasterMat = new THREE.MeshStandardMaterial({ name: 'plaster', color: 0xefe8da, roughness: 0.95, flatShading: true });
  const paperMat = new THREE.MeshStandardMaterial({ name: 'paper', color: 0xf7f0dc, roughness: 0.9, emissive: 0xfff1cf, emissiveIntensity: 0.12, flatShading: true });
  const woodMat = new THREE.MeshStandardMaterial({ name: 'wood', color: 0x4a3428, roughness: 0.85, flatShading: true });
  const deckMat = new THREE.MeshStandardMaterial({ name: 'deck', color: 0x826346, roughness: 0.85, flatShading: true });
  const roofMat = new THREE.MeshStandardMaterial({ name: 'roof', color: 0x454c58, roughness: 0.75, flatShading: true });
  const ridgeMat = new THREE.MeshStandardMaterial({ name: 'ridge', color: 0x343942, roughness: 0.75, flatShading: true });
  const stoneMat = new THREE.MeshStandardMaterial({ name: 'stone', color: 0x8d8982, roughness: 0.95, flatShading: true });
  const darkMat = new THREE.MeshStandardMaterial({ name: 'dark', color: 0x1f1b19, roughness: 1, flatShading: true });
  const lampMat = new THREE.MeshStandardMaterial({ name: 'lamp', color: 0xffd889, roughness: 0.8, emissive: 0xffbf4d, flatShading: true });

  // Shared geometries
  const boxGeo = new THREE.BoxGeometry(0.16, 0.45, 0.16);
  const boxGeo2 = new THREE.BoxGeometry(0.17, 2.75, 0.17);
  const boxGeo3 = new THREE.BoxGeometry(1.708, 1.78, 0.03);
  const boxGeo4 = new THREE.BoxGeometry(1.708, 0.36, 0.05);
  const boxGeo5 = new THREE.BoxGeometry(0.06, 1.78, 0.05);
  const boxGeo6 = new THREE.BoxGeometry(0.025, 1.4, 0.04);
  const boxGeo7 = new THREE.BoxGeometry(9.44, 0.025, 0.04);
  const boxGeo8 = new THREE.BoxGeometry(0.025, 0.7, 0.03);
  const boxGeo9 = new THREE.BoxGeometry(1.5, 0.06, 0.06);
  const boxGeo10 = new THREE.BoxGeometry(0.025, 0.6, 0.03);
  const boxGeo11 = new THREE.BoxGeometry(1.58, 1.78, 0.03);
  const boxGeo12 = new THREE.BoxGeometry(1.58, 0.36, 0.05);
  const boxGeo13 = new THREE.BoxGeometry(3.52, 0.025, 0.04);
  const boxGeo14 = new THREE.BoxGeometry(10.55, 0.01, 0.02);
  const boxGeo15 = new THREE.BoxGeometry(0.12, 0.37, 0.12);
  const boxGeo16 = new THREE.BoxGeometry(0.13, 2.79, 0.13);
  const cylinderGeo = new THREE.CylinderGeometry(0.06, 0.06, 0.5088, 3, 1, true);
  const cylinderGeo2 = new THREE.CylinderGeometry(0.06, 0.06, 1.0059, 3, 1, true);
  const cylinderGeo3 = new THREE.CylinderGeometry(0.06, 0.06, 1.5031, 3, 1, true);
  const cylinderGeo4 = new THREE.CylinderGeometry(0.06, 0.06, 1.9183, 3, 1, true);
  const boxGeo17 = new THREE.BoxGeometry(11.625, 0.1, 0.12);
  const cylinderGeo5 = new THREE.CylinderGeometry(0.06, 0.06, 0.7869, 3, 1, true);
  const cylinderGeo6 = new THREE.CylinderGeometry(0.06, 0.06, 1.5077, 3, 1, true);
  const cylinderGeo7 = new THREE.CylinderGeometry(0.06, 0.06, 2.2285, 3, 1, true);
  const cylinderGeo8 = new THREE.CylinderGeometry(0.06, 0.06, 2.2708, 3, 1, true);
  const boxGeo18 = new THREE.BoxGeometry(9.393, 0.1, 0.12);
  const boxGeo19 = new THREE.BoxGeometry(0.2, 3.253, 0.2);
  const boxGeo20 = new THREE.BoxGeometry(0.22, 0.3, 0.22);
  const extrudeGeo = extrude([[-2.98, 0], [2.98, 0], [0, 1.9938]], 0.12);
  const boxGeo21 = new THREE.BoxGeometry(0.14, 0.2, 6.06);
  const boxGeo22 = new THREE.BoxGeometry(0.05, 0.8747, 0.09);
  const boxGeo23 = new THREE.BoxGeometry(0.05, 1.9438, 0.09);
  const boxGeo24 = new THREE.BoxGeometry(0.05, 0.08, 3.636);
  const boxGeo25 = new THREE.BoxGeometry(0.08, 0.45, 0.35);
  const boxGeo26 = new THREE.BoxGeometry(7.8, 0.14, 4.0848);
  const cylinderGeo9 = new THREE.CylinderGeometry(0.06, 0.06, 4.0048, 3, 1, true);
  const boxGeo27 = new THREE.BoxGeometry(7.84, 0.1, 0.14);
  const boxGeo28 = new THREE.BoxGeometry(0.12, 0.16, 4.0848);
  const boxGeo29 = new THREE.BoxGeometry(0.3, 0.7, 0.55);
  const boxGeo30 = new THREE.BoxGeometry(0.2, 0.18, 0.38);

  // Parts
  const crawlspace = new THREE.Mesh(new THREE.BoxGeometry(9.3, 0.51, 6.9), darkMat);
  crawlspace.name = 'crawlspace';
  crawlspace.position.set(0, 0.255, 0);
  root.add(crawlspace);
  const floorBeam = new THREE.Mesh(new THREE.BoxGeometry(9.8, 0.14, 7.4), woodMat);
  floorBeam.name = 'floorBeam';
  floorBeam.position.set(0, 0.58, 0);
  root.add(floorBeam);
  const footingStone = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -12), stoneMat);
  footingStone.name = 'footingStone';
  footingStone.position.set(-4.72, 0.091, 3.52);
  footingStone.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone);
  const stiltPost = new THREE.Mesh(boxGeo, woodMat);
  stiltPost.name = 'stiltPost';
  stiltPost.position.set(-4.72, 0.305, 3.52);
  root.add(stiltPost);
  const footingStone2 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -82), stoneMat);
  footingStone2.name = 'footingStone';
  footingStone2.position.set(-4.72, 0.0974, -3.52);
  footingStone2.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone2);
  const stiltPost2 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost2.name = 'stiltPost';
  stiltPost2.position.set(-4.72, 0.305, -3.52);
  root.add(stiltPost2);
  const footingStone3 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 7), stoneMat);
  footingStone3.name = 'footingStone';
  footingStone3.position.set(-2.832, 0.0951, 3.52);
  footingStone3.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone3);
  const stiltPost3 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost3.name = 'stiltPost';
  stiltPost3.position.set(-2.832, 0.305, 3.52);
  root.add(stiltPost3);
  const footingStone4 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -64), stoneMat);
  footingStone4.name = 'footingStone';
  footingStone4.position.set(-2.832, 0.1008, -3.52);
  footingStone4.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone4);
  const stiltPost4 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost4.name = 'stiltPost';
  stiltPost4.position.set(-2.832, 0.305, -3.52);
  root.add(stiltPost4);
  const footingStone5 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 26), stoneMat);
  footingStone5.name = 'footingStone';
  footingStone5.position.set(-0.944, 0.0959, 3.52);
  footingStone5.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone5);
  const stiltPost5 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost5.name = 'stiltPost';
  stiltPost5.position.set(-0.944, 0.305, 3.52);
  root.add(stiltPost5);
  const footingStone6 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -45), stoneMat);
  footingStone6.name = 'footingStone';
  footingStone6.position.set(-0.944, 0.0989, -3.52);
  footingStone6.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone6);
  const stiltPost6 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost6.name = 'stiltPost';
  stiltPost6.position.set(-0.944, 0.305, -3.52);
  root.add(stiltPost6);
  const footingStone7 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 45), stoneMat);
  footingStone7.name = 'footingStone';
  footingStone7.position.set(0.944, 0.1083, 3.52);
  footingStone7.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone7);
  const stiltPost7 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost7.name = 'stiltPost';
  stiltPost7.position.set(0.944, 0.305, 3.52);
  root.add(stiltPost7);
  const footingStone8 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -26), stoneMat);
  footingStone8.name = 'footingStone';
  footingStone8.position.set(0.944, 0.1053, -3.52);
  footingStone8.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone8);
  const stiltPost8 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost8.name = 'stiltPost';
  stiltPost8.position.set(0.944, 0.305, -3.52);
  root.add(stiltPost8);
  const footingStone9 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 64), stoneMat);
  footingStone9.name = 'footingStone';
  footingStone9.position.set(2.832, 0.1018, 3.52);
  footingStone9.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone9);
  const stiltPost9 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost9.name = 'stiltPost';
  stiltPost9.position.set(2.832, 0.305, 3.52);
  root.add(stiltPost9);
  const footingStone10 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -7), stoneMat);
  footingStone10.name = 'footingStone';
  footingStone10.position.set(2.832, 0.0922, -3.52);
  footingStone10.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone10);
  const stiltPost10 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost10.name = 'stiltPost';
  stiltPost10.position.set(2.832, 0.305, -3.52);
  root.add(stiltPost10);
  const footingStone11 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 82), stoneMat);
  footingStone11.name = 'footingStone';
  footingStone11.position.set(4.72, 0.0982, 3.52);
  footingStone11.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone11);
  const stiltPost11 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost11.name = 'stiltPost';
  stiltPost11.position.set(4.72, 0.305, 3.52);
  root.add(stiltPost11);
  const footingStone12 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 12), stoneMat);
  footingStone12.name = 'footingStone';
  footingStone12.position.set(4.72, 0.0893, -3.52);
  footingStone12.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone12);
  const stiltPost12 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost12.name = 'stiltPost';
  stiltPost12.position.set(4.72, 0.305, -3.52);
  root.add(stiltPost12);
  const footingStone13 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 30), stoneMat);
  footingStone13.name = 'footingStone';
  footingStone13.position.set(4.72, 0.0835, -1.76);
  footingStone13.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone13);
  const stiltPost13 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost13.name = 'stiltPost';
  stiltPost13.position.set(4.72, 0.305, -1.76);
  root.add(stiltPost13);
  const footingStone14 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -65), stoneMat);
  footingStone14.name = 'footingStone';
  footingStone14.position.set(-4.72, 0.1028, -1.76);
  footingStone14.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone14);
  const stiltPost14 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost14.name = 'stiltPost';
  stiltPost14.position.set(-4.72, 0.305, -1.76);
  root.add(stiltPost14);
  const footingStone15 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 47), stoneMat);
  footingStone15.name = 'footingStone';
  footingStone15.position.set(4.72, 0.0892, 0);
  footingStone15.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone15);
  const stiltPost15 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost15.name = 'stiltPost';
  stiltPost15.position.set(4.72, 0.305, 0);
  root.add(stiltPost15);
  const footingStone16 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -47), stoneMat);
  footingStone16.name = 'footingStone';
  footingStone16.position.set(-4.72, 0.0956, 0);
  footingStone16.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone16);
  const stiltPost16 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost16.name = 'stiltPost';
  stiltPost16.position.set(-4.72, 0.305, 0);
  root.add(stiltPost16);
  const footingStone17 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, 65), stoneMat);
  footingStone17.name = 'footingStone';
  footingStone17.position.set(4.72, 0.0997, 1.76);
  footingStone17.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone17);
  const stiltPost17 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost17.name = 'stiltPost';
  stiltPost17.position.set(4.72, 0.305, 1.76);
  root.add(stiltPost17);
  const footingStone18 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.19, 0), 0.03, -30), stoneMat);
  footingStone18.name = 'footingStone';
  footingStone18.position.set(-4.72, 0.1027, 1.76);
  footingStone18.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone18);
  const stiltPost18 = new THREE.Mesh(boxGeo, woodMat);
  stiltPost18.name = 'stiltPost';
  stiltPost18.position.set(-4.72, 0.305, 1.76);
  root.add(stiltPost18);
  const walls = new THREE.Mesh(new THREE.BoxGeometry(9.6, 2.75, 7.2), plasterMat);
  walls.name = 'walls';
  walls.position.set(0, 2.025, 0);
  root.add(walls);
  const post = new THREE.Mesh(boxGeo2, woodMat);
  post.name = 'post';
  post.position.set(-4.72, 2.025, 3.52);
  root.add(post);
  const post2 = new THREE.Mesh(boxGeo2, woodMat);
  post2.name = 'post';
  post2.position.set(-4.72, 2.025, -3.52);
  root.add(post2);
  const post3 = new THREE.Mesh(boxGeo2, woodMat);
  post3.name = 'post';
  post3.position.set(-2.832, 2.025, 3.52);
  root.add(post3);
  const post4 = new THREE.Mesh(boxGeo2, woodMat);
  post4.name = 'post';
  post4.position.set(-2.832, 2.025, -3.52);
  root.add(post4);
  const post5 = new THREE.Mesh(boxGeo2, woodMat);
  post5.name = 'post';
  post5.position.set(-0.944, 2.025, 3.52);
  root.add(post5);
  const post6 = new THREE.Mesh(boxGeo2, woodMat);
  post6.name = 'post';
  post6.position.set(-0.944, 2.025, -3.52);
  root.add(post6);
  const post7 = new THREE.Mesh(boxGeo2, woodMat);
  post7.name = 'post';
  post7.position.set(0.944, 2.025, 3.52);
  root.add(post7);
  const post8 = new THREE.Mesh(boxGeo2, woodMat);
  post8.name = 'post';
  post8.position.set(0.944, 2.025, -3.52);
  root.add(post8);
  const post9 = new THREE.Mesh(boxGeo2, woodMat);
  post9.name = 'post';
  post9.position.set(2.832, 2.025, 3.52);
  root.add(post9);
  const post10 = new THREE.Mesh(boxGeo2, woodMat);
  post10.name = 'post';
  post10.position.set(2.832, 2.025, -3.52);
  root.add(post10);
  const post11 = new THREE.Mesh(boxGeo2, woodMat);
  post11.name = 'post';
  post11.position.set(4.72, 2.025, 3.52);
  root.add(post11);
  const post12 = new THREE.Mesh(boxGeo2, woodMat);
  post12.name = 'post';
  post12.position.set(4.72, 2.025, -3.52);
  root.add(post12);
  const post13 = new THREE.Mesh(boxGeo2, woodMat);
  post13.name = 'post';
  post13.position.set(4.72, 2.025, -1.76);
  root.add(post13);
  const post14 = new THREE.Mesh(boxGeo2, woodMat);
  post14.name = 'post';
  post14.position.set(-4.72, 2.025, -1.76);
  root.add(post14);
  const post15 = new THREE.Mesh(boxGeo2, woodMat);
  post15.name = 'post';
  post15.position.set(4.72, 2.025, 0);
  root.add(post15);
  const post16 = new THREE.Mesh(boxGeo2, woodMat);
  post16.name = 'post';
  post16.position.set(-4.72, 2.025, 0);
  root.add(post16);
  const post17 = new THREE.Mesh(boxGeo2, woodMat);
  post17.name = 'post';
  post17.position.set(4.72, 2.025, 1.76);
  root.add(post17);
  const post18 = new THREE.Mesh(boxGeo2, woodMat);
  post18.name = 'post';
  post18.position.set(-4.72, 2.025, 1.76);
  root.add(post18);
  const nageshi = new THREE.Mesh(new THREE.BoxGeometry(9.66, 0.16, 7.26), woodMat);
  nageshi.name = 'nageshi';
  nageshi.position.set(0, 2.65, 0);
  root.add(nageshi);
  const eaveBeam = new THREE.Mesh(new THREE.BoxGeometry(9.66, 0.22, 7.26), woodMat);
  eaveBeam.name = 'eaveBeam';
  eaveBeam.position.set(0, 3.29, 0);
  root.add(eaveBeam);
  const sill = new THREE.Mesh(new THREE.BoxGeometry(9.64, 0.12, 7.24), woodMat);
  sill.name = 'sill';
  sill.position.set(0, 0.71, 0);
  root.add(sill);
  const frontWall = new THREE.Group();
  frontWall.name = 'frontWall';
  frontWall.position.set(0, 0, 3.6);
  root.add(frontWall);
  const shoji = new THREE.Mesh(boxGeo3, paperMat);
  shoji.name = 'shoji';
  shoji.position.set(-3.776, 1.66, 0.02);
  frontWall.add(shoji);
  const koshiPanel = new THREE.Mesh(boxGeo4, woodMat);
  koshiPanel.name = 'koshiPanel';
  koshiPanel.position.set(-3.776, 0.95, 0.04);
  frontWall.add(koshiPanel);
  const shojiStile = new THREE.Mesh(boxGeo5, woodMat);
  shojiStile.name = 'shojiStile';
  shojiStile.position.set(-3.776, 1.66, 0.05);
  frontWall.add(shojiStile);
  const kumiko = new THREE.Mesh(boxGeo6, woodMat);
  kumiko.name = 'kumiko';
  kumiko.position.set(-4.203, 1.83, 0.05);
  frontWall.add(kumiko);
  const kumiko2 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko2.name = 'kumiko';
  kumiko2.position.set(-3.349, 1.83, 0.05);
  frontWall.add(kumiko2);
  const shoji2 = new THREE.Mesh(boxGeo3, paperMat);
  shoji2.name = 'shoji';
  shoji2.position.set(-1.888, 1.66, 0.02);
  frontWall.add(shoji2);
  const koshiPanel2 = new THREE.Mesh(boxGeo4, woodMat);
  koshiPanel2.name = 'koshiPanel';
  koshiPanel2.position.set(-1.888, 0.95, 0.04);
  frontWall.add(koshiPanel2);
  const shojiStile2 = new THREE.Mesh(boxGeo5, woodMat);
  shojiStile2.name = 'shojiStile';
  shojiStile2.position.set(-1.888, 1.66, 0.05);
  frontWall.add(shojiStile2);
  const kumiko3 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko3.name = 'kumiko';
  kumiko3.position.set(-2.315, 1.83, 0.05);
  frontWall.add(kumiko3);
  const kumiko4 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko4.name = 'kumiko';
  kumiko4.position.set(-1.461, 1.83, 0.05);
  frontWall.add(kumiko4);
  const openingInterior = new THREE.Mesh(new THREE.BoxGeometry(1.708, 1.78, 0.02), darkMat);
  openingInterior.name = 'openingInterior';
  openingInterior.position.set(0, 1.66, 0.01);
  frontWall.add(openingInterior);
  const shojiSlid = new THREE.Mesh(new THREE.BoxGeometry(0.854, 1.78, 0.04), paperMat);
  shojiSlid.name = 'shojiSlid';
  shojiSlid.position.set(0.427, 1.66, 0.05);
  frontWall.add(shojiSlid);
  const shoji3 = new THREE.Mesh(boxGeo3, paperMat);
  shoji3.name = 'shoji';
  shoji3.position.set(1.888, 1.66, 0.02);
  frontWall.add(shoji3);
  const koshiPanel3 = new THREE.Mesh(boxGeo4, woodMat);
  koshiPanel3.name = 'koshiPanel';
  koshiPanel3.position.set(1.888, 0.95, 0.04);
  frontWall.add(koshiPanel3);
  const shojiStile3 = new THREE.Mesh(boxGeo5, woodMat);
  shojiStile3.name = 'shojiStile';
  shojiStile3.position.set(1.888, 1.66, 0.05);
  frontWall.add(shojiStile3);
  const kumiko5 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko5.name = 'kumiko';
  kumiko5.position.set(1.461, 1.83, 0.05);
  frontWall.add(kumiko5);
  const kumiko6 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko6.name = 'kumiko';
  kumiko6.position.set(2.315, 1.83, 0.05);
  frontWall.add(kumiko6);
  const shoji4 = new THREE.Mesh(boxGeo3, paperMat);
  shoji4.name = 'shoji';
  shoji4.position.set(3.776, 1.66, 0.02);
  frontWall.add(shoji4);
  const koshiPanel4 = new THREE.Mesh(boxGeo4, woodMat);
  koshiPanel4.name = 'koshiPanel';
  koshiPanel4.position.set(3.776, 0.95, 0.04);
  frontWall.add(koshiPanel4);
  const shojiStile4 = new THREE.Mesh(boxGeo5, woodMat);
  shojiStile4.name = 'shojiStile';
  shojiStile4.position.set(3.776, 1.66, 0.05);
  frontWall.add(shojiStile4);
  const kumiko7 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko7.name = 'kumiko';
  kumiko7.position.set(3.349, 1.83, 0.05);
  frontWall.add(kumiko7);
  const kumiko8 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko8.name = 'kumiko';
  kumiko8.position.set(4.203, 1.83, 0.05);
  frontWall.add(kumiko8);
  const kumikoRail = new THREE.Mesh(boxGeo7, woodMat);
  kumikoRail.name = 'kumikoRail';
  kumikoRail.position.set(0, 1.55, 0.05);
  frontWall.add(kumikoRail);
  const kumikoRail2 = new THREE.Mesh(boxGeo7, woodMat);
  kumikoRail2.name = 'kumikoRail';
  kumikoRail2.position.set(0, 2, 0.05);
  frontWall.add(kumikoRail2);
  const backWall = new THREE.Group();
  backWall.name = 'backWall';
  backWall.position.set(0, 0, -3.6);
  backWall.rotation.set(0, deg(180), 0);
  root.add(backWall);
  const koshiita = new THREE.Mesh(new THREE.BoxGeometry(9.5, 1, 0.04), woodMat);
  koshiita.name = 'koshiita';
  koshiita.position.set(0, 1.27, 0.02);
  backWall.add(koshiita);
  const latticeWindow = new THREE.Mesh(new THREE.BoxGeometry(1.4, 0.7, 0.04), paperMat);
  latticeWindow.name = 'latticeWindow';
  latticeWindow.position.set(-1.2, 2.15, 0.03);
  backWall.add(latticeWindow);
  const lattice = new THREE.Mesh(boxGeo8, woodMat);
  lattice.name = 'lattice';
  lattice.position.set(-1.62, 2.15, 0.05);
  backWall.add(lattice);
  const lattice2 = new THREE.Mesh(boxGeo8, woodMat);
  lattice2.name = 'lattice';
  lattice2.position.set(-1.34, 2.15, 0.05);
  backWall.add(lattice2);
  const lattice3 = new THREE.Mesh(boxGeo8, woodMat);
  lattice3.name = 'lattice';
  lattice3.position.set(-1.06, 2.15, 0.05);
  backWall.add(lattice3);
  const lattice4 = new THREE.Mesh(boxGeo8, woodMat);
  lattice4.name = 'lattice';
  lattice4.position.set(-0.78, 2.15, 0.05);
  backWall.add(lattice4);
  const latticeFrame = new THREE.Mesh(boxGeo9, woodMat);
  latticeFrame.name = 'latticeFrame';
  latticeFrame.position.set(-1.2, 2.53, 0.05);
  backWall.add(latticeFrame);
  const latticeFrame2 = new THREE.Mesh(boxGeo9, woodMat);
  latticeFrame2.name = 'latticeFrame';
  latticeFrame2.position.set(-1.2, 1.77, 0.05);
  backWall.add(latticeFrame2);
  const leftWall = new THREE.Group();
  leftWall.name = 'leftWall';
  leftWall.position.set(-4.8, 0, 0);
  leftWall.rotation.set(0, deg(-90), 0);
  root.add(leftWall);
  const koshiita2 = new THREE.Mesh(new THREE.BoxGeometry(7, 1, 0.04), woodMat);
  koshiita2.name = 'koshiita';
  koshiita2.position.set(0, 1.27, 0.02);
  leftWall.add(koshiita2);
  const latticeWindow2 = new THREE.Mesh(new THREE.BoxGeometry(1.6, 0.6, 0.04), paperMat);
  latticeWindow2.name = 'latticeWindow';
  latticeWindow2.position.set(0.6, 2.15, 0.03);
  leftWall.add(latticeWindow2);
  const lattice5 = new THREE.Mesh(boxGeo10, woodMat);
  lattice5.name = 'lattice';
  lattice5.position.set(0.07, 2.15, 0.05);
  leftWall.add(lattice5);
  const lattice6 = new THREE.Mesh(boxGeo10, woodMat);
  lattice6.name = 'lattice';
  lattice6.position.set(0.34, 2.15, 0.05);
  leftWall.add(lattice6);
  const lattice7 = new THREE.Mesh(boxGeo10, woodMat);
  lattice7.name = 'lattice';
  lattice7.position.set(0.61, 2.15, 0.05);
  leftWall.add(lattice7);
  const lattice8 = new THREE.Mesh(boxGeo10, woodMat);
  lattice8.name = 'lattice';
  lattice8.position.set(0.88, 2.15, 0.05);
  leftWall.add(lattice8);
  const lattice9 = new THREE.Mesh(boxGeo10, woodMat);
  lattice9.name = 'lattice';
  lattice9.position.set(1.15, 2.15, 0.05);
  leftWall.add(lattice9);
  const rightWall = new THREE.Group();
  rightWall.name = 'rightWall';
  rightWall.position.set(4.8, 0, 0);
  rightWall.rotation.set(0, deg(90), 0);
  root.add(rightWall);
  const shoji5 = new THREE.Mesh(boxGeo11, paperMat);
  shoji5.name = 'shoji';
  shoji5.position.set(-2.64, 1.66, 0.02);
  rightWall.add(shoji5);
  const koshiPanel5 = new THREE.Mesh(boxGeo12, woodMat);
  koshiPanel5.name = 'koshiPanel';
  koshiPanel5.position.set(-2.64, 0.95, 0.04);
  rightWall.add(koshiPanel5);
  const shojiStile5 = new THREE.Mesh(boxGeo5, woodMat);
  shojiStile5.name = 'shojiStile';
  shojiStile5.position.set(-2.64, 1.66, 0.05);
  rightWall.add(shojiStile5);
  const kumiko9 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko9.name = 'kumiko';
  kumiko9.position.set(-3.035, 1.83, 0.05);
  rightWall.add(kumiko9);
  const kumiko10 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko10.name = 'kumiko';
  kumiko10.position.set(-2.245, 1.83, 0.05);
  rightWall.add(kumiko10);
  const shoji6 = new THREE.Mesh(boxGeo11, paperMat);
  shoji6.name = 'shoji';
  shoji6.position.set(-0.88, 1.66, 0.02);
  rightWall.add(shoji6);
  const koshiPanel6 = new THREE.Mesh(boxGeo12, woodMat);
  koshiPanel6.name = 'koshiPanel';
  koshiPanel6.position.set(-0.88, 0.95, 0.04);
  rightWall.add(koshiPanel6);
  const shojiStile6 = new THREE.Mesh(boxGeo5, woodMat);
  shojiStile6.name = 'shojiStile';
  shojiStile6.position.set(-0.88, 1.66, 0.05);
  rightWall.add(shojiStile6);
  const kumiko11 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko11.name = 'kumiko';
  kumiko11.position.set(-1.275, 1.83, 0.05);
  rightWall.add(kumiko11);
  const kumiko12 = new THREE.Mesh(boxGeo6, woodMat);
  kumiko12.name = 'kumiko';
  kumiko12.position.set(-0.485, 1.83, 0.05);
  rightWall.add(kumiko12);
  const kumikoRail3 = new THREE.Mesh(boxGeo13, woodMat);
  kumikoRail3.name = 'kumikoRail';
  kumikoRail3.position.set(-1.76, 1.55, 0.05);
  rightWall.add(kumikoRail3);
  const kumikoRail4 = new THREE.Mesh(boxGeo13, woodMat);
  kumikoRail4.name = 'kumikoRail';
  kumikoRail4.position.set(-1.76, 2, 0.05);
  rightWall.add(kumikoRail4);
  const koshiita3 = new THREE.Mesh(new THREE.BoxGeometry(3.4, 1, 0.04), woodMat);
  koshiita3.name = 'koshiita';
  koshiita3.position.set(1.85, 1.27, 0.02);
  rightWall.add(koshiita3);
  const maruMado = new THREE.Mesh(new THREE.CylinderGeometry(0.5, 0.5, 0.04, 14), paperMat);
  maruMado.name = 'maruMado';
  maruMado.position.set(1.85, 2.25, 0.03);
  maruMado.rotation.set(deg(90), 0, 0);
  rightWall.add(maruMado);
  const maruMadoFrame = new THREE.Mesh(new THREE.TorusGeometry(0.5, 0.06, 3, 12), woodMat);
  maruMadoFrame.name = 'maruMadoFrame';
  maruMadoFrame.position.set(1.85, 2.25, 0.05);
  rightWall.add(maruMadoFrame);
  const lattice10 = new THREE.Mesh(new THREE.BoxGeometry(0.025, 0.95, 0.03), woodMat);
  lattice10.name = 'lattice';
  lattice10.position.set(1.85, 2.25, 0.06);
  rightWall.add(lattice10);
  const lattice11 = new THREE.Mesh(new THREE.BoxGeometry(0.95, 0.025, 0.03), woodMat);
  lattice11.name = 'lattice';
  lattice11.position.set(1.85, 2.25, 0.06);
  rightWall.add(lattice11);
  const engawaFront = new THREE.Mesh(new THREE.BoxGeometry(10.55, 0.08, 0.95), deckMat);
  engawaFront.name = 'engawaFront';
  engawaFront.position.set(0.475, 0.57, 4.075);
  root.add(engawaFront);
  const engawaSide = new THREE.Mesh(new THREE.BoxGeometry(0.95, 0.08, 7.2), deckMat);
  engawaSide.name = 'engawaSide';
  engawaSide.position.set(5.275, 0.57, 0);
  root.add(engawaSide);
  const deckSeam = new THREE.Mesh(boxGeo14, woodMat);
  deckSeam.name = 'deckSeam';
  deckSeam.position.set(0.475, 0.615, 3.8375);
  root.add(deckSeam);
  const deckSeam2 = new THREE.Mesh(boxGeo14, woodMat);
  deckSeam2.name = 'deckSeam';
  deckSeam2.position.set(0.475, 0.615, 4.075);
  root.add(deckSeam2);
  const deckSeam3 = new THREE.Mesh(boxGeo14, woodMat);
  deckSeam3.name = 'deckSeam';
  deckSeam3.position.set(0.475, 0.615, 4.3125);
  root.add(deckSeam3);
  const engawaEdge = new THREE.Mesh(new THREE.BoxGeometry(10.59, 0.1, 0.08), woodMat);
  engawaEdge.name = 'engawaEdge';
  engawaEdge.position.set(0.475, 0.48, 4.55);
  root.add(engawaEdge);
  const engawaEdge2 = new THREE.Mesh(new THREE.BoxGeometry(0.08, 0.1, 8.15), woodMat);
  engawaEdge2.name = 'engawaEdge';
  engawaEdge2.position.set(5.75, 0.48, 0.475);
  root.add(engawaEdge2);
  const footingStone19 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, -92), stoneMat);
  footingStone19.name = 'footingStone';
  footingStone19.position.set(-4.72, 0.0702, 4.45);
  footingStone19.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone19);
  const deckPost = new THREE.Mesh(boxGeo15, woodMat);
  deckPost.name = 'deckPost';
  deckPost.position.set(-4.72, 0.245, 4.45);
  root.add(deckPost);
  const footingStone20 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, -73), stoneMat);
  footingStone20.name = 'footingStone';
  footingStone20.position.set(-2.832, 0.073, 4.45);
  footingStone20.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone20);
  const deckPost2 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost2.name = 'deckPost';
  deckPost2.position.set(-2.832, 0.245, 4.45);
  root.add(deckPost2);
  const footingStone21 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, -54), stoneMat);
  footingStone21.name = 'footingStone';
  footingStone21.position.set(-0.944, 0.0916, 4.45);
  footingStone21.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone21);
  const deckPost3 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost3.name = 'deckPost';
  deckPost3.position.set(-0.944, 0.245, 4.45);
  root.add(deckPost3);
  const footingStone22 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, -35), stoneMat);
  footingStone22.name = 'footingStone';
  footingStone22.position.set(0.944, 0.0896, 4.45);
  footingStone22.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone22);
  const deckPost4 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost4.name = 'deckPost';
  deckPost4.position.set(0.944, 0.245, 4.45);
  root.add(deckPost4);
  const footingStone23 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, -16), stoneMat);
  footingStone23.name = 'footingStone';
  footingStone23.position.set(2.832, 0.0763, 4.45);
  footingStone23.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone23);
  const deckPost5 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost5.name = 'deckPost';
  deckPost5.position.set(2.832, 0.245, 4.45);
  root.add(deckPost5);
  const footingStone24 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, 3), stoneMat);
  footingStone24.name = 'footingStone';
  footingStone24.position.set(4.72, 0.0985, 4.45);
  footingStone24.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone24);
  const deckPost6 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost6.name = 'deckPost';
  deckPost6.position.set(4.72, 0.245, 4.45);
  root.add(deckPost6);
  const footingStone25 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, 12), stoneMat);
  footingStone25.name = 'footingStone';
  footingStone25.position.set(5.65, 0.089, 4.45);
  footingStone25.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone25);
  const deckPost7 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost7.name = 'deckPost';
  deckPost7.position.set(5.65, 0.245, 4.45);
  root.add(deckPost7);
  const footingStone26 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, 92), stoneMat);
  footingStone26.name = 'footingStone';
  footingStone26.position.set(5.65, 0.0824, -3.52);
  footingStone26.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone26);
  const deckPost8 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost8.name = 'deckPost';
  deckPost8.position.set(5.65, 0.245, -3.52);
  root.add(deckPost8);
  const footingStone27 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, 74), stoneMat);
  footingStone27.name = 'footingStone';
  footingStone27.position.set(5.65, 0.0857, -1.76);
  footingStone27.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone27);
  const deckPost9 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost9.name = 'deckPost';
  deckPost9.position.set(5.65, 0.245, -1.76);
  root.add(deckPost9);
  const footingStone28 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, 57), stoneMat);
  footingStone28.name = 'footingStone';
  footingStone28.position.set(5.65, 0.0764, 0);
  footingStone28.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone28);
  const deckPost10 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost10.name = 'deckPost';
  deckPost10.position.set(5.65, 0.245, 0);
  root.add(deckPost10);
  const footingStone29 = new THREE.Mesh(jitter(new THREE.OctahedronGeometry(0.17, 0), 0.03, 39), stoneMat);
  footingStone29.name = 'footingStone';
  footingStone29.position.set(5.65, 0.0832, 1.76);
  footingStone29.scale.set(1.1, 0.5, 1.1);
  root.add(footingStone29);
  const deckPost11 = new THREE.Mesh(boxGeo15, woodMat);
  deckPost11.name = 'deckPost';
  deckPost11.position.set(5.65, 0.245, 1.76);
  root.add(deckPost11);
  const eavePost = new THREE.Mesh(boxGeo16, woodMat);
  eavePost.name = 'eavePost';
  eavePost.position.set(-4.72, 2.005, 4.45);
  root.add(eavePost);
  const eavePost2 = new THREE.Mesh(boxGeo16, woodMat);
  eavePost2.name = 'eavePost';
  eavePost2.position.set(0, 2.005, 4.45);
  root.add(eavePost2);
  const eavePost3 = new THREE.Mesh(boxGeo16, woodMat);
  eavePost3.name = 'eavePost';
  eavePost3.position.set(5.65, 2.005, 4.45);
  root.add(eavePost3);
  const eavePost4 = new THREE.Mesh(boxGeo16, woodMat);
  eavePost4.name = 'eavePost';
  eavePost4.position.set(5.65, 2.005, -3.5);
  root.add(eavePost4);
  const steppingStone = new THREE.Mesh(jitter(new THREE.DodecahedronGeometry(0.5, 0), 0.04, 5), stoneMat);
  steppingStone.name = 'steppingStone';
  steppingStone.position.set(0.6, 0.1994, 5);
  steppingStone.scale.set(1.4, 0.4, 0.9);
  root.add(steppingStone);
  const soffit = new THREE.Mesh(new THREE.BoxGeometry(12.5, 0.06, 10.1), woodMat);
  soffit.name = 'soffit';
  soffit.position.set(0, 3.43, 0);
  root.add(soffit);
  const hipSkirt = new THREE.Mesh(lathe([[1.4142, 0], [1.4142, 0.18], [1.3152, 0.3], [0.8485, 1.25]], 4, Math.PI / 4, Math.PI * 2), roofMat);
  hipSkirt.name = 'hipSkirt';
  hipSkirt.position.set(0, 3.4, 0);
  hipSkirt.scale.set(6.25, 1, 5.05);
  root.add(hipSkirt);
  const skirtCap = new THREE.Mesh(new THREE.BoxGeometry(7.55, 0.05, 6.11), roofMat);
  skirtCap.name = 'skirtCap';
  skirtCap.position.set(0, 4.615, 0);
  root.add(skirtCap);
  const skirtTiles = new THREE.Group();
  skirtTiles.name = 'skirtTiles';
  root.add(skirtTiles);
  const tileRib = new THREE.Mesh(cylinderGeo, roofMat);
  tileRib.name = 'tileRib';
  tileRib.position.set(-5.078, 3.866, 4.4755);
  tileRib.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib);
  const tileRib2 = new THREE.Mesh(cylinderGeo2, roofMat);
  tileRib2.name = 'tileRib';
  tileRib2.position.set(-4.5435, 3.9891, 4.2596);
  tileRib2.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib2);
  const tileRib3 = new THREE.Mesh(cylinderGeo3, roofMat);
  tileRib3.name = 'tileRib';
  tileRib3.position.set(-4.0089, 4.1122, 4.0436);
  tileRib3.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib3);
  const tileRib4 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib4.name = 'tileRib';
  tileRib4.position.set(-3.4744, 4.215, 3.8633);
  tileRib4.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib4);
  const tileRib5 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib5.name = 'tileRib';
  tileRib5.position.set(-2.9399, 4.215, 3.8633);
  tileRib5.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib5);
  const tileRib6 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib6.name = 'tileRib';
  tileRib6.position.set(-2.4054, 4.215, 3.8633);
  tileRib6.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib6);
  const tileRib7 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib7.name = 'tileRib';
  tileRib7.position.set(-1.8708, 4.215, 3.8633);
  tileRib7.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib7);
  const tileRib8 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib8.name = 'tileRib';
  tileRib8.position.set(-1.3363, 4.215, 3.8633);
  tileRib8.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib8);
  const tileRib9 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib9.name = 'tileRib';
  tileRib9.position.set(-0.8018, 4.215, 3.8633);
  tileRib9.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib9);
  const tileRib10 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib10.name = 'tileRib';
  tileRib10.position.set(-0.2673, 4.215, 3.8633);
  tileRib10.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib10);
  const tileRib11 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib11.name = 'tileRib';
  tileRib11.position.set(0.2673, 4.215, 3.8633);
  tileRib11.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib11);
  const tileRib12 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib12.name = 'tileRib';
  tileRib12.position.set(0.8018, 4.215, 3.8633);
  tileRib12.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib12);
  const tileRib13 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib13.name = 'tileRib';
  tileRib13.position.set(1.3363, 4.215, 3.8633);
  tileRib13.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib13);
  const tileRib14 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib14.name = 'tileRib';
  tileRib14.position.set(1.8708, 4.215, 3.8633);
  tileRib14.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib14);
  const tileRib15 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib15.name = 'tileRib';
  tileRib15.position.set(2.4054, 4.215, 3.8633);
  tileRib15.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib15);
  const tileRib16 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib16.name = 'tileRib';
  tileRib16.position.set(2.9399, 4.215, 3.8633);
  tileRib16.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib16);
  const tileRib17 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib17.name = 'tileRib';
  tileRib17.position.set(3.4744, 4.215, 3.8633);
  tileRib17.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib17);
  const tileRib18 = new THREE.Mesh(cylinderGeo3, roofMat);
  tileRib18.name = 'tileRib';
  tileRib18.position.set(4.0089, 4.1122, 4.0436);
  tileRib18.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib18);
  const tileRib19 = new THREE.Mesh(cylinderGeo2, roofMat);
  tileRib19.name = 'tileRib';
  tileRib19.position.set(4.5435, 3.9891, 4.2596);
  tileRib19.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib19);
  const tileRib20 = new THREE.Mesh(cylinderGeo, roofMat);
  tileRib20.name = 'tileRib';
  tileRib20.position.set(5.078, 3.866, 4.4755);
  tileRib20.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles.add(tileRib20);
  const eaveTiles = new THREE.Mesh(boxGeo17, ridgeMat);
  eaveTiles.name = 'eaveTiles';
  eaveTiles.position.set(0, 3.72, 4.7975);
  skirtTiles.add(eaveTiles);
  const skirtTiles2 = new THREE.Group();
  skirtTiles2.name = 'skirtTiles';
  skirtTiles2.rotation.set(0, deg(90), 0);
  root.add(skirtTiles2);
  const tileRib21 = new THREE.Mesh(cylinderGeo5, roofMat);
  tileRib21.name = 'tileRib';
  tileRib21.position.set(-3.9675, 3.9046, 5.4551);
  tileRib21.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib21);
  const tileRib22 = new THREE.Mesh(cylinderGeo6, roofMat);
  tileRib22.name = 'tileRib';
  tileRib22.position.set(-3.4385, 4.0554, 5.1278);
  tileRib22.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib22);
  const tileRib23 = new THREE.Mesh(cylinderGeo7, roofMat);
  tileRib23.name = 'tileRib';
  tileRib23.position.set(-2.9095, 4.2062, 4.8004);
  tileRib23.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib23);
  const tileRib24 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib24.name = 'tileRib';
  tileRib24.position.set(-2.3805, 4.215, 4.7813);
  tileRib24.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib24);
  const tileRib25 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib25.name = 'tileRib';
  tileRib25.position.set(-1.8515, 4.215, 4.7813);
  tileRib25.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib25);
  const tileRib26 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib26.name = 'tileRib';
  tileRib26.position.set(-1.3225, 4.215, 4.7813);
  tileRib26.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib26);
  const tileRib27 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib27.name = 'tileRib';
  tileRib27.position.set(-0.7935, 4.215, 4.7813);
  tileRib27.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib27);
  const tileRib28 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib28.name = 'tileRib';
  tileRib28.position.set(-0.2645, 4.215, 4.7813);
  tileRib28.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib28);
  const tileRib29 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib29.name = 'tileRib';
  tileRib29.position.set(0.2645, 4.215, 4.7813);
  tileRib29.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib29);
  const tileRib30 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib30.name = 'tileRib';
  tileRib30.position.set(0.7935, 4.215, 4.7813);
  tileRib30.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib30);
  const tileRib31 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib31.name = 'tileRib';
  tileRib31.position.set(1.3225, 4.215, 4.7813);
  tileRib31.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib31);
  const tileRib32 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib32.name = 'tileRib';
  tileRib32.position.set(1.8515, 4.215, 4.7813);
  tileRib32.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib32);
  const tileRib33 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib33.name = 'tileRib';
  tileRib33.position.set(2.3805, 4.215, 4.7813);
  tileRib33.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib33);
  const tileRib34 = new THREE.Mesh(cylinderGeo7, roofMat);
  tileRib34.name = 'tileRib';
  tileRib34.position.set(2.9095, 4.2062, 4.8004);
  tileRib34.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib34);
  const tileRib35 = new THREE.Mesh(cylinderGeo6, roofMat);
  tileRib35.name = 'tileRib';
  tileRib35.position.set(3.4385, 4.0554, 5.1278);
  tileRib35.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib35);
  const tileRib36 = new THREE.Mesh(cylinderGeo5, roofMat);
  tileRib36.name = 'tileRib';
  tileRib36.position.set(3.9675, 3.9046, 5.4551);
  tileRib36.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles2.add(tileRib36);
  const eaveTiles2 = new THREE.Mesh(boxGeo18, ridgeMat);
  eaveTiles2.name = 'eaveTiles';
  eaveTiles2.position.set(0, 3.72, 5.9375);
  skirtTiles2.add(eaveTiles2);
  const skirtTiles3 = new THREE.Group();
  skirtTiles3.name = 'skirtTiles';
  skirtTiles3.rotation.set(0, deg(180), 0);
  root.add(skirtTiles3);
  const tileRib37 = new THREE.Mesh(cylinderGeo, roofMat);
  tileRib37.name = 'tileRib';
  tileRib37.position.set(-5.078, 3.866, 4.4755);
  tileRib37.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib37);
  const tileRib38 = new THREE.Mesh(cylinderGeo2, roofMat);
  tileRib38.name = 'tileRib';
  tileRib38.position.set(-4.5435, 3.9891, 4.2596);
  tileRib38.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib38);
  const tileRib39 = new THREE.Mesh(cylinderGeo3, roofMat);
  tileRib39.name = 'tileRib';
  tileRib39.position.set(-4.0089, 4.1122, 4.0436);
  tileRib39.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib39);
  const tileRib40 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib40.name = 'tileRib';
  tileRib40.position.set(-3.4744, 4.215, 3.8633);
  tileRib40.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib40);
  const tileRib41 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib41.name = 'tileRib';
  tileRib41.position.set(-2.9399, 4.215, 3.8633);
  tileRib41.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib41);
  const tileRib42 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib42.name = 'tileRib';
  tileRib42.position.set(-2.4054, 4.215, 3.8633);
  tileRib42.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib42);
  const tileRib43 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib43.name = 'tileRib';
  tileRib43.position.set(-1.8708, 4.215, 3.8633);
  tileRib43.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib43);
  const tileRib44 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib44.name = 'tileRib';
  tileRib44.position.set(-1.3363, 4.215, 3.8633);
  tileRib44.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib44);
  const tileRib45 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib45.name = 'tileRib';
  tileRib45.position.set(-0.8018, 4.215, 3.8633);
  tileRib45.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib45);
  const tileRib46 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib46.name = 'tileRib';
  tileRib46.position.set(-0.2673, 4.215, 3.8633);
  tileRib46.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib46);
  const tileRib47 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib47.name = 'tileRib';
  tileRib47.position.set(0.2673, 4.215, 3.8633);
  tileRib47.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib47);
  const tileRib48 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib48.name = 'tileRib';
  tileRib48.position.set(0.8018, 4.215, 3.8633);
  tileRib48.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib48);
  const tileRib49 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib49.name = 'tileRib';
  tileRib49.position.set(1.3363, 4.215, 3.8633);
  tileRib49.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib49);
  const tileRib50 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib50.name = 'tileRib';
  tileRib50.position.set(1.8708, 4.215, 3.8633);
  tileRib50.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib50);
  const tileRib51 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib51.name = 'tileRib';
  tileRib51.position.set(2.4054, 4.215, 3.8633);
  tileRib51.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib51);
  const tileRib52 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib52.name = 'tileRib';
  tileRib52.position.set(2.9399, 4.215, 3.8633);
  tileRib52.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib52);
  const tileRib53 = new THREE.Mesh(cylinderGeo4, roofMat);
  tileRib53.name = 'tileRib';
  tileRib53.position.set(3.4744, 4.215, 3.8633);
  tileRib53.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib53);
  const tileRib54 = new THREE.Mesh(cylinderGeo3, roofMat);
  tileRib54.name = 'tileRib';
  tileRib54.position.set(4.0089, 4.1122, 4.0436);
  tileRib54.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib54);
  const tileRib55 = new THREE.Mesh(cylinderGeo2, roofMat);
  tileRib55.name = 'tileRib';
  tileRib55.position.set(4.5435, 3.9891, 4.2596);
  tileRib55.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib55);
  const tileRib56 = new THREE.Mesh(cylinderGeo, roofMat);
  tileRib56.name = 'tileRib';
  tileRib56.position.set(5.078, 3.866, 4.4755);
  tileRib56.rotation.set(deg(-60.3144), 0, 0);
  skirtTiles3.add(tileRib56);
  const eaveTiles3 = new THREE.Mesh(boxGeo17, ridgeMat);
  eaveTiles3.name = 'eaveTiles';
  eaveTiles3.position.set(0, 3.72, 4.7975);
  skirtTiles3.add(eaveTiles3);
  const skirtTiles4 = new THREE.Group();
  skirtTiles4.name = 'skirtTiles';
  skirtTiles4.rotation.set(0, deg(270), 0);
  root.add(skirtTiles4);
  const tileRib57 = new THREE.Mesh(cylinderGeo5, roofMat);
  tileRib57.name = 'tileRib';
  tileRib57.position.set(-3.9675, 3.9046, 5.4551);
  tileRib57.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib57);
  const tileRib58 = new THREE.Mesh(cylinderGeo6, roofMat);
  tileRib58.name = 'tileRib';
  tileRib58.position.set(-3.4385, 4.0554, 5.1278);
  tileRib58.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib58);
  const tileRib59 = new THREE.Mesh(cylinderGeo7, roofMat);
  tileRib59.name = 'tileRib';
  tileRib59.position.set(-2.9095, 4.2062, 4.8004);
  tileRib59.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib59);
  const tileRib60 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib60.name = 'tileRib';
  tileRib60.position.set(-2.3805, 4.215, 4.7813);
  tileRib60.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib60);
  const tileRib61 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib61.name = 'tileRib';
  tileRib61.position.set(-1.8515, 4.215, 4.7813);
  tileRib61.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib61);
  const tileRib62 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib62.name = 'tileRib';
  tileRib62.position.set(-1.3225, 4.215, 4.7813);
  tileRib62.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib62);
  const tileRib63 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib63.name = 'tileRib';
  tileRib63.position.set(-0.7935, 4.215, 4.7813);
  tileRib63.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib63);
  const tileRib64 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib64.name = 'tileRib';
  tileRib64.position.set(-0.2645, 4.215, 4.7813);
  tileRib64.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib64);
  const tileRib65 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib65.name = 'tileRib';
  tileRib65.position.set(0.2645, 4.215, 4.7813);
  tileRib65.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib65);
  const tileRib66 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib66.name = 'tileRib';
  tileRib66.position.set(0.7935, 4.215, 4.7813);
  tileRib66.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib66);
  const tileRib67 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib67.name = 'tileRib';
  tileRib67.position.set(1.3225, 4.215, 4.7813);
  tileRib67.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib67);
  const tileRib68 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib68.name = 'tileRib';
  tileRib68.position.set(1.8515, 4.215, 4.7813);
  tileRib68.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib68);
  const tileRib69 = new THREE.Mesh(cylinderGeo8, roofMat);
  tileRib69.name = 'tileRib';
  tileRib69.position.set(2.3805, 4.215, 4.7813);
  tileRib69.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib69);
  const tileRib70 = new THREE.Mesh(cylinderGeo7, roofMat);
  tileRib70.name = 'tileRib';
  tileRib70.position.set(2.9095, 4.2062, 4.8004);
  tileRib70.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib70);
  const tileRib71 = new THREE.Mesh(cylinderGeo6, roofMat);
  tileRib71.name = 'tileRib';
  tileRib71.position.set(3.4385, 4.0554, 5.1278);
  tileRib71.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib71);
  const tileRib72 = new THREE.Mesh(cylinderGeo5, roofMat);
  tileRib72.name = 'tileRib';
  tileRib72.position.set(3.9675, 3.9046, 5.4551);
  tileRib72.rotation.set(deg(-65.2689), 0, 0);
  skirtTiles4.add(tileRib72);
  const eaveTiles4 = new THREE.Mesh(boxGeo18, ridgeMat);
  eaveTiles4.name = 'eaveTiles';
  eaveTiles4.position.set(0, 3.72, 5.9375);
  skirtTiles4.add(eaveTiles4);
  const hipRidge = new THREE.Mesh(boxGeo19, ridgeMat);
  hipRidge.name = 'hipRidge';
  hipRidge.position.set(-4.9062, 4.255, -3.9642);
  hipRidge.rotation.set(deg(72.7993), deg(11.0235), deg(-48.3496));
  root.add(hipRidge);
  const hipEndTile = new THREE.Mesh(boxGeo20, ridgeMat);
  hipEndTile.name = 'hipEndTile';
  hipEndTile.position.set(-6.0625, 3.77, -4.8985);
  hipEndTile.rotation.set(deg(45), deg(35.2644), deg(-30));
  root.add(hipEndTile);
  const hipRidge2 = new THREE.Mesh(boxGeo19, ridgeMat);
  hipRidge2.name = 'hipRidge';
  hipRidge2.position.set(-4.9062, 4.255, 3.9643);
  hipRidge2.rotation.set(deg(7.549), deg(40.7169), deg(-75.3877));
  root.add(hipRidge2);
  const hipEndTile2 = new THREE.Mesh(boxGeo20, ridgeMat);
  hipEndTile2.name = 'hipEndTile';
  hipEndTile2.position.set(-6.0625, 3.77, 4.8985);
  hipEndTile2.rotation.set(0, deg(45), deg(-35.2644));
  root.add(hipEndTile2);
  const hipRidge3 = new THREE.Mesh(boxGeo19, ridgeMat);
  hipRidge3.name = 'hipRidge';
  hipRidge3.position.set(4.9063, 4.255, -3.9642);
  hipRidge3.rotation.set(deg(-7.549), deg(40.7169), deg(75.3877));
  root.add(hipRidge3);
  const hipEndTile3 = new THREE.Mesh(boxGeo20, ridgeMat);
  hipEndTile3.name = 'hipEndTile';
  hipEndTile3.position.set(6.0625, 3.77, -4.8985);
  hipEndTile3.rotation.set(0, deg(45), deg(35.2644));
  root.add(hipEndTile3);
  const hipRidge4 = new THREE.Mesh(boxGeo19, ridgeMat);
  hipRidge4.name = 'hipRidge';
  hipRidge4.position.set(4.9063, 4.255, 3.9643);
  hipRidge4.rotation.set(deg(-72.7993), deg(11.0235), deg(48.3496));
  root.add(hipRidge4);
  const hipEndTile4 = new THREE.Mesh(boxGeo20, ridgeMat);
  hipEndTile4.name = 'hipEndTile';
  hipEndTile4.position.set(6.0625, 3.77, 4.8985);
  hipEndTile4.rotation.set(deg(-45), deg(35.2644), deg(30));
  root.add(hipEndTile4);
  const gableWall = new THREE.Mesh(extrudeGeo, plasterMat);
  gableWall.name = 'gableWall';
  gableWall.position.set(-3.5, 4.63, 0);
  gableWall.rotation.set(0, deg(90), 0);
  root.add(gableWall);
  const gableBeam = new THREE.Mesh(boxGeo21, woodMat);
  gableBeam.name = 'gableBeam';
  gableBeam.position.set(-3.56, 4.73, 0);
  root.add(gableBeam);
  const gableBatten = new THREE.Mesh(boxGeo22, woodMat);
  gableBatten.name = 'gableBatten';
  gableBatten.position.set(-3.57, 5.0874, -1.6665);
  root.add(gableBatten);
  const gableBatten2 = new THREE.Mesh(boxGeo23, woodMat);
  gableBatten2.name = 'gableBatten';
  gableBatten2.position.set(-3.57, 5.6219, 0);
  root.add(gableBatten2);
  const gableBatten3 = new THREE.Mesh(boxGeo22, woodMat);
  gableBatten3.name = 'gableBatten';
  gableBatten3.position.set(-3.57, 5.0874, 1.6665);
  root.add(gableBatten3);
  const gableBatten4 = new THREE.Mesh(boxGeo24, woodMat);
  gableBatten4.name = 'gableBatten';
  gableBatten4.position.set(-3.57, 5.5697, 0);
  root.add(gableBatten4);
  const gegyo = new THREE.Mesh(boxGeo25, woodMat);
  gegyo.name = 'gegyo';
  gegyo.position.set(-3.58, 6.2438, 0);
  root.add(gegyo);
  const gableWall2 = new THREE.Mesh(extrudeGeo, plasterMat);
  gableWall2.name = 'gableWall';
  gableWall2.position.set(3.5, 4.63, 0);
  gableWall2.rotation.set(0, deg(90), 0);
  root.add(gableWall2);
  const gableBeam2 = new THREE.Mesh(boxGeo21, woodMat);
  gableBeam2.name = 'gableBeam';
  gableBeam2.position.set(3.56, 4.73, 0);
  root.add(gableBeam2);
  const gableBatten5 = new THREE.Mesh(boxGeo22, woodMat);
  gableBatten5.name = 'gableBatten';
  gableBatten5.position.set(3.57, 5.0874, -1.6665);
  root.add(gableBatten5);
  const gableBatten6 = new THREE.Mesh(boxGeo23, woodMat);
  gableBatten6.name = 'gableBatten';
  gableBatten6.position.set(3.57, 5.6219, 0);
  root.add(gableBatten6);
  const gableBatten7 = new THREE.Mesh(boxGeo22, woodMat);
  gableBatten7.name = 'gableBatten';
  gableBatten7.position.set(3.57, 5.0874, 1.6665);
  root.add(gableBatten7);
  const gableBatten8 = new THREE.Mesh(boxGeo24, woodMat);
  gableBatten8.name = 'gableBatten';
  gableBatten8.position.set(3.57, 5.5697, 0);
  root.add(gableBatten8);
  const gegyo2 = new THREE.Mesh(boxGeo25, woodMat);
  gegyo2.name = 'gegyo';
  gegyo2.position.set(3.58, 6.2438, 0);
  root.add(gegyo2);
  const gableRoof = new THREE.Group();
  gableRoof.name = 'gableRoof';
  gableRoof.position.set(0, 5.6265, -1.7075);
  gableRoof.rotation.set(deg(-34), 0, 0);
  root.add(gableRoof);
  const gableSlab = new THREE.Mesh(boxGeo26, roofMat);
  gableSlab.name = 'gableSlab';
  gableRoof.add(gableSlab);
  const tileRib73 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib73.name = 'tileRib';
  tileRib73.position.set(-3.75, 0.09, 0.02);
  tileRib73.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib73);
  const tileRib74 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib74.name = 'tileRib';
  tileRib74.position.set(-3.3333, 0.09, 0.02);
  tileRib74.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib74);
  const tileRib75 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib75.name = 'tileRib';
  tileRib75.position.set(-2.9167, 0.09, 0.02);
  tileRib75.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib75);
  const tileRib76 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib76.name = 'tileRib';
  tileRib76.position.set(-2.5, 0.09, 0.02);
  tileRib76.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib76);
  const tileRib77 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib77.name = 'tileRib';
  tileRib77.position.set(-2.0833, 0.09, 0.02);
  tileRib77.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib77);
  const tileRib78 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib78.name = 'tileRib';
  tileRib78.position.set(-1.6667, 0.09, 0.02);
  tileRib78.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib78);
  const tileRib79 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib79.name = 'tileRib';
  tileRib79.position.set(-1.25, 0.09, 0.02);
  tileRib79.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib79);
  const tileRib80 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib80.name = 'tileRib';
  tileRib80.position.set(-0.8333, 0.09, 0.02);
  tileRib80.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib80);
  const tileRib81 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib81.name = 'tileRib';
  tileRib81.position.set(-0.4167, 0.09, 0.02);
  tileRib81.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib81);
  const tileRib82 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib82.name = 'tileRib';
  tileRib82.position.set(0, 0.09, 0.02);
  tileRib82.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib82);
  const tileRib83 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib83.name = 'tileRib';
  tileRib83.position.set(0.4167, 0.09, 0.02);
  tileRib83.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib83);
  const tileRib84 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib84.name = 'tileRib';
  tileRib84.position.set(0.8333, 0.09, 0.02);
  tileRib84.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib84);
  const tileRib85 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib85.name = 'tileRib';
  tileRib85.position.set(1.25, 0.09, 0.02);
  tileRib85.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib85);
  const tileRib86 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib86.name = 'tileRib';
  tileRib86.position.set(1.6667, 0.09, 0.02);
  tileRib86.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib86);
  const tileRib87 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib87.name = 'tileRib';
  tileRib87.position.set(2.0833, 0.09, 0.02);
  tileRib87.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib87);
  const tileRib88 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib88.name = 'tileRib';
  tileRib88.position.set(2.5, 0.09, 0.02);
  tileRib88.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib88);
  const tileRib89 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib89.name = 'tileRib';
  tileRib89.position.set(2.9167, 0.09, 0.02);
  tileRib89.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib89);
  const tileRib90 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib90.name = 'tileRib';
  tileRib90.position.set(3.3333, 0.09, 0.02);
  tileRib90.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib90);
  const tileRib91 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib91.name = 'tileRib';
  tileRib91.position.set(3.75, 0.09, 0.02);
  tileRib91.rotation.set(deg(-90), 0, 0);
  gableRoof.add(tileRib91);
  const eaveTiles5 = new THREE.Mesh(boxGeo27, ridgeMat);
  eaveTiles5.name = 'eaveTiles';
  eaveTiles5.position.set(0, 0.07, 1.9824);
  gableRoof.add(eaveTiles5);
  const vergeTiles = new THREE.Mesh(boxGeo28, ridgeMat);
  vergeTiles.name = 'vergeTiles';
  vergeTiles.position.set(-3.92, 0.07, 0);
  gableRoof.add(vergeTiles);
  const vergeTiles2 = new THREE.Mesh(boxGeo28, ridgeMat);
  vergeTiles2.name = 'vergeTiles';
  vergeTiles2.position.set(3.92, 0.07, 0);
  gableRoof.add(vergeTiles2);
  const gableRoof2 = new THREE.Group();
  gableRoof2.name = 'gableRoof';
  gableRoof2.position.set(0, 5.6265, 1.7075);
  gableRoof2.rotation.set(deg(34), 0, 0);
  root.add(gableRoof2);
  const gableSlab2 = new THREE.Mesh(boxGeo26, roofMat);
  gableSlab2.name = 'gableSlab';
  gableRoof2.add(gableSlab2);
  const tileRib92 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib92.name = 'tileRib';
  tileRib92.position.set(-3.75, 0.09, 0.02);
  tileRib92.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib92);
  const tileRib93 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib93.name = 'tileRib';
  tileRib93.position.set(-3.3333, 0.09, 0.02);
  tileRib93.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib93);
  const tileRib94 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib94.name = 'tileRib';
  tileRib94.position.set(-2.9167, 0.09, 0.02);
  tileRib94.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib94);
  const tileRib95 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib95.name = 'tileRib';
  tileRib95.position.set(-2.5, 0.09, 0.02);
  tileRib95.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib95);
  const tileRib96 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib96.name = 'tileRib';
  tileRib96.position.set(-2.0833, 0.09, 0.02);
  tileRib96.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib96);
  const tileRib97 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib97.name = 'tileRib';
  tileRib97.position.set(-1.6667, 0.09, 0.02);
  tileRib97.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib97);
  const tileRib98 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib98.name = 'tileRib';
  tileRib98.position.set(-1.25, 0.09, 0.02);
  tileRib98.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib98);
  const tileRib99 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib99.name = 'tileRib';
  tileRib99.position.set(-0.8333, 0.09, 0.02);
  tileRib99.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib99);
  const tileRib100 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib100.name = 'tileRib';
  tileRib100.position.set(-0.4167, 0.09, 0.02);
  tileRib100.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib100);
  const tileRib101 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib101.name = 'tileRib';
  tileRib101.position.set(0, 0.09, 0.02);
  tileRib101.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib101);
  const tileRib102 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib102.name = 'tileRib';
  tileRib102.position.set(0.4167, 0.09, 0.02);
  tileRib102.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib102);
  const tileRib103 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib103.name = 'tileRib';
  tileRib103.position.set(0.8333, 0.09, 0.02);
  tileRib103.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib103);
  const tileRib104 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib104.name = 'tileRib';
  tileRib104.position.set(1.25, 0.09, 0.02);
  tileRib104.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib104);
  const tileRib105 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib105.name = 'tileRib';
  tileRib105.position.set(1.6667, 0.09, 0.02);
  tileRib105.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib105);
  const tileRib106 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib106.name = 'tileRib';
  tileRib106.position.set(2.0833, 0.09, 0.02);
  tileRib106.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib106);
  const tileRib107 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib107.name = 'tileRib';
  tileRib107.position.set(2.5, 0.09, 0.02);
  tileRib107.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib107);
  const tileRib108 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib108.name = 'tileRib';
  tileRib108.position.set(2.9167, 0.09, 0.02);
  tileRib108.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib108);
  const tileRib109 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib109.name = 'tileRib';
  tileRib109.position.set(3.3333, 0.09, 0.02);
  tileRib109.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib109);
  const tileRib110 = new THREE.Mesh(cylinderGeo9, roofMat);
  tileRib110.name = 'tileRib';
  tileRib110.position.set(3.75, 0.09, 0.02);
  tileRib110.rotation.set(deg(-90), 0, 0);
  gableRoof2.add(tileRib110);
  const eaveTiles6 = new THREE.Mesh(boxGeo27, ridgeMat);
  eaveTiles6.name = 'eaveTiles';
  eaveTiles6.position.set(0, 0.07, 1.9824);
  gableRoof2.add(eaveTiles6);
  const vergeTiles3 = new THREE.Mesh(boxGeo28, ridgeMat);
  vergeTiles3.name = 'vergeTiles';
  vergeTiles3.position.set(-3.92, 0.07, 0);
  gableRoof2.add(vergeTiles3);
  const vergeTiles4 = new THREE.Mesh(boxGeo28, ridgeMat);
  vergeTiles4.name = 'vergeTiles';
  vergeTiles4.position.set(3.92, 0.07, 0);
  gableRoof2.add(vergeTiles4);
  const noshiStripe = new THREE.Mesh(new THREE.BoxGeometry(7.9, 0.18, 0.5), plasterMat);
  noshiStripe.name = 'noshiStripe';
  noshiStripe.position.set(0, 6.8729, 0);
  root.add(noshiStripe);
  const ridgeCap = new THREE.Mesh(new THREE.BoxGeometry(7.94, 0.3, 0.42), ridgeMat);
  ridgeCap.name = 'ridgeCap';
  ridgeCap.position.set(0, 7.0729, 0);
  root.add(ridgeCap);
  const oniGawara = new THREE.Mesh(boxGeo29, ridgeMat);
  oniGawara.name = 'oniGawara';
  oniGawara.position.set(-4.02, 7.1529, 0);
  root.add(oniGawara);
  const oniGawara2 = new THREE.Mesh(boxGeo29, ridgeMat);
  oniGawara2.name = 'oniGawara';
  oniGawara2.position.set(4.02, 7.1529, 0);
  root.add(oniGawara2);
  const stoneLantern = new THREE.Group();
  stoneLantern.name = 'stoneLantern';
  stoneLantern.position.set(-5.2, 0, 6.25);
  root.add(stoneLantern);
  const lanternBase = new THREE.Mesh(new THREE.BoxGeometry(0.6, 0.14, 0.6), stoneMat);
  lanternBase.name = 'lanternBase';
  lanternBase.position.set(0, 0.07, 0);
  stoneLantern.add(lanternBase);
  const lanternPost = new THREE.Mesh(new THREE.CylinderGeometry(0.11, 0.13, 0.75, 6), stoneMat);
  lanternPost.name = 'lanternPost';
  lanternPost.position.set(0, 0.515, 0);
  stoneLantern.add(lanternPost);
  const lanternTable = new THREE.Mesh(new THREE.BoxGeometry(0.52, 0.1, 0.52), stoneMat);
  lanternTable.name = 'lanternTable';
  lanternTable.position.set(0, 0.94, 0);
  stoneLantern.add(lanternTable);
  const fireBox = new THREE.Mesh(new THREE.BoxGeometry(0.36, 0.34, 0.36), stoneMat);
  fireBox.name = 'fireBox';
  fireBox.position.set(0, 1.16, 0);
  stoneLantern.add(fireBox);
  const lanternLight = new THREE.Mesh(boxGeo30, lampMat);
  lanternLight.name = 'lanternLight';
  lanternLight.position.set(0, 1.16, 0);
  stoneLantern.add(lanternLight);
  const lanternLight2 = new THREE.Mesh(boxGeo30, lampMat);
  lanternLight2.name = 'lanternLight';
  lanternLight2.position.set(0, 1.16, 0);
  lanternLight2.rotation.set(0, deg(90), 0);
  stoneLantern.add(lanternLight2);
  const lanternRoof = new THREE.Mesh(new THREE.ConeGeometry(0.48, 0.3, 4, 1, false, Math.PI / 4), stoneMat);
  lanternRoof.name = 'lanternRoof';
  lanternRoof.position.set(0, 1.48, 0);
  stoneLantern.add(lanternRoof);
  const lanternKnob = new THREE.Mesh(new THREE.SphereGeometry(0.08, 6, 4), stoneMat);
  lanternKnob.name = 'lanternKnob';
  lanternKnob.position.set(0, 1.7, 0);
  stoneLantern.add(lanternKnob);
  const gardenStone = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.2638, 0), 0.04, 60), stoneMat);
  gardenStone.name = 'gardenStone';
  gardenStone.position.set(-4.3571, 0.1096, 5.4067);
  gardenStone.scale.set(1, 0.55, 1);
  root.add(gardenStone);
  const gardenStone2 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.3386, 0), 0.04, 61), stoneMat);
  gardenStone2.name = 'gardenStone';
  gardenStone2.position.set(-4.6629, 0.1772, 7.1255);
  gardenStone2.scale.set(1, 0.55, 1);
  root.add(gardenStone2);
  const gardenStone3 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.2715, 0), 0.04, 62), stoneMat);
  gardenStone3.name = 'gardenStone';
  gardenStone3.position.set(-4.1933, 0.1321, 5.4023);
  gardenStone3.scale.set(1, 0.55, 1);
  root.add(gardenStone3);
  const gardenStone4 = new THREE.Mesh(jitter(new THREE.IcosahedronGeometry(0.3159, 0), 0.04, 63), stoneMat);
  gardenStone4.name = 'gardenStone';
  gardenStone4.position.set(-4.7248, 0.1394, 7.0849);
  gardenStone4.scale.set(1, 0.55, 1);
  root.add(gardenStone4);

  root.traverse((o) => {
    if (o.isMesh) {
      o.castShadow = true;
      o.receiveShadow = true;
    }
  });
  return root;
}

export default createJapaneseHouse;

Notes et commentaires

—
Aucune note pour l’instant — soyez le premier.
5
0
4
0
3
0
2
0
1
0

Connectez-vous pour noter et commenter.

0 commentaire

Aucun commentaire pour l’instant. Dites comment vous avez utilisé ce modèle ou ce qui pourrait être amélioré.

Modèles similaires

Même catégorie ou étiquettes proches