### Three.js Scene Initialization and Setup Source: https://github.com/erosmarcon/three-steer/blob/master/examples/LeaderFollow.html Initializes the Three.js scene, camera, renderer, and adds essential elements like a floor, orbit controls, and performance stats. It also sets up event listeners for mouse clicks and window resizing. ```javascript var container; var camera; var scene, renderer; var controls; var stats; var entity1; var boundaries; var params var followers; function onClick(event) { if (event.altKey) { var mouse3D = new THREE.Vector3(( event.clientX / window.innerWidth ) * 2 - 1, -( event.clientY / window.innerHeight ) * 2 + 1, 0); var raycaster = new THREE.Raycaster(); raycaster.setFromCamera(mouse3D, camera); var intersects = raycaster.intersectObjects(scene.children); if (intersects.length > 0) { entity1.position.set(intersects[0].point.x, intersects[0].point.y, intersects[0].point.z); } } } function init(element) { container= document.getElementById(element); camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 50000); scene = new THREE.Scene(); renderer = new THREE.WebGLRenderer({ alpha: true }); renderer.setClearColor( 0x333333, 0); renderer.setSize(window.innerWidth, window.innerHeight); renderer.domElement.style.position = 'absolute'; renderer.domElement.style.top = 0; container.appendChild(renderer.domElement); camera.position.set(0, 10000, 10000); camera.lookAt(new THREE.Vector3(0,0,0)); controls = new THREE.OrbitControls(camera, renderer.domElement); controls.maxPolarAngle = Math.PI * 0.5; controls.minDistance = 100; controls.maxDistance = 30000; stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.bottom = '0px'; stats.domElement.style.left='180px'; stats.domElement.style.zIndex = 100; container.appendChild( stats.domElement ); // Floor var floorGeometry=new THREE.PlaneGeometry(10000,10000, 32 ); var floorMaterial=new THREE.MeshBasicMaterial({color: 0x666666, transparent: true, opacity: 0.5}); var floor=new THREE.Mesh( floorGeometry, floorMaterial); floor.rotation.x=-Math.PI*.5; scene.add(floor); // Entity Mesh var geometry = new THREE.BoxGeometry( 100, 200, 50 ); var material1 = new THREE.MeshBasicMaterial( { color: 0xFFFFFF, wireframe: true } ); var mesh1 = new THREE.Mesh(geometry, material1); mesh1.position.setY(100); // Entities entity1=new SteeringEntity(mesh1); entity1.maxSpeed=15; entity1.lookAtDirection=true; entity1.position.set(Math.random() * (2500 - (-2500)) + (-2500) ,0,Math.random() * (2500 - (-2500)) + (-2500)); entity1.wanderDistance=10; entity1.wanderRadius=5; entity1.wanderRange=1; scene.add(entity1); var material3 = new THREE.MeshBasicMaterial( { color: 0x000000, wireframe: true } ); params={maxSpeed:15, maxForce:5, lookAtDirection:true, wanderDistance:10, wanderRadius:5, wanderRange:1, numFollowers:20, distance:400, separationRadius:300, maxSeparation:500, leaderSightRadius:1000, arrivalThreshold:200} followers=[] for(var i=0;i 0) { ball.position.set(intersects[0].point.x, 50, intersects[0].point.z) } } } function init(element) { container = document.getElementById(element); camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 50000); scene = new THREE.Scene(); renderer = new THREE.WebGLRenderer({ alpha: true }); renderer.setClearColor( 0x333333, 0); renderer.setSize(window.innerWidth, window.innerHeight); renderer.domElement.style.position = 'absolute'; renderer.domElement.style.top = 0; container.appendChild(renderer.domElement); camera.position.set(0, 10000, 10000); camera.lookAt(new THREE.Vector3(0, 0, 0)); controls = new THREE.OrbitControls(camera, renderer.domElement); controls.maxPolarAngle = Math.PI * 0.5; controls.minDistance = 100; controls.maxDistance = 30000; stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.bottom = '0px'; stats.domElement.style.left = '180px' stats.domElement.style.zIndex = 100; container.appendChild(stats.domElement); // Floor var floorGeometry = new THREE.PlaneGeometry(10000, 10000, 32); var floorMaterial = new THREE.MeshBasicMaterial({ color: 0x666666, transparent: true, opacity: 0.5 }); var floor = new THREE.Mesh(floorGeometry, floorMaterial); floor.rotation.x = -Math.PI * .5; scene.add(floor); // Ball var ballGeometry = new THREE.SphereGeometry(50, 32, 32); var ballMaterial = new THREE.MeshBasicMaterial({ color: 0xBCFF00 }); ball = new THREE.Mesh(ballGeometry, ballMaterial); ball.position.set(Math.random() * (5000 - (-5000)) + (-5000), 50, Math.random() * (5000 - (-5000)) + (-5000)); scene.add(ball); // Entity Mesh var geometry = new THREE.BoxGeometry(100, 200, 50); var material = new THREE.MeshBasicMaterial({ color: 0xFFFFFF, wireframe: true }); var mesh = new THREE.Mesh(geometry, material); mesh.position.setY(100) // Entity entity = new SteeringEntity(mesh); entity.position.set(Math.random() * (5000 - (-5000)) + (-5000), 0, Math.random() * (5000 - (-5000)) + (-5000)); entity.lookAtDirection = true; scene.add(entity); // Plane boundaries (do not cross) boundaries = new THREE.Box3(new THREE.Vector3(-5000, 0, -5000), new THREE.Vector3(5000, 0, 5000)); params = { helper: false } // Gui var gui = new dat.GUI(); gui.add(entity, 'maxSpeed', 1, 50).name('Max Speed').step(1); gui.add(entity, 'maxForce', 1, 20).name('Max Force').step(1); gui.add(entity, 'lookAtDirection').name('Look At Direction'); gui.add(entity, 'arrivalThreshold', 100, 2000).name('Threshold').step(1); window.addEventListener('resize', onWindowResize, false); document.addEventListener('mousedown', onClick, true); animate(); } function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); } function animate() { requestAnimationFrame(animate); controls.update(); entity.arrive(ball.position); if (entity.lookAtDirection) entity.lookWhereGoing(true); else entity.rotation.set(0, 0, 0) entity.bounce(boundaries) entity.update(); renderer.render(scene, camera); stats.update(); } ``` -------------------------------- ### Initialize and Manage Entities in Wander Example Source: https://github.com/erosmarcon/three-steer/blob/master/examples/animated/Wander.html This JavaScript code initializes and manages entities for the 'Wander' example. It sets up event listeners for UI changes, window resizing, and mouse clicks. The animation loop updates entity behaviors, physics, and rendering. It also handles the disposal of resources when entities are removed. ```javascript ui.add(params, 'numEntities', 2, 100).name("Num Of Entities"); quantity.onFinishChange(function(value) { for (var i = 0; i < entities.length; i++) { entities[i].mesh.traverse(function(obj) { scene.remove(obj); if (obj.geometry) obj.geometry.dispose(); if (obj.material) obj.material.dispose(); if (obj.mesh) obj.mesh.dispose(); if (obj.texture) obj.texture.dispose(); }); scene.remove(entities[i]) } entities = [] for (var i = 0; i < value; i++) { var randomChar = Math.floor(Math.random() * ((2 - 0) + 1) + 0); var clone = new THREE.SEA3D.SkinnedMesh(characters[randomChar].mesh.geometry, characters[randomChar].mesh.material) for (var j = 0; j < animations.length; j++) { clone.animations.push(animations[j].data); clone.clips.push(animations[j].data); clone.animationsData[j] = animations[j].data; } clone.rotateY(Math.PI) clone.castShadow = true; var entity = new SteeringEntity(clone) entity.position.set(Math.random() * (5000 - (-5000)) + (-5000), 0, Math.random() * (5000 - (-5000)) + (-5000)); entities.push(entity); scene.add(entity); } }); gui.add(params, 'maxSpeed', 2, 20).name('Max Speed').step(1); gui.add(params, 'maxForce', 1, 20).name('Max Force').step(1); gui.add(params, 'wanderDistance', 10, 100).name('Wander Distance').step(1); gui.add(params, 'wanderRadius', 5, 1000).name('Wander Radius').step(1); gui.add(params, 'wanderRange', 1, 20).name('Wander Range').step(1); window.addEventListener('resize', onWindowResize, false); document.addEventListener('mousedown', onClick, true); animate(); ``` -------------------------------- ### Initialize Three.js Scene and Objects Source: https://github.com/erosmarcon/three-steer/blob/master/examples/animated/Seek.html Sets up the Three.js scene, camera, renderer, controls, and performance stats. It also adds lighting, a floor, a ball, and initializes character entities with loaded models and animations. ```javascript function init(element) { container = document.getElementById(element); camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 50000); scene = new THREE.Scene(); renderer = new THREE.WebGLRenderer({alpha: true}); renderer.setClearColor(0x333333, 0); renderer.shadowMap.enabled=true; renderer.shadowMap.type = THREE.PCFSoftShadowMap; renderer.gammaInput = true; renderer.gammaOutput = true; renderer.setSize(window.innerWidth, window.innerHeight); renderer.domElement.style.position = 'absolute'; renderer.domElement.style.top = 0; container.appendChild(renderer.domElement); camera.position.set(0, 10000, 10000); camera.lookAt(new THREE.Vector3(0, 0, 0)); controls = new THREE.OrbitControls(camera, renderer.domElement); controls.maxPolarAngle = Math.PI * 0.5; controls.minDistance = 100; controls.maxDistance = 30000; stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.bottom = '0px'; stats.domElement.style.left = '180px' stats.domElement.style.zIndex = 100; container.appendChild(stats.domElement); clock = new THREE.Clock(); //Lights var spotLight = new THREE.SpotLight( 0xffffff, 5.0 ); spotLight.position.set( 0, 5000, 0 ); spotLight.castShadow = true; spotLight.shadow.mapSize.width = 1024; spotLight.shadow.mapSize.height = 1024; spotLight.angle = 1; spotLight.penumbra = 0.5; spotLight.decay = 2; spotLight.distance = 10000; var ambient = new THREE.AmbientLight( 0xFFFFFF ); ambient.intensity=0.25 scene.add( spotLight ); scene.add( ambient ); // Floor var floorGeometry = new THREE.CubeGeometry(10000, 10000, 1, 32); var floorMaterial = new THREE.MeshPhongMaterial({color: 0x4DA6FF}); var floor = new THREE.Mesh(floorGeometry, floorMaterial); floor.receiveShadow=true; floor.rotation.x = -Math.PI * .5; scene.add(floor); //Ball var ballGeometry = new THREE.SphereGeometry(30, 32, 32); var ballMaterial = new THREE.MeshLambertMaterial({color: 0x002DB2}); ball = new THREE.Mesh(ballGeometry, ballMaterial); ball.castShadow=true; ball.position.set(Math.random() * (5000 - (-5000)) + (-5000), 30, Math.random() * (5000 - (-5000)) + (-5000)); scene.add(ball); params={maxSpeed:6, maxForce:3, numEntities:50} // Entities entities=[] for(var i=0;i