JSFiddle - React, Tailwind, and code Playground

HTML

<div id="container">

</div>

CSS

body {
  margin: 0;
}

JavaScript

import * as THREE from 'https://cdn.jsdelivr.net/npm/three@0.125.2/build/three.module.js';

import { FirstPersonControls } from 'https://cdn.jsdelivr.net/npm/three@0.125.2/examples/jsm/controls/FirstPersonControls.js';
import { ImprovedNoise } from 'https://cdn.jsdelivr.net/npm/three@0.125.2/examples/jsm/math/ImprovedNoise.js';
import { BufferGeometryUtils } from 'https://cdn.jsdelivr.net/npm/three@0.125.2/examples/jsm/utils/BufferGeometryUtils.js';

let container, stats;

let camera, controls, scene, renderer;

const worldWidth = 128, worldDepth = 128;
const worldHalfWidth = worldWidth / 2;
const worldHalfDepth = worldDepth / 2;
const data = generateHeight( worldWidth, worldDepth );

const clock = new THREE.Clock();

init();
animate();

function init() {

  container = document.getElementById( 'container' );

  camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 20000 );
  camera.position.y = getY( worldHalfWidth, worldHalfDepth ) * 100 + 100;

  scene = new THREE.Scene();
  scene.background = new THREE.Color( 0xbfd1e5 );

  // sides

  const matrix = new THREE.Matrix4();

  const pxGeometry = new THREE.PlaneGeometry( 100, 100 );
  pxGeometry.attributes.uv.array[ 1 ] = 0.5;
  pxGeometry.attributes.uv.array[ 3 ] = 0.5;
  pxGeometry.rotateY( Math.PI / 2 );
  pxGeometry.translate( 50, 0, 0 );

  const nxGeometry = new THREE.PlaneGeometry( 100, 100 );
  nxGeometry.attributes.uv.array[ 1 ] = 0.5;
  nxGeometry.attributes.uv.array[ 3 ] = 0.5;
  nxGeometry.rotateY( - Math.PI / 2 );
  nxGeometry.translate( - 50, 0, 0 );

  const pyGeometry = new THREE.PlaneGeometry( 100, 100 );
  pyGeometry.attributes.uv.array[ 5 ] = 0.5;
  pyGeometry.attributes.uv.array[ 7 ] = 0.5;
  pyGeometry.rotateX( - Math.PI / 2 );
  pyGeometry.translate( 0, 50, 0 );

  const pzGeometry = new THREE.PlaneGeometry( 100, 100 );
  pzGeometry.attributes.uv.array[ 1 ] = 0.5;
  pzGeometry.attributes.uv.array[ 3 ] = 0.5;
  pzGeometry.translate( 0, 0, 50 );

  const...