📱 Want real-time voice commands and 50% cheaper credits? Download the official Posing AI Coach App for iOS and Android.
View Mobile App →

TenUnCuerpo10 Virtual Try-On & Posing AI (IFBB)

✨ Upload Your Photos for the Virtual Try-On

1 Full-Body Photo + 1 Outfit Photo. Neural AI will generate your simulation in seconds.

📸
1. Your Full-Body Photo
Click to select photo (Good lighting)
Preview Modelo
👙
2. Outfit / Bikini Photo
Flat, on mannequin or worn by athlete
Preview Prenda
📸
Front
Front Pose
Front Preview
📸
Left Side
Left Profile
Left Preview
📸
Back
Back Pose
Back Preview
📸
Right Side
Right Profile
Right Preview
Processing with TenUnCuerpo10 Neural AI...
Analyzing proportions, symmetry and IFBB competition criteria. Please wait.
By creating an account, you accept our Privacy Policy.

🪙 Recharge Credits for Try-On & Posing

Choose a credit pack. Secure checkout via Stripe.

20 Credits
4,99 €
20 Posing / 6 Try-Ons
80 Credits/mo
9,99 €/mes
Club Posing Subscription
📱 Official Mobile App (iOS & Android):
Credits are 50% cheaper with real-time live voice commands.
View App →

📖 Official User Guide & Photo Requirements

👙 1. Virtual Try-On (3 Credits)

Generates an ultra-realistic competition simulation in under 60 seconds.

  • Full-Body Photo: Standing pose, clear lighting, looking at camera.
  • Outfit / Bikini Photo: You can use a photo of the garment laid flat, displayed on a mannequin, or worn by another athlete, as long as the entire outfit is fully visible, clear and in a frontal view.
    ⚠️ Important note: Avoid harsh shadows on the garment, as they can distort the AI's detection of the shape or exact fabric color.

🏆 2. IFBB Posing Evaluator (1 Credit)

For the AI to calibrate your IFBB score accurately without distortions, photos must meet these 5 essential criteria:

1. Strict Frontal Perspective: Camera placed at chest/hip height. Diagonal or elevated angles distort muscle symmetry.
2. Clear Frontal Lighting: Ensure lights illuminate your body from the front. Avoid backlighting and harsh shadows.
3. Full-Body Framing: Include from the heels/stage shoes up to the top of the head.
4. Regulation Competition Outfit: Bikini/dress and stage heels matching your official IFBB category.
5. Clean Neutral Background: Solid wall or stage without distracting objects or other people.
`;const win = window.open('', '_blank'); if (win) { win.document.open(); win.document.write(printHtml); win.document.close(); win.focus(); setTimeout(function() { win.print(); }, 500); } },/* ========================================================================== AUTENTICACIÓN, STRIPE Y MODALES ========================================================================== */ updateUserBar: function() { const bar = document.getElementById('tc10-pw-user-bar'); if (!bar) return;const isEn = this.config.lang === 'en'; if (this.state.user.isLoggedIn) { bar.innerHTML = `
🪙 ${this.state.user.credits} ${isEn ? 'Credits' : 'Créditos'}
`; } else { bar.innerHTML = ` `; } },teleportModalsToBody: function() { document.querySelectorAll('.tc10-pw-modal-overlay').forEach(modal => { if (modal.parentElement !== document.body) { document.body.appendChild(modal); } }); },openAuthModal: function(tab) { const targetTab = (tab === 'login') ? 'login' : 'register'; this.switchAuthTab(targetTab); this.openModal('#tc10-pw-auth-modal'); },openModal: function(sel) { this.teleportModalsToBody(); const el = document.querySelector(sel); if (el) { if (el.parentElement !== document.body) { document.body.appendChild(el); } el.classList.add('active'); el.style.setProperty('display', 'flex', 'important'); el.style.setProperty('visibility', 'visible', 'important'); el.style.setProperty('opacity', '1', 'important'); el.style.setProperty('z-index', '9999999999', 'important'); document.body.classList.add('tc10-pw-modal-open'); } },closeModal: function(sel) { if (sel) { const el = document.querySelector(sel); if (el) { el.classList.remove('active'); el.style.setProperty('display', 'none', 'important'); } } else { document.querySelectorAll('.tc10-pw-modal-overlay').forEach(m => { m.classList.remove('active'); m.style.setProperty('display', 'none', 'important'); }); } if (!document.querySelector('.tc10-pw-modal-overlay.active')) { document.body.classList.remove('tc10-pw-modal-open'); } },switchAuthTab: function(tab) { const targetTab = (tab === 'login') ? 'login' : 'register'; const modal = document.getElementById('tc10-pw-auth-modal'); if (modal) { modal.setAttribute('data-auth-tab', targetTab); }const formReg = document.getElementById('tc10-pw-form-register'); const formLog = document.getElementById('tc10-pw-form-login'); const tabReg = document.getElementById('tc10-pw-tab-btn-register'); const tabLog = document.getElementById('tc10-pw-tab-btn-login');if (targetTab === 'login') { if (formLog) formLog.style.cssText = 'display: block !important;'; if (formReg) formReg.style.cssText = 'display: none !important;'; if (tabLog) tabLog.classList.add('active'); if (tabReg) tabReg.classList.remove('active'); } else { if (formReg) formReg.style.cssText = 'display: block !important;'; if (formLog) formLog.style.cssText = 'display: none !important;'; if (tabReg) tabReg.classList.add('active'); if (tabLog) tabLog.classList.remove('active'); } },submitRegisterForm: function() { const form = document.getElementById('tc10-pw-form-register'); if (!form) return;const nameInput = form.querySelector('input[name="name"]'); const emailInput = form.querySelector('input[name="email"]'); const passInput = form.querySelector('input[name="password"]'); const submitBtn = document.getElementById('tc10-pw-btn-submit-register'); const errBox = document.getElementById('tc10-pw-register-error');const name = nameInput ? nameInput.value.trim() : ''; const email = emailInput ? emailInput.value.trim() : ''; const password = passInput ? passInput.value : '';if (!name || !email || !password) { if (errBox) { errBox.textContent = '⚠️ Por favor, completa todos los campos requeridos.'; errBox.style.display = 'block'; } return; }if (password.length < 6) { if (errBox) { errBox.textContent = '⚠️ La contraseña debe tener al menos 6 caracteres.'; errBox.style.display = 'block'; } return; }if (errBox) errBox.style.display = 'none';const origBtnText = submitBtn ? submitBtn.innerHTML : 'Crear Cuenta'; if (submitBtn) { submitBtn.disabled = true; submitBtn.innerHTML = '⏳ Creando cuenta y asignando crédito...'; }const self = this; fetch(this.config.restUrl + 'register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ name: name, email: email, password: password, subscribed: true }) }) .then(res => res.json()) .then(data => { if (data.code || data.error || !data.success) { if (errBox) { errBox.textContent = '⚠️ ' + (data.message || 'Error al registrar.'); errBox.style.display = 'block'; } if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = origBtnText; } return; } if (data.nonce) self.config.nonce = data.nonce; self.state.user.isLoggedIn = true; self.state.user.email = (data.user && data.user.email) || email; self.state.user.credits = data.user && data.user.credits !== undefined ? parseInt(data.user.credits, 10) : 1; self.updateUserBar(); self.closeModal('#tc10-pw-auth-modal'); self.showToast(data.message || '¡Registro completado! 1 crédito gratis asignado.', 'success');if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = origBtnText; } }) .catch(() => { if (errBox) { errBox.textContent = '⚠️ Error de conexión.'; errBox.style.display = 'block'; } if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = origBtnText; } }); },submitLoginForm: function() { const form = document.getElementById('tc10-pw-form-login'); if (!form) return;const emailInput = form.querySelector('input[name="email"]'); const passInput = form.querySelector('input[name="password"]'); const submitBtn = document.getElementById('tc10-pw-btn-submit-login'); const errBox = document.getElementById('tc10-pw-login-error');const email = emailInput ? emailInput.value.trim() : ''; const password = passInput ? passInput.value : '';if (!email || !password) { if (errBox) { errBox.textContent = '⚠️ Por favor, introduce tu usuario/email y contraseña.'; errBox.style.display = 'block'; } return; }if (errBox) errBox.style.display = 'none';const origBtnText = submitBtn ? submitBtn.innerHTML : 'Iniciar Sesión'; if (submitBtn) { submitBtn.disabled = true; submitBtn.innerHTML = '⏳ Comprobando credenciales...'; }const self = this; fetch(this.config.restUrl + 'login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ email: email, password: password }) }) .then(res => res.json()) .then(data => { if (data.code || data.error || !data.success) { if (errBox) { errBox.textContent = '⚠️ ' + (data.message || 'Usuario o contraseña incorrectos.'); errBox.style.display = 'block'; } if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = origBtnText; } return; } if (data.nonce) self.config.nonce = data.nonce; self.state.user.isLoggedIn = true; self.state.user.email = (data.user && data.user.email) || email; self.state.user.credits = data.user && data.user.credits !== undefined ? parseInt(data.user.credits, 10) : 0; self.state.user.isSubscribed = !!(data.user && data.user.is_subscribed); self.updateUserBar(); self.closeModal('#tc10-pw-auth-modal'); self.showToast(data.message || '¡Sesión iniciada con éxito!', 'success');if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = origBtnText; } }) .catch(() => { if (errBox) { errBox.textContent = '⚠️ Error de conexión.'; errBox.style.display = 'block'; } if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = origBtnText; } }); },handleLogout: function() { const self = this; fetch(this.config.restUrl + 'logout', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include' }) .finally(() => { self.state.user.isLoggedIn = false; self.state.user.email = ''; self.state.user.credits = 0; self.updateUserBar(); self.showToast('Sesión cerrada.', 'info'); }); },createStripeCheckout: function(productKey) { if (!this.state.user.isLoggedIn) { this.openAuthModal('register'); return; }this.showToast('Conectando con Stripe...', 'info'); fetch(this.config.restUrl + 'stripe-create-checkout', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': this.config.nonce }, credentials: 'include', body: JSON.stringify({ product_key: productKey, return_url: window.location.href }) }) .then(res => res.json()) .then(data => { if (data.checkout_url) { window.location.href = data.checkout_url; } else { this.showToast(data.message || 'Error al conectar con Stripe.', 'error'); } }) .catch(() => { this.showToast('Error al conectar con la pasarela de pago.', 'error'); }); },showToast: function(message, type) { const toast = document.getElementById('tc10-pw-toast'); if (!toast) return; toast.textContent = message; toast.className = 'tc10-pw-toast active ' + (type || ''); clearTimeout(this._toastTimer); this._toastTimer = setTimeout(() => { toast.classList.remove('active'); }, 4500); },bindGlobalEvents: function() { document.addEventListener('click', (e) => { // Clic en fondo de modal para cerrar if (e.target.classList && e.target.classList.contains('tc10-pw-modal-overlay')) { e.target.classList.remove('active'); e.target.style.setProperty('display', 'none', 'important'); }// Clic en botón de modo const modeBtn = e.target.closest('[data-mode-target]'); if (modeBtn) { const targetMode = modeBtn.getAttribute('data-mode-target'); if (targetMode) this.setMode(targetMode); }// Clic en pestaña de auth dentro del modal const authTabBtn = e.target.closest('.tc10-pw-auth-tab-btn'); if (authTabBtn) { if (authTabBtn.id === 'tc10-pw-tab-btn-register') this.switchAuthTab('register'); else if (authTabBtn.id === 'tc10-pw-tab-btn-login') this.switchAuthTab('login'); }// Clic en píldora de categoría const catPill = e.target.closest('#tc10-pw-category-pills .tc10-pw-pill'); if (catPill) { const cat = catPill.getAttribute('data-cat'); if (cat) this.setCategory(cat, catPill); }// Clic en píldora de outfit const outfitPill = e.target.closest('#tc10-pw-outfit-pills .tc10-pw-pill'); if (outfitPill) { const outfit = outfitPill.getAttribute('data-outfit'); if (outfit) this.setOutfit(outfit, outfitPill); } }); } };// Exponer globalmente window.TC10_PW = TC10_PW;// Inicializar al cargar el DOM if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => TC10_PW.init()); } else { TC10_PW.init(); }})(window, document);