u
This commit is contained in:
21
camera-config.json
Normal file
21
camera-config.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"camera": {
|
||||||
|
"position": {
|
||||||
|
"x": 450,
|
||||||
|
"y": 154,
|
||||||
|
"z": -130
|
||||||
|
},
|
||||||
|
"target": {
|
||||||
|
"x": 50,
|
||||||
|
"y": 85,
|
||||||
|
"z": -140
|
||||||
|
},
|
||||||
|
"distance": 406,
|
||||||
|
"spherical": {
|
||||||
|
"radius": 406,
|
||||||
|
"theta": 1.55,
|
||||||
|
"phi": 1.4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Default camera configuration for 3D model viewer. Position values can be copied from console logs and pasted here to set new defaults."
|
||||||
|
}
|
||||||
76
src/index.js
76
src/index.js
@@ -7,9 +7,35 @@ import './styles.css';
|
|||||||
// Global variables
|
// Global variables
|
||||||
let scene, camera, renderer, controls;
|
let scene, camera, renderer, controls;
|
||||||
let cube;
|
let cube;
|
||||||
|
let cameraConfig = null;
|
||||||
|
|
||||||
|
// Load camera configuration from config file
|
||||||
|
async function loadCameraConfig() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('camera-config.json');
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`HTTP error! status: ${response.status}`);
|
||||||
|
}
|
||||||
|
cameraConfig = await response.json();
|
||||||
|
console.log('Camera config loaded:', cameraConfig);
|
||||||
|
return cameraConfig;
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Could not load camera config, using defaults:', error);
|
||||||
|
// Return default config if file load fails
|
||||||
|
return {
|
||||||
|
camera: {
|
||||||
|
position: { x: 20, y: 20, z: 20 },
|
||||||
|
target: { x: 0, y: 0, z: 0 },
|
||||||
|
distance: 34.64
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize the 3D scene
|
// Initialize the 3D scene
|
||||||
function init() {
|
async function init() {
|
||||||
|
// Load camera configuration first
|
||||||
|
cameraConfig = await loadCameraConfig();
|
||||||
// Create container
|
// Create container
|
||||||
const container = document.getElementById('container');
|
const container = document.getElementById('container');
|
||||||
|
|
||||||
@@ -24,8 +50,11 @@ function init() {
|
|||||||
0.1, // Near clipping plane
|
0.1, // Near clipping plane
|
||||||
10000 // Extended far clipping plane for better zoom out
|
10000 // Extended far clipping plane for better zoom out
|
||||||
);
|
);
|
||||||
camera.position.set(20, 20, 20);
|
// Use camera config values or defaults
|
||||||
camera.lookAt(0, 0, 0);
|
const camPos = cameraConfig.camera.position;
|
||||||
|
const camTarget = cameraConfig.camera.target;
|
||||||
|
camera.position.set(camPos.x, camPos.y, camPos.z);
|
||||||
|
camera.lookAt(camTarget.x, camTarget.y, camTarget.z);
|
||||||
|
|
||||||
// Create renderer
|
// Create renderer
|
||||||
renderer = new THREE.WebGLRenderer({
|
renderer = new THREE.WebGLRenderer({
|
||||||
@@ -504,11 +533,48 @@ function centerModelAndControls(object) {
|
|||||||
// Update controls
|
// Update controls
|
||||||
controls.update();
|
controls.update();
|
||||||
|
|
||||||
|
// Add rotation logging
|
||||||
|
setupRotationLogging();
|
||||||
|
|
||||||
console.log('Model centered at:', center);
|
console.log('Model centered at:', center);
|
||||||
console.log('Model size:', size);
|
console.log('Model size:', size);
|
||||||
console.log('Camera positioned at:', camera.position);
|
console.log('Camera positioned at:', camera.position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setupRotationLogging() {
|
||||||
|
// Log rotation and zoom changes whenever the camera moves
|
||||||
|
controls.addEventListener('change', function() {
|
||||||
|
const distance = camera.position.distanceTo(controls.target);
|
||||||
|
const position = camera.position.clone();
|
||||||
|
const target = controls.target.clone();
|
||||||
|
|
||||||
|
// Calculate spherical coordinates for rotation
|
||||||
|
const spherical = new THREE.Spherical().setFromVector3(
|
||||||
|
position.clone().sub(target)
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log('=== CAMERA STATE ===');
|
||||||
|
console.log('Position:', {
|
||||||
|
x: Math.round(position.x * 100) / 100,
|
||||||
|
y: Math.round(position.y * 100) / 100,
|
||||||
|
z: Math.round(position.z * 100) / 100
|
||||||
|
});
|
||||||
|
console.log('Target:', {
|
||||||
|
x: Math.round(target.x * 100) / 100,
|
||||||
|
y: Math.round(target.y * 100) / 100,
|
||||||
|
z: Math.round(target.z * 100) / 100
|
||||||
|
});
|
||||||
|
console.log('Distance (Zoom):', Math.round(distance * 100) / 100);
|
||||||
|
console.log('Spherical Rotation:');
|
||||||
|
console.log(' - Radius:', Math.round(spherical.radius * 100) / 100);
|
||||||
|
console.log(' - Theta (horizontal):', Math.round(spherical.theta * 100) / 100, 'radians');
|
||||||
|
console.log(' - Phi (vertical):', Math.round(spherical.phi * 100) / 100, 'radians');
|
||||||
|
console.log('==================');
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Rotation logging enabled - camera state will be logged on every change');
|
||||||
|
}
|
||||||
|
|
||||||
function animate() {
|
function animate() {
|
||||||
requestAnimationFrame(animate);
|
requestAnimationFrame(animate);
|
||||||
|
|
||||||
@@ -527,4 +593,6 @@ function onWindowResize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialize when page loads
|
// Initialize when page loads
|
||||||
window.addEventListener('load', init);
|
window.addEventListener('load', async () => {
|
||||||
|
await init();
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user