Test: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
Line 17: | Line 17: | ||
<script type="module" src="https://cdn.jsdelivr.net/npm/@google/model-viewer@3.4.0/dist/model-viewer.min.js"></script> | <script type="module" src="https://cdn.jsdelivr.net/npm/@google/model-viewer@3.4.0/dist/model-viewer.min.js"></script> | ||
<div style="margin-bottom: 10px;"> | <div style="margin-bottom: 10px; font-family: sans-serif;"> | ||
<label for="bearTexture" style="font-weight: bold; margin-right: 10px;">Bear Type:</label> | <label for="bearTexture" style="font-weight: bold; margin-right: 10px;">Bear Type:</label> | ||
<select id="bearTexture" style="padding: 5px; border: 1px solid #ccc; border-radius: 4px;"> | <select id="bearTexture" style="padding: 5px; border: 1px solid #ccc; border-radius: 4px;"> | ||
Line 28: | Line 27: | ||
</div> | </div> | ||
<model-viewer | <model-viewer | ||
id=" | id="bearModelViewer" | ||
src="https://survivalcraft.wiki/content/Models/Bear.glb" | src="https://survivalcraft.wiki/content/Models/Bear.glb" | ||
alt="3D Bear Model from Survivalcraft" | alt="3D Bear Model from Survivalcraft" | ||
auto-rotate | auto-rotate | ||
camera-controls | camera-controls | ||
background-color="#f0f0f0" | background-color="#f0f0f0" | ||
shadow-intensity="1" | shadow-intensity="1" | ||
Line 39: | Line 38: | ||
exposure="1" | exposure="1" | ||
style="width: 400px; height: 400px; border: 1px solid #ccc; border-radius: 8px;" | style="width: 400px; height: 400px; border: 1px solid #ccc; border-radius: 8px;" | ||
loading="eager"> | loading="eager" | ||
> | |||
<div slot="error" style="display: flex; align-items: center; justify-content: center; height: 100%; background: #ffe6e6; color: #d63031;"> | <div slot="error" style="display: flex; align-items: center; justify-content: center; height: 100%; background: #ffe6e6; color: #d63031; font-family: sans-serif; text-align: center;"> | ||
<p>⚠️ Unable to load 3D model<br><small>Check console for details</small></p> | <p>⚠️ Unable to load 3D model.<br><small>Check your browser console for details.</small></p> | ||
</div> | </div> | ||
</model-viewer> | </model-viewer> | ||
<div id=" | <div id="statusMessage" style="margin-top: 10px; font-size: 12px; color: #666; font-family: sans-serif;"> | ||
Loading model... | Loading model... | ||
</div> | </div> | ||
<div id="controlsInfo" style="margin-top: 10px; font-size: 12px; color: #666; display: none;"> | <div id="controlsInfo" style="margin-top: 10px; font-size: 12px; color: #666; font-family: sans-serif; display: none;"> | ||
<strong>Controls:</strong> Click and drag to rotate • Scroll to zoom • Right-click and drag to pan | <strong>Controls:</strong> Click and drag to rotate • Scroll to zoom • Right-click and drag to pan | ||
</div> | </div> | ||
<script type="module"> | <script type="module"> | ||
const modelViewer = document.getElementById(' | const modelViewer = document.getElementById('bearModelViewer'); | ||
const | const bearTextureSelector = document.getElementById('bearTexture'); | ||
const | const statusMessage = document.getElementById('statusMessage'); | ||
const | const controlsInfo = document.getElementById('controlsInfo'); | ||
// Define texture URLs | // Define texture URLs for different bear types | ||
const textures = { | const textures = { | ||
brown: 'https://survivalcraft.wiki/content/Textures/Creatures/Bear_Brown.png', | |||
black: 'https://survivalcraft.wiki/content/Textures/Creatures/Bear_Black.png' | |||
}; | }; | ||
let | let mainModelMaterial = null; // We'll store a reference to the bear's main material here | ||
// | // --- Event Listeners --- | ||
// | // When the model is fully loaded and ready | ||
modelViewer.addEventListener('load', async () => { | |||
console.log('3D model loaded successfully!'); | |||
statusMessage.textContent = 'Model loaded successfully!'; | |||
controlsInfo.style.display = 'block'; | |||
// Attempt to get the first material from the loaded model. | |||
// Most simple GLB models have a single primary material. | |||
if (modelViewer.model && modelViewer.model.materials.length > 0) { | |||
mainModelMaterial = modelViewer.model.materials[0]; | |||
} | console.log('Identified main model material:', mainModelMaterial); | ||
}); | // Apply the default (brown) texture right after the model loads | ||
await applyBearTexture(); | |||
} else { | |||
console.warn('Could not find any materials in the loaded model. Texture changing might not work.'); | |||
statusMessage.textContent = 'Model loaded, but materials not found for texture swap.'; | |||
statusMessage.style.color = '#d63031'; | |||
} | |||
}); | |||
// Handle any errors during model loading | |||
modelViewer.addEventListener('error', (event) => { | |||
console.error('Error loading 3D model:', event); | |||
statusMessage.textContent = 'Error loading model. Check your browser console.'; | |||
statusMessage.style.color = '#d63031'; | |||
}); | |||
modelViewer.addEventListener(' | // Update loading progress | ||
modelViewer.addEventListener('progress', (event) => { | |||
const progress = event.detail.totalProgress; | |||
statusMessage.textContent = `Loading model... ${Math.round(progress * 100)}%`; | |||
}); | }); | ||
// Listen for changes in the bear type dropdown | |||
bearTextureSelector.addEventListener('change', applyBearTexture); | |||
// | // --- Functions --- | ||
async function | /** | ||
* Applies the selected texture to the bear model. | |||
* Uses model-viewer's internal texture management. | |||
*/ | |||
async function applyBearTexture() { | |||
if (!mainModelMaterial) { | |||
console.warn('Model material not yet available. Cannot change texture.'); | |||
return; // Exit if material isn't ready | |||
} | |||
const selectedTextureKey = bearTextureSelector.value; | |||
const textureUrl = textures[selectedTextureKey]; | |||
if (!textureUrl) { | |||
console.warn(`No texture URL defined for "${selectedTextureKey}".`); | |||
return; | |||
} | |||
console.log(`Attempting to apply "${selectedTextureKey}" texture from: ${textureUrl}`); | |||
try { | try { | ||
// Create a new texture using model-viewer's | // 1. Create a new texture object using model-viewer's utility | ||
const | const newTexture = await modelViewer.createTexture(textureUrl); | ||
// Apply | // 2. Apply this new texture to the material's baseColorTexture property. | ||
// This is the | // This is the primary texture that gives the model its color. | ||
mainModelMaterial.pbrMetallicRoughness.baseColorTexture.setTexture(newTexture); | |||
console.log( | console.log(`Successfully applied ${selectedTextureKey} texture.`); | ||
} catch (error) { | } catch (error) { | ||
console.error( | console.error(`Failed to apply ${selectedTextureKey} texture:`, error); | ||
statusMessage.textContent = `Error applying ${selectedTextureKey} texture.`; | |||
statusMessage.style.color = '#d63031'; | |||
} | } | ||
} | } | ||
// | // --- Initial Checks (for debugging) --- | ||
document.addEventListener('DOMContentLoaded', () => { | document.addEventListener('DOMContentLoaded', () => { | ||
console.log('DOM fully loaded and parsed.'); | |||
// Verify if the model-viewer custom element has been registered | |||
if (typeof customElements.get('model-viewer') === 'undefined') { | |||
console.error('The <model-viewer> component failed to load or register.'); | |||
statusMessage.textContent = 'Error: 3D viewer component not available.'; | |||
statusMessage.style.color = '#d63031'; | |||
} | |||
}); | }); | ||
</script> | </script> | ||
Revision as of 18:09, 28 July 2025
This is a notice message |
This is a content issue |
This is a style issue |
<label for="bearTexture" style="font-weight: bold; margin-right: 10px;">Bear Type:</label> <select id="bearTexture" style="padding: 5px; border: 1px solid #ccc; border-radius: 4px;"> <option value="brown">Brown Bear</option> <option value="black">Black Bear</option> </select>
<model-viewer
id="bearModelViewer" src="https://survivalcraft.wiki/content/Models/Bear.glb" alt="3D Bear Model from Survivalcraft" auto-rotate camera-controls background-color="#f0f0f0" shadow-intensity="1" environment-image="neutral" exposure="1" style="width: 400px; height: 400px; border: 1px solid #ccc; border-radius: 8px;" loading="eager"
>
⚠️ Unable to load 3D model.
Check your browser console for details.
</model-viewer>
Loading model...
<script type="module">
const modelViewer = document.getElementById('bearModelViewer'); const bearTextureSelector = document.getElementById('bearTexture'); const statusMessage = document.getElementById('statusMessage'); const controlsInfo = document.getElementById('controlsInfo');
// Define texture URLs for different bear types const textures = { brown: 'https://survivalcraft.wiki/content/Textures/Creatures/Bear_Brown.png', black: 'https://survivalcraft.wiki/content/Textures/Creatures/Bear_Black.png' };
let mainModelMaterial = null; // We'll store a reference to the bear's main material here
// --- Event Listeners ---
// When the model is fully loaded and ready modelViewer.addEventListener('load', async () => { console.log('3D model loaded successfully!'); statusMessage.textContent = 'Model loaded successfully!'; controlsInfo.style.display = 'block';
// Attempt to get the first material from the loaded model. // Most simple GLB models have a single primary material. if (modelViewer.model && modelViewer.model.materials.length > 0) { mainModelMaterial = modelViewer.model.materials[0]; console.log('Identified main model material:', mainModelMaterial); // Apply the default (brown) texture right after the model loads await applyBearTexture(); } else { console.warn('Could not find any materials in the loaded model. Texture changing might not work.'); statusMessage.textContent = 'Model loaded, but materials not found for texture swap.'; statusMessage.style.color = '#d63031'; } });
// Handle any errors during model loading modelViewer.addEventListener('error', (event) => { console.error('Error loading 3D model:', event); statusMessage.textContent = 'Error loading model. Check your browser console.'; statusMessage.style.color = '#d63031'; });
// Update loading progress modelViewer.addEventListener('progress', (event) => { const progress = event.detail.totalProgress; statusMessage.textContent = `Loading model... ${Math.round(progress * 100)}%`; });
// Listen for changes in the bear type dropdown bearTextureSelector.addEventListener('change', applyBearTexture);
// --- Functions ---
/** * Applies the selected texture to the bear model. * Uses model-viewer's internal texture management. */ async function applyBearTexture() { if (!mainModelMaterial) { console.warn('Model material not yet available. Cannot change texture.'); return; // Exit if material isn't ready }
const selectedTextureKey = bearTextureSelector.value; const textureUrl = textures[selectedTextureKey];
if (!textureUrl) { console.warn(`No texture URL defined for "${selectedTextureKey}".`); return; }
console.log(`Attempting to apply "${selectedTextureKey}" texture from: ${textureUrl}`);
try { // 1. Create a new texture object using model-viewer's utility const newTexture = await modelViewer.createTexture(textureUrl);
// 2. Apply this new texture to the material's baseColorTexture property. // This is the primary texture that gives the model its color. mainModelMaterial.pbrMetallicRoughness.baseColorTexture.setTexture(newTexture);
console.log(`Successfully applied ${selectedTextureKey} texture.`); } catch (error) { console.error(`Failed to apply ${selectedTextureKey} texture:`, error); statusMessage.textContent = `Error applying ${selectedTextureKey} texture.`; statusMessage.style.color = '#d63031'; } }
// --- Initial Checks (for debugging) --- document.addEventListener('DOMContentLoaded', () => { console.log('DOM fully loaded and parsed.');
// Verify if the model-viewer custom element has been registered if (typeof customElements.get('model-viewer') === 'undefined') { console.error('The <model-viewer> component failed to load or register.'); statusMessage.textContent = 'Error: 3D viewer component not available.'; statusMessage.style.color = '#d63031'; } });
</script>
Cell 1 | Cell 2 |
Cell 3 | Cell 4 |