106 lines
4.1 KiB
JavaScript
106 lines
4.1 KiB
JavaScript
let directionalLight;
|
|
let ambientLight;
|
|
|
|
function initSun(scene) {
|
|
// Lighting
|
|
ambientLight = new THREE.AmbientLight(0x90bbbd, 0.9);
|
|
scene.add(ambientLight);
|
|
|
|
directionalLight = new THREE.DirectionalLight(0xffffff);
|
|
directionalLight.position.set(20, 30, 10);
|
|
directionalLight.castShadow = true;
|
|
directionalLight.shadow.mapSize.width = 4096;
|
|
directionalLight.shadow.mapSize.height = 4096;
|
|
directionalLight.shadow.camera.near = 25;
|
|
directionalLight.shadow.camera.far = 250;
|
|
directionalLight.shadow.bias = -0.005
|
|
directionalLight.shadow.camera.left = -100;
|
|
directionalLight.shadow.camera.right = 100;
|
|
directionalLight.shadow.camera.top = 100;
|
|
directionalLight.shadow.camera.bottom = -100;
|
|
scene.add(directionalLight);
|
|
}
|
|
|
|
function sunPosition(){
|
|
// --- Use SunCalc to get sun position ---
|
|
// Set your latitude and longitude
|
|
const latitude = 41.17873;
|
|
const longitude = -8.60835; // Example: adjust as needed
|
|
|
|
// Calculate the current date and time based on your simulation hour
|
|
const now = new Date();
|
|
now.setHours(Math.floor(currentHour));
|
|
now.setMinutes(Math.floor((currentHour % 1) * 60));
|
|
now.setSeconds(0);
|
|
|
|
// Get sun position from SunCalc
|
|
const sunPos = SunCalc.getPosition(now, latitude, longitude);
|
|
|
|
// Convert to your scene's coordinates
|
|
const sunRadius = 100;
|
|
const azimuth = sunPos.azimuth; // Convert from south-based to x/z-plane (east = 0)
|
|
const elevation = sunPos.altitude;
|
|
console.log(azimuth, elevation)
|
|
const sunX = sunRadius * Math.cos(elevation) * Math.cos(azimuth);
|
|
const sunY = sunRadius * Math.sin(elevation);
|
|
const sunZ = sunRadius * Math.cos(elevation) * Math.sin(azimuth);
|
|
|
|
directionalLight.position.set(sunX, sunY, sunZ);
|
|
directionalLight.target.position.set(0, 0, 0);
|
|
directionalLight.target.updateMatrixWorld();
|
|
}
|
|
|
|
function updateSun(scene) {
|
|
sunPosition();
|
|
// --- Dynamic Sky Color ---
|
|
const dayColor = new THREE.Color(0xa9d3fd); // Light blue
|
|
const nightColor = new THREE.Color(0x0a0a23); // Dark blue/black
|
|
|
|
const sunriseSunColor = new THREE.Color(0xa3d1ff); // Bright white/yellow
|
|
const daySunColor = new THREE.Color(0xffffa9); // Bright white/yellow
|
|
const sunsetSunColor = new THREE.Color(0xffcc25); // Warm orange
|
|
const nightSunColor = new THREE.Color(0x222244); // Dim blue
|
|
|
|
const dayAmbientColor = new THREE.Color(0xa9d3fd); // Light blue
|
|
const nightAmbientColor = new THREE.Color(0x222244); // Dim blue
|
|
|
|
let sunColor;
|
|
if (currentHour < 5 || currentHour >= 21){
|
|
sunColor = nightSunColor;
|
|
ambientLight.color.copy(nightAmbientColor);
|
|
directionalLight.castShadow = false;
|
|
directionalLight.intensity = 0
|
|
scene.background = nightColor;
|
|
} else if (5 < currentHour && currentHour <= 8) {
|
|
// Night to sunrise
|
|
const t = (currentHour - 5) / 3;
|
|
sunColor = nightSunColor.clone().lerp(sunriseSunColor, t);
|
|
ambientLight.color.copy(nightAmbientColor.clone().lerp(dayAmbientColor, t));
|
|
directionalLight.castShadow = true;
|
|
directionalLight.intensity = t *0.5;
|
|
scene.background = nightColor.clone().lerp(dayColor, t);
|
|
} else if (currentHour < 11) {
|
|
// Sunrise to day
|
|
const t = (currentHour - 8) / 3;
|
|
sunColor = sunriseSunColor.clone().lerp(daySunColor, t);
|
|
directionalLight.castShadow = true;
|
|
scene.background = dayColor;
|
|
} else if (currentHour < 16) {
|
|
// Day
|
|
sunColor = daySunColor;
|
|
scene.background = dayColor;
|
|
} else if (currentHour < 20) {
|
|
// Day to sunset
|
|
const t = (currentHour - 16) / 2;
|
|
directionalLight.intensity = (1-t) * 0.5
|
|
sunColor = daySunColor.clone().lerp(sunsetSunColor, t);
|
|
scene.background = dayColor;
|
|
} else if (currentHour < 21) {
|
|
// Sunset to night
|
|
const t = (currentHour - 20);
|
|
sunColor = sunsetSunColor.clone().lerp(nightSunColor, t);
|
|
ambientLight.color.copy(dayAmbientColor.clone().lerp(nightAmbientColor, t));
|
|
scene.background = dayColor.clone().lerp(nightColor, t);
|
|
}
|
|
directionalLight.color.copy(sunColor);
|
|
} |