-
Notifications
You must be signed in to change notification settings - Fork 33
Expand file tree
/
Copy pathFaceTracker.jsx
More file actions
70 lines (63 loc) · 1.69 KB
/
FaceTracker.jsx
File metadata and controls
70 lines (63 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import React, { useRef, useState } from 'react';
import useGazeTracking from './useGazeTracking';
import './FaceTracker.css'; // Optional styling
/**
* FaceTracker Component
* Displays a face that follows mouse/touch movement
*/
export default function FaceTracker({
className = '',
basePath = '/faces/',
showDebug = false
}) {
const containerRef = useRef(null);
const { currentImage, isLoading, error } = useGazeTracking(containerRef, basePath);
const [mousePos, setMousePos] = useState({ x: 0, y: 0 });
const handleMouseMove = (e) => {
if (!containerRef.current) return;
const rect = containerRef.current.getBoundingClientRect();
setMousePos({
x: e.clientX - rect.left,
y: e.clientY - rect.top
});
};
if (error) {
return (
<div className="face-tracker-error">
Error loading face images: {error.message}
</div>
);
}
return (
<div
ref={containerRef}
className={`face-tracker ${className}`}
onMouseMove={handleMouseMove}
>
{currentImage && (
<img
src={currentImage}
alt="Face following gaze"
className="face-image"
style={{
width: '100%',
height: '100%',
objectFit: 'contain',
transition: 'opacity 0.1s ease-out'
}}
/>
)}
{isLoading && (
<div className="face-loading">
Loading face...
</div>
)}
{showDebug && (
<div className="face-debug">
<div>Mouse: ({Math.round(mousePos.x)}, {Math.round(mousePos.y)})</div>
<div>Image: {currentImage?.split('/').pop()}</div>
</div>
)}
</div>
);
}