diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index a7cea0b..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["Vue.volar"] -} diff --git a/public/models/room-draco.glb b/public/models/room-draco.glb new file mode 100644 index 0000000..1955354 Binary files /dev/null and b/public/models/room-draco.glb differ diff --git a/public/vids/Aus_dem_wasser.mp4 b/public/vids/Aus_dem_wasser.mp4 new file mode 100644 index 0000000..f185204 Binary files /dev/null and b/public/vids/Aus_dem_wasser.mp4 differ diff --git a/public/vids/TH-Video_Abgabe.mp4 b/public/vids/TH-Video_Abgabe.mp4 new file mode 100755 index 0000000..edad9e4 Binary files /dev/null and b/public/vids/TH-Video_Abgabe.mp4 differ diff --git a/public/vids/googleOR.mp4 b/public/vids/googleOR.mp4 new file mode 100644 index 0000000..8d7367c Binary files /dev/null and b/public/vids/googleOR.mp4 differ diff --git a/public/vids/ski.mp4 b/public/vids/ski.mp4 new file mode 100644 index 0000000..a0f7708 Binary files /dev/null and b/public/vids/ski.mp4 differ diff --git a/public/vids/skitom.mp4 b/public/vids/skitom.mp4 new file mode 100755 index 0000000..cae4b84 Binary files /dev/null and b/public/vids/skitom.mp4 differ diff --git a/src/components/sections/MonitorModel.vue b/src/components/sections/MonitorModel.vue index e9fb7b8..2e36f06 100644 --- a/src/components/sections/MonitorModel.vue +++ b/src/components/sections/MonitorModel.vue @@ -2,13 +2,29 @@ import { onMounted, onUnmounted, ref } from "vue"; import * as THREE from "three"; import gsap from "gsap"; +import ScrollTrigger from "gsap/ScrollTrigger"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader.js"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; +import surf_video from "/vids/Aus_dem_wasser.mp4"; +import ski_video from "/vids/ski.mp4"; + const canvasRef = ref(null); -let renderer, scene, camera, model, controls; +let renderer, scene, camera, model, controls, gsapCtx; +let screen1, screen3, screen4; + +const video_surf = document.createElement("video"); +const video_ski = document.createElement("video"); + +video_surf.src = surf_video; +video_surf.loop = true; +video_surf.muted = true; + +video_ski.src = ski_video; +video_ski.loop = true; +video_ski.muted = true; function initThree(canvas) { renderer = new THREE.WebGLRenderer({ @@ -17,21 +33,25 @@ function initThree(canvas) { alpha: true, }); + renderer.setPixelRatio(1); //TODO + renderer.outputColorSpace = THREE.SRGBColorSpace; scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(45, 2, 0.1, 100); - camera.position.set(0, 0, 5); - const light = new THREE.DirectionalLight(0xffffff, 1); - light.position.set(2, 2, 5); + const light = new THREE.DirectionalLight(0xffe0b0, 0.9); + light.position.set(-1, 4, 5); scene.add(light); controls = new OrbitControls(camera, renderer.domElement); controls.enableDamping = true; + controls.enabled = false; - controls.minDistance = 5; - controls.maxDistance = 5; + // controls.minDistance = 5; + // controls.maxDistance = 5; controls.maxPolarAngle = Math.PI / 2; + controls.minAzimuthAngle = -Math.PI / 2; + controls.maxAzimuthAngle = Math.PI / 2; scene.add(new THREE.AmbientLight(0xffffff, 0.5)); @@ -44,7 +64,7 @@ function loadModel() { if (model) { scene.remove(model); } - let modelUrl = "/models/Monitor_draco.glb"; + let modelUrl = "/models/room-draco.glb"; let dracoPath = "/draco/"; const dracoLoader = new DRACOLoader(); @@ -61,12 +81,36 @@ function loadModel() { const box = new THREE.Box3().setFromObject(model); const center = box.getCenter(new THREE.Vector3()); const size = box.getSize(new THREE.Vector3()); + const texture_surf_video = new THREE.VideoTexture(video_surf); + const texure_ski = new THREE.VideoTexture(video_ski); + screen1 = model.getObjectByName("fernseher1Bild"); + screen4 = model.getObjectByName("fernseher4Bild"); + screen3 = model.getObjectByName("fernseher3Bild"); + texture_surf_video.flipY = false; + texure_ski.flipY = false; + texure_ski.offset.set(-0.3, -0.2); + + screen1.material = new THREE.MeshBasicMaterial({ + map: texture_surf_video, + }); + screen4.material = new THREE.MeshBasicMaterial({ + map: texure_ski, + }); + screen3.material = new THREE.MeshBasicMaterial({ + map: texure_ski, + }); + const maxSize = Math.max(size.x, size.y, size.z); + const distance = maxSize * 2; + + camera.position.set(center.x, center.y, center.z + distance); controls.target.copy(center); controls.update(); + console.log(scene); model.position.set(0, 0, 0); scene.add(model); + gsapCtx = scrollCamreaGsap(center); document.title = "Model geladen"; }, @@ -104,6 +148,57 @@ function onResize() { camera.updateProjectionMatrix(); } +function scrollCamreaGsap(center) { + gsap.registerPlugin(ScrollTrigger); + + const ctx = gsap.context(() => { + gsap.to(camera.position, { + z: center.z + 5, + ease: "none", + scrollTrigger: { + trigger: canvasRef.value, + start: "top top", + end: "+=2000", + scrub: 1, + pin: true, + anticipatePin: 1, + onUpdate: (self) => { + if (self.progress >= 0.8) { + controls.enabled = true; + + controls.enableRotate = true; + controls.enableZoom = false; + controls.enablePan = false; + + screen1.visible = true; + screen3.visible = true; + screen4.visible = true; + setVideoActive(true); + } else { + controls.enabled = false; + screen1.visible = false; + screen3.visible = false; + screen4.visible = false; + setVideoActive(false); + } + }, + }, + }); + }, canvasRef.value); + + return ctx; +} + +function setVideoActive(active) { + if (active) { + video_surf.play(); + video_ski.play(); + } else { + video_surf.pause(); + video_ski.pause(); + } +} + const resizeObserver = new ResizeObserver(onResize); onMounted(() => { @@ -119,28 +214,39 @@ onUnmounted(() => { window.removeEventListener("resize", onResize); resizeObserver.disconnect(); renderer?.dispose(); + gsapCtx?.revert(); + ScrollTrigger.getAll().forEach((t) => t.kill()); }); diff --git a/src/components/sections/WelcomeSection.vue b/src/components/sections/WelcomeSection.vue index 634dd74..de94823 100644 --- a/src/components/sections/WelcomeSection.vue +++ b/src/components/sections/WelcomeSection.vue @@ -116,9 +116,9 @@ onUnmounted(() => {
-
+
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 6a3bb92..6b63a34 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -9,6 +9,7 @@ import { onMounted, nextTick } from "vue"; import gsap from "gsap"; import ScrollTrigger from "gsap/ScrollTrigger"; import ScrollSmoother from "gsap/ScrollSmoother"; +import MonitorModel from "../components/sections/MonitorModel.vue"; gsap.registerPlugin(ScrollTrigger, ScrollSmoother); @@ -30,6 +31,7 @@ onMounted(async () => {
+