File size: 5,709 Bytes
099dc67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
900b160
 
099dc67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import json
import numpy as np
import logging
from pathlib import Path
from config import TEST_DATA_DIR

logger = logging.getLogger(__name__)

def create_test_data_structure(progress_callback=None):
    """Create sample camera extrinsics data for testing"""
    
    if progress_callback:
        progress_callback(0.0, desc="Creating test data structure...")
    
    # Create directories
    data_dir = Path(f"{TEST_DATA_DIR}/cameras")
    videos_dir = Path(f"{TEST_DATA_DIR}/videos")
    data_dir.mkdir(parents=True, exist_ok=True)
    videos_dir.mkdir(parents=True, exist_ok=True)
    
    camera_file = data_dir / "camera_extrinsics.json"
    
    # Skip if file already exists
    if camera_file.exists():
        logger.info(f"✓ Camera extrinsics already exist at {camera_file}")
        
        if progress_callback:
            progress_callback(1.0, desc="Test data structure already exists")
            
        return
    
    if progress_callback:
        progress_callback(0.3, desc="Generating camera extrinsics data...")
    
    # Generate sample camera data
    camera_data = {}
    
    # Create 81 frames with 10 camera trajectories each
    for frame_idx in range(81):
        frame_key = f"frame{frame_idx}"
        camera_data[frame_key] = {}
        
        for cam_idx in range(1, 11):  # Camera types 1-10
            # Create a sample camera matrix (this is just an example - replace with actual logic if needed)
            # In reality, these would be calculated based on specific camera movement patterns
            
            # Create a base identity matrix
            base_matrix = np.eye(4)
            
            # Add some variation based on frame and camera type
            # This is a simplistic example - real camera movements would be more complex
            if cam_idx == 1:  # Pan Right
                base_matrix[0, 3] = 0.01 * frame_idx  # Move right over time
            elif cam_idx == 2:  # Pan Left
                base_matrix[0, 3] = -0.01 * frame_idx  # Move left over time
            elif cam_idx == 3:  # Tilt Up
                # Rotate around X-axis
                angle = 0.005 * frame_idx
                base_matrix[1, 1] = np.cos(angle)
                base_matrix[1, 2] = -np.sin(angle)
                base_matrix[2, 1] = np.sin(angle)
                base_matrix[2, 2] = np.cos(angle)
            elif cam_idx == 4:  # Tilt Down
                # Rotate around X-axis (opposite direction)
                angle = -0.005 * frame_idx
                base_matrix[1, 1] = np.cos(angle)
                base_matrix[1, 2] = -np.sin(angle)
                base_matrix[2, 1] = np.sin(angle)
                base_matrix[2, 2] = np.cos(angle)
            elif cam_idx == 5:  # Zoom In
                base_matrix[2, 3] = -0.01 * frame_idx  # Move forward over time
            elif cam_idx == 6:  # Zoom Out
                base_matrix[2, 3] = 0.01 * frame_idx  # Move backward over time
            elif cam_idx == 7:  # Translate Up (with rotation)
                base_matrix[1, 3] = 0.01 * frame_idx  # Move up over time
                angle = 0.003 * frame_idx
                base_matrix[0, 0] = np.cos(angle)
                base_matrix[0, 2] = np.sin(angle)
                base_matrix[2, 0] = -np.sin(angle)
                base_matrix[2, 2] = np.cos(angle)
            elif cam_idx == 8:  # Translate Down (with rotation)
                base_matrix[1, 3] = -0.01 * frame_idx  # Move down over time
                angle = -0.003 * frame_idx
                base_matrix[0, 0] = np.cos(angle)
                base_matrix[0, 2] = np.sin(angle)
                base_matrix[2, 0] = -np.sin(angle)
                base_matrix[2, 2] = np.cos(angle)
            elif cam_idx == 9:  # Arc Left (with rotation)
                angle = 0.005 * frame_idx
                radius = 2.0
                base_matrix[0, 3] = -radius * np.sin(angle)
                base_matrix[2, 3] = -radius * np.cos(angle) + radius
                # Rotate to look at center
                look_angle = angle + np.pi
                base_matrix[0, 0] = np.cos(look_angle)
                base_matrix[0, 2] = np.sin(look_angle)
                base_matrix[2, 0] = -np.sin(look_angle)
                base_matrix[2, 2] = np.cos(look_angle)
            elif cam_idx == 10:  # Arc Right (with rotation)
                angle = -0.005 * frame_idx
                radius = 2.0
                base_matrix[0, 3] = -radius * np.sin(angle)
                base_matrix[2, 3] = -radius * np.cos(angle) + radius
                # Rotate to look at center
                look_angle = angle + np.pi
                base_matrix[0, 0] = np.cos(look_angle)
                base_matrix[0, 2] = np.sin(look_angle)
                base_matrix[2, 0] = -np.sin(look_angle)
                base_matrix[2, 2] = np.cos(look_angle)
            
            # Format the matrix as a string (as expected by the app)
            # Format: [row1] [row2] [row3] [row4] with spaces between values
            matrix_str = ' '.join([f"[{' '.join([str(base_matrix[i, j]) for j in range(4)])}]" for i in range(4)]) + ' '
            
            camera_data[frame_key][f"cam{cam_idx:02d}"] = matrix_str
    
    if progress_callback:
        progress_callback(0.7, desc="Saving camera extrinsics data...")
    
    # Save camera extrinsics to JSON file
    with open(camera_file, 'w') as f:
        json.dump(camera_data, f, indent=2)
    
    logger.info(f"Created sample camera extrinsics at {camera_file}")
    logger.info(f"Created directory for example videos at {videos_dir}")
    
    if progress_callback:
        progress_callback(1.0, desc="Test data structure created successfully!")