📱 ¿Quieres cámara con órdenes de voz en directo y créditos a mitad de precio? Descarga la App oficial Posing AI Coach para iOS y Android.
Ver App Móvil →

TenUnCuerpo10 Probador Virtual & Posing AI (IFBB)

✨ Sube tus fotos para probarte el bikini o vestido

1 Foto de cuerpo entero + 1 Foto de la prenda. La IA generará tu simulación en segundos.

📸
1. Tu Foto de Cuerpo Entero
Haz clic para elegir foto (Buena luz)
Preview Modelo
👙
2. Foto del Bikini o Vestido
Sola, en maniquí o puesta en otra atleta
Preview Prenda
📸
Frontal
Pose de Frente
Front Preview
📸
Perfil Izq.
Perfil Izquierdo
Left Preview
📸
Espalda
Pose de Espalda
Back Preview
📸
Perfil Dcho.
Perfil Derecho
Right Preview
Procesando con la IA Neuronal de TenUnCuerpo10...
Analizando proporciones, simetría y reglamento IFBB. Por favor espera.
Al crear tu cuenta, aceptas nuestra Política de Privacidad.

🪙 Recarga de Créditos para Probador y Posing

Elige tu paquete de créditos. Pago 100% seguro con Stripe.

20 Créditos
4,99 €
20 Posing o hasta 6 Probador
80 Créditos/mes
9,99 €/mes
Suscripción Club Posing
📱 App Móvil Oficial (iOS y Android):
Créditos un 50% más baratos con órdenes de voz en directo.
Ver App →

📖 Guía Oficial de Uso y Requisitos de Foto

👙 1. Probador Virtual de Bikinis y Vestidos (3 Créditos)

Genera una simulación realista con iluminación de tarima y marcas de agua en HD en menos de 60 segundos.

  • Foto de Cuerpo Entero: De pie, mirando al frente, con buena iluminación y cuerpo completo visible.
  • Foto del Bikini o Prenda: Puedes usar una foto de la prenda sola sobre una superficie lisa, colocada en un maniquí o puesta en otra atleta, siempre que la prenda se vea completa, nítida y en posición frontal.
    ⚠️ Nota importante: Evita sombras marcadas sobre la prenda, ya que pueden alterar la detección de la forma o el tono exacto del tejido.

🏆 2. Evaluador de Posing y Giros IFBB (1 Crédito)

Para que la IA calibre tu puntuación con exactitud técnica y sin errores de apreciación, las fotos deben cumplir estos 5 requisitos:

1. Perspectiva Frontal y Perpendicular: Cámara perpendicular a la altura del pecho/cadera. Tomas diagonales o desde arriba distorsionan la simetría muscular.
2. Iluminación Frontal Clara: Luz directa hacia el atleta. Evita contraluces o sombras oscuras que oculten la definición muscular.
3. Encuadre de Cuerpo Entero: Desde los tacones reglamentarios hasta la cabeza para evaluar la línea vertical y proporción.
4. Atuendo y Calzado Reglamentario: Bikini, vestido o traje de baño de competición y tacones reglamentarios de tu categoría.
5. Fondo Limpio y Despejado: Pared lisa o tarima sin personas u objetos que interfieran en el análisis visual.
`;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);