import { useState } from "react"; import { useThree } from "@react-three/fiber"; import * as THREE from "three"; const DroppedObjects = () => { const { camera } = useThree(); // Now inside Canvas ✅ const [objects, setObjects] = useState<{ id: number; position: [number, number, number] }[]>([]); // Function to convert drop event into 3D position const handleDrop = (event: DragEvent) => { event.preventDefault(); const data = event.dataTransfer?.getData("text/plain"); if (!data) return; try { const cardData = JSON.parse(data); if (!cardData.className.includes("floating total-card")) { console.log("Drop rejected: Incorrect element."); return; } // Convert 2D drop position to 3D world coordinates const x = (event.clientX / window.innerWidth) * 2 - 1; const y = -(event.clientY / window.innerHeight) * 2 + 1; // Raycasting to determine the drop position in 3D const raycaster = new THREE.Raycaster(); const mouseVector = new THREE.Vector2(x, y); raycaster.setFromCamera(mouseVector, camera); // Intersect with a ground plane (assume y = 0) const groundPlane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0); const intersection = new THREE.Vector3(); raycaster.ray.intersectPlane(groundPlane, intersection); console.log("Spawn Object at:", intersection); // Add the dropped object to the scene state setObjects((prev) => [...prev, { id: Date.now(), position: [intersection.x, intersection.y, intersection.z] }]); } catch (error) { console.error("Invalid data:", error); } }; return ( {/* Render dropped objects as green boxes */} {objects.map((obj) => ( ))} ); }; export default DroppedObjects;