"use client";
import { Environment, ScrollControls } from "@react-three/drei";
import { Canvas } from "@react-three/fiber";
import React, { memo } from "react";
import { motion } from "framer-motion";
import "../styles/MacbookModel.css";
import MacContainer from "./models/MacContainer";
const MacbookModel = memo(() => {
return (
<motion.div
className="macbook-container"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 1 }}
>
<Canvas camera={{ fov: 12, position: [0, -10, 220] }}>
<Environment files={"/macbook_model/studio_small_09_4k.hdr"} />
<ScrollControls pages={2} damping={0.1} distance={1.5}>
<MacContainer />
</ScrollControls>
</Canvas>
</motion.div>
);
});
export default MacbookModel;
import { useGLTF, useScroll, useTexture } from "@react-three/drei";
import { useFrame } from "@react-three/fiber";
import React from "react";
import * as THREE from "three";
interface Meshes {
[key: string]: THREE.Object3D<THREE.Object3DEventMap> & { material?: THREE.Material };
}
const MacContainer = () => {
const model = useGLTF("/macbook_model/mac.glb");
const meshes: Meshes = {};
let tex = useTexture("/rishigreen.png");
tex.wrapS = THREE.ClampToEdgeWrapping;
tex.wrapT = THREE.ClampToEdgeWrapping;
tex.repeat.set(1, 1);
model.scene.traverse((e) => {
meshes[e.name] = e;
});
if (meshes.screen) {
meshes.screen.rotation.x = THREE.MathUtils.degToRad(180);
}
let data = useScroll();
useFrame((state, delta) => {
meshes.screen.rotation.x = THREE.MathUtils.degToRad(180 - data.offset * 90);
});
if (meshes.matte && meshes.matte.material) {
const matteMaterial = meshes.matte.material as THREE.MeshStandardMaterial;
matteMaterial.map = tex;
matteMaterial.emissiveIntensity = 0;
matteMaterial.metalness = 0;
matteMaterial.roughness = 1;
matteMaterial.map.offset.set(0, 0);
matteMaterial.map.repeat.set(1, 1);
}
return (
<group position={[0, -10, 20]}>
<primitive object={model.scene} />
</group>
);
};
export default MacContainer;