RTSS_week7_sketch.js

PHOTO EMBED

Mon Mar 27 2023 03:49:11 GMT+0000 (Coordinated Universal Time)

Saved by @yc_lan

import * as THREE from 'three';
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
import { FirstPersonControls } from 'three/addons/controls/FirstPersonControls.js';
import { cloud } from "/cloud.js";
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

let camera, scene, renderer;

//control
let controls, //firstPerson
	control; //orbitControl

//helper
let gridHelper, axesHelper;

//plane
let geometry, texture, material, waterMesh ;

	
// //cloud
// let cloudGeo, cloudTexture, cloudMaterial ;

//clock
//https://discoverthreejs.com/book/first-steps/animation-loop/
let clock;

//add audio
let audioListener;
let audioListenerMesh;
let audioSources = [];
let myClassObjects = [];


//mouse click to copy object!

let mouse = new THREE.Vector2();
let intersectionPoint = new THREE.Vector3();
let planeNormal = new THREE.Vector3();
let plane = new THREE.Plane();
let raycaster= new THREE.Raycaster();



//window Resize
window.addEventListener( 'resize', onWindowResize, false );
function onWindowResize(){
	
		camera.aspect = window.innerWidth / window.innerHeight;
		camera.updateProjectionMatrix();
	
		renderer.setSize( window.innerWidth, window.innerHeight );
	
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

init();
animate();

function init() {

	clock = new THREE.Clock();

	camera = new THREE.PerspectiveCamera(
		60, 
		window.innerWidth / window.innerHeight, 
		1, 
		5000);
	
	camera.position.y = 300;
	camera.position.z = 1000;

	scene = new THREE.Scene();
	scene.background = new THREE.Color(0xE9F1FF);
	scene.fog = new THREE.FogExp2(0xE9F1FF, 0.0007);
		
	addSpatialAudio();

	gridHelper = new THREE.GridHelper(20000, 50, 0xffffff,0xffffff);
	axesHelper = new THREE.AxesHelper(2000);
	
	scene.add(gridHelper,
			//   axesHelper
			);



	renderer = new THREE.WebGLRenderer();

	renderer.setPixelRatio(window.devicePixelRatio);
	renderer.setSize(window.innerWidth, window.innerHeight);
	document.body.appendChild(renderer.domElement);
	
	//~~~~~~~~~~~~~~ Water Plane ~~~~~~~~~~~~~~

	geometry = new THREE.PlaneGeometry(20000, 20000);
	geometry.rotateX(-Math.PI/2);
	
	//load the texture -> a matarial
	texture = new THREE.TextureLoader().load('/whitesky.jpg');
	material = new THREE.MeshBasicMaterial({
		color: 0xC9DEFF,
		map: texture,
		});

	waterMesh = new THREE.Mesh(geometry, material);
	waterMesh.rotation.y = Math.random()*2000;

	scene.add(waterMesh);

	for (let i = 0; i < 10; i++) {
		let myClassObject = new cloud(
			(Math.random()-0.5)*i * 600, 
			(Math.random()-0.5)*1 * 50 +400,
			(Math.random()-0.5)*i * 600, 
			scene);
		myClassObjects.push(myClassObject);
	  }
}


	
	//~~~~~ orbitControl ~~~~~~
	control = new OrbitControls(camera, renderer.domElement);

	// }


//~~~~~~~~~~~~~~~add sound~~~~~~~~~~~~~~~~~~
function addSpatialAudio() {
	// first lets add our audio listener.  This is our ear (or microphone) within the 3D space.
	audioListener = new THREE.AudioListener();
  
	// create a 3D mesh so we can see the location of the audio listener
	// this is not strictly necessary, but can be helpful for debugging
	audioListenerMesh = new THREE.Mesh(
	  new THREE.BoxGeometry(2, 2, 2),
	  new THREE.MeshBasicMaterial({  })
	);
	audioListenerMesh.add(audioListener);
	audioListenerMesh.position.set(0, 0, 0);
	scene.add(audioListenerMesh);
  
	// create an audio loader which will load our audio files:
	const audioLoader = new THREE.AudioLoader();
  
	// then let's add some audio sources
	
	  	let audiomesh = new THREE.Mesh(
		new THREE.SphereGeometry(10000, 12, 12),
		new THREE.MeshBasicMaterial({ color: "blue" })
	  );
  
	  let audioSource = new THREE.PositionalAudio(audioListener);
  
	  // load the audio file into the positional audio source
	  	audioLoader.load( "wind_sound.mp3", function (buffer) {
		audioSource.setBuffer(buffer);
		audioSource.setLoop(true);
		audioSource.setVolume(0.6);
		audioSource.play();

	  });
  
	  audiomesh.add(audioSource);
	  scene.add(audiomesh);
	//   audioSources.push(mesh);

}
  
function animate() {
	render();
	requestAnimationFrame(animate);
	
	for (let i = 0; i < myClassObjects.length; i++) {
		myClassObjects[i].update();
	  }

}

function render() {
	renderer.render(scene, camera);

}




content_copyCOPY