Hwado Live2D

Thank you for visiting.
Feel free to take a look around.

2027
01
02
03
04
05
06
07
08
09
10
11
12
=
X
O
X
O
O
O
X
O
O
O
O
O

O = Possible / X = Fully booked

(function () { var calendar = document.getElementById('hwado-booking'); if (!calendar) return; var button = calendar.querySelector('.booking-toggle'); button.addEventListener('click', function () { var opened = calendar.classList.toggle('is-open'); button.setAttribute('aria-expanded', String(opened)); }); })();

Adoptable Model (11/01~)

Contact : X DM / Email

Video

Halloween asset

click the image.

Portfolio


Term of service

By submitting an application, you are deemed to have agreed to the following terms.
The creator cannot be held responsible for any issues arising from failure to read the notices.

Guidelines

1. A PSD file with separately layered parts is required.
└ If the parts are not sufficiently separated, you may need to request revisions from the illustrator, or additional fees may apply for further part separation..
2. Work-in-progress materials and the completed model may be posted on social media.
Please credit (@Hwado_62) whenever you use the work.
3. You may specify the date on which the work can be made public.
Additional fees may apply depending on the length of the requested confidentiality period. Permanent confidentiality is not available.
4. Only the MOC3 file for running the model will be delivered.
The original project file (CMO3) will not be provided.

Prohibited Actions

Unauthorized distribution, sharing, or resale of model files is strictly prohibited.
The model may only be used by the client who commissioned it. Sharing it with friends or acquaintances is also prohibited.
Reverse-engineering the original file, as well as modifying or reworking the model using a reconstructed file, is not permitted.
If you need the original file or wish to make modifications, please do not attempt to reverse-engineer it. Instead, contact the creator directly to purchase the file officially or request modification work.

Requests That May Be Declined

Requests may be declined if they exceed the creator's current skill level or capabilities.

  • G-18: Gore

  • R-18: Explicit adult content

  • Mecha / full armor


Payment & Refunds

⚠️ Separate quotes apply to corporate clients and clients affiliated with MCNs (Multi-Channel Networks).Payment is accepted via Paypal invoice.The reservation deposit is 10% of the quoted price and is non-refundable if the client cancels the reservation.
To confirm your application, the reservation deposit must be paid within 48 hours of receiving the quote.
If the reservation is canceled due to the creator's personal circumstances, 100% of the amount paid, including the reservation deposit, will be refunded.Work will begin once 50% of the quoted price has been paid.
Installment payments are available. The completed model will be delivered only after the full payment has been received.
No refunds are available once work has begun (after the initial 50% payment).


Workflow

Submit the application form----→ -----Receive the quote-----
→ ----Pay the reservation deposit------ → ---- Application confirmed
-
Confirm receipt of 50% of the quoted price and begin work
-
Intermediate revision stage
Revision Stage 1: Entire head
Revision Stage 2: Entire body
-
Confirm receipt of the remaining balance and deliver the completed model


Live2D Price


no interactive

Live2D loop animation wallpaper

150 USD ~

Work period : 14 days

  • Available exclusively to existing clients

  • Pricing varies depending on the selected options.

King seola / Art : Kkumang


Oltho-B / Art : Lim jaejin

LD Full body Rigging

Primium Rig

1,800USD

Work period : 40days

  • Natural and wide-ranging movement for the head and body.

  • Soft, fluid physics that bring out the model’s charm.

  • Winks, angry eyebrows, happy expressions, and surprised expressions are included by default.


Included features

+ Included free service option

(() => { const root = document.getElementById('feature-preview'); if (!root || root.dataset.initialized) return; root.dataset.initialized = 'true'; const items = [...root.querySelectorAll('.fp-item')]; const card = root.querySelector('.fp-card'); const title = root.querySelector('.fp-card-title'); const desc = root.querySelector('.fp-card-desc'); const video = root.querySelector('video.fp-video'); const gifBox = root.querySelector('.fp-gif-box'); const placeholder = root.querySelector('.fp-placeholder'); const footer = root.querySelector('.fp-card-footer'); let activeItem = null; let hideTimer = null; let mediaVersion = 0; function stopMedia() { video.pause(); video.removeAttribute('src'); video.load(); video.style.display = 'none'; } /* 카드 위치: 옵션 중앙에 맞춤 */ function positionCard(item) { if (window.matchMedia('(max-width: 600px)').matches) { return; } const rect = item.getBoundingClientRect(); const cardRect = card.getBoundingClientRect(); const cardWidth = cardRect.width; const cardHeight = cardRect.height; const gap = 12; const edge = 12; let left = rect.left - cardWidth - gap; /* 왼쪽 공간이 부족하면 오른쪽으로 */ if (left < edge) { left = rect.right + gap; } /* 화면 밖으로 나가지 않도록 제한 */ left = Math.max( edge, Math.min(left, window.innerWidth - cardWidth - edge) ); /* 옵션과 카드의 세로 중앙 정렬 */ let top = rect.top + rect.height / 2 - cardHeight / 2; top = Math.max( edge, Math.min(top, window.innerHeight - cardHeight - edge) ); card.style.left = left + 'px'; card.style.top = top + 'px'; card.style.right = 'auto'; card.style.bottom = 'auto'; } function showPreview(item) { clearTimeout(hideTimer); if (!item) return; activeItem = item; items.forEach(el => { el.classList.toggle('is-active', el === item); }); title.textContent = item.dataset.title || ''; desc.textContent = item.dataset.desc || ''; footer.textContent = ''; /* data-ratio="portrait"인 항목만 세로형 */ gifBox.classList.toggle( 'is-portrait', item.dataset.ratio === 'portrait' ); card.classList.add('is-visible'); card.setAttribute('aria-hidden', 'false'); const version = ++mediaVersion; const url = (item.dataset.video || '').trim(); stopMedia(); placeholder.style.display = 'block'; if ( !url || url.startsWith('VIDEO_URL_') || url.includes('example.com/') ) { placeholder.textContent = '이 항목의 실제 MP4 주소를 입력해 주세요.'; requestAnimationFrame(() => positionCard(item)); return; } placeholder.textContent = '영상을 불러오는 중입니다.'; video.onloadeddata = () => { if (version !== mediaVersion) return; video.style.display = 'block'; placeholder.style.display = 'none'; requestAnimationFrame(() => positionCard(item)); video.play().catch(() => { if (version !== mediaVersion) return; placeholder.style.display = 'block'; placeholder.textContent = '자동 재생에 실패했습니다. 다시 확인해 주세요.'; }); }; video.onerror = () => { if (version !== mediaVersion) return; video.style.display = 'none'; placeholder.style.display = 'block'; placeholder.textContent = '영상을 불러올 수 없습니다. MP4 주소를 확인해 주세요.'; requestAnimationFrame(() => positionCard(item)); }; video.src = url; video.load(); requestAnimationFrame(() => positionCard(item)); } function hidePreview() { clearTimeout(hideTimer); hideTimer = setTimeout(() => { card.classList.remove('is-visible'); card.setAttribute('aria-hidden', 'true'); items.forEach(el => el.classList.remove('is-active')); activeItem = null; mediaVersion++; stopMedia(); }, 150); } items.forEach(item => { item.addEventListener('mouseenter', () => { if (window.matchMedia('(hover: hover)').matches) { showPreview(item); } }); item.addEventListener('mouseleave', hidePreview); item.addEventListener('focus', () => showPreview(item)); item.addEventListener('blur', hidePreview); item.addEventListener('click', () => showPreview(item)); }); card.addEventListener('mouseenter', () => clearTimeout(hideTimer)); card.addEventListener('mouseleave', hidePreview); root.addEventListener('click', event => { if ( !event.target.closest('.fp-item') && !event.target.closest('.fp-card') ) { hidePreview(); } }); document.addEventListener('keydown', event => { if (event.key === 'Escape') hidePreview(); }); window.addEventListener('resize', () => { if (activeItem && card.classList.contains('is-visible')) { positionCard(activeItem); } }); window.addEventListener('scroll', () => { if ( activeItem && card.classList.contains('is-visible') && !window.matchMedia('(max-width: 600px)').matches ) { positionCard(activeItem); } }, true); })();

↓ Hover over or click on each item to preview it. ↑

Additional Options(USD)
Prices may vary depending on the number of options and level of detail.

Discount

(function () { const root = document.getElementById('hwado-pricing'); if (!root || root.dataset.ready) return; root.dataset.ready = 'true'; /* ======================================== OPTION DATA Prices are in USD. Edit descriptions in the desc field. Keep MP4 URLs unchanged unless necessary. ======================================== */ const options = [ /* Facial Expressions */ { category: 'Facial Expressions', name: 'Add Expressions', price: '10', desc: '', video: 'https://framerusercontent.com/assets/yqEwC8eHpoc9ctjI6wzDsIQds.mp4' }, { category: 'Facial Expressions', name: 'Complex Expressions', price: '50+', desc: '', video: 'https://framerusercontent.com/assets/Z36cZAJEt8wwO3MHh5DCT2yXc.mp4' }, { category: 'Facial Expressions', name: 'Mouth Shape Deformation', price: '150', desc: '', video: 'https://framerusercontent.com/assets/8Akkibwvr5ueNkHNrQMY972q3mg.mp4' }, { category: 'Facial Expressions', name: 'VBridger', price: '200', desc: '', video: 'https://framerusercontent.com/assets/qo4oXYngQuzUK94b090HFdOvANM.mp4', ratio: '2 / 1' }, { category: 'Facial Expressions', name: 'Tongue Out', price: '100', desc: '', video: 'https://framerusercontent.com/assets/aFqZAXdsOun5ptJeCPM9gO0fOZg.mp4' }, /* Animal Items (connect Facial) */ { category: 'Animal Items (connect Facial)', name: 'Animal Ears', price: '100', desc: '', video: 'https://framerusercontent.com/assets/YjxQR3523rZf7CmYlJl7YjWUY4M.mp4' }, { category: 'Animal Items (connect Facial)', name: 'Horns', price: '50+', desc: '', video: 'https://framerusercontent.com/assets/QhiySQHF20yGXbdEYNnwXwAnWA.mp4' }, { category: 'Animal Items (connect Facial)', name: 'Tail', price: '50', desc: '', video: 'https://framerusercontent.com/assets/SoydsYo3M7Fm7hu3UR2ZoN8zGrM.mp4' }, { category: 'Animal Items (connect Facial)', name: 'Wings', price: '50+', desc: '', video: 'https://framerusercontent.com/assets/Q7ZJ1Rxioc5gAuQHs5WjkKgweOk.mp4' }, /* Head Accessories & Hairstyle */ { category: 'Head Accessories & Hairstyle', name: 'Glasses, Mask', price: '50', desc: '', video: 'https://framerusercontent.com/assets/S2BRNncMHUXy3y7VcWySJbf9M.mp4' }, { category: 'Head Accessories & Hairstyle', name: 'Extra Bangs Style, Hat', price: '100', desc: '', video: 'https://framerusercontent.com/assets/yPhswdT0cUqYKgkiamJLKYHZav4.mp4' }, { category: 'Head Accessories & Hairstyle', name: 'Extra Bang Hairstyle', price: '300', desc: '', video: 'https://framerusercontent.com/assets/7U3uuDpBZKNNn9sjvqT4FsXoY.mp4' }, { category: 'Head Accessories & Hairstyle', name: 'Extra Overall Hairstyle', price: '350', desc: '', video: 'https://framerusercontent.com/assets/pQPq9cU3EExiBWiC52CslPSU5u0.mp4' }, /* Extra Arm Poses & Outfit */ { category: 'Extra Arm Poses & Outfit', name: 'Arm Pose without Props', price: 'One Arm 50 / Both Arms 70', desc: '', video: 'https://framerusercontent.com/assets/ESYhJ5otsDEiDK2vGKUqvpS1mpA.mp4' }, { category: 'Extra Arm Poses & Outfit', name: 'Microphone / Arm Pose with Props', price: '80+', desc: '', video: 'https://framerusercontent.com/assets/8Sx2OvDv6joRInn4A2neOAppc84.mp4' }, { category: 'Extra Arm Poses & Outfit', name: 'Gamepad (connect Keyboard)', price: '100', desc: '', video: 'https://framerusercontent.com/assets/Fn6mwlp3lwOpNiA5ZzF10BHaz4.mp4' }, { category: 'Extra Arm Poses & Outfit', name: 'Tablet (Connect Mouse)', price: '100+', desc: '', video: 'https://framerusercontent.com/assets/ARqGveWLXmlxWEAgEuB5BavH4Q.mp4' }, { category: 'Extra Arm Poses & Outfit', name: 'Outer On/Off', price: '300', desc: '', video: 'https://framerusercontent.com/assets/XrhHI44pAOoAbUC3AI4L8Llvc.mp4' }, { category: 'Extra Arm Poses & Outfit', name: 'Extra Overall Outfit', price: '600+', desc: '', video: 'https://framerusercontent.com/assets/v5W6fe4G8mAzKgKen1TGOdYxJMY.mp4', ratio: '9 / 16' }, { category: 'Extra Arm Poses & Outfit', name: 'Color change (full body)', price: '100+', desc: '', video: 'https://framerusercontent.com/assets/rQxuMCaT0hO9xqFNzASZtVAPSs.mp4', ratio: '9 / 16' }, /* Premium Extra */ { category: 'Premium Extra', name: 'Get Closer', price: '300', desc: '', video: 'https://framerusercontent.com/assets/uA2cM0Vx4sWCwtir1scao4UEec8.mp4' }, { category: 'Premium Extra', name: 'Hand Tracking', price: '500', desc: '', video: 'https://framerusercontent.com/assets/jNighQsUQyOrjiBxVrzhBBrA.mp4' }, { category: 'Premium Extra', name: 'SD / Be Chibi', price: '400', desc: '', video: 'https://framerusercontent.com/assets/mbV2IVxVFyHhBzwvN5uSQWMY5e8.mp4' }, { category: 'Premium Extra', name: 'Side 180 Side Rotation', price: '1,000', desc: '', video: 'https://framerusercontent.com/assets/6KPteHItZrPGO1MagpB2uqXVUx8.mp4' } ]; /* Discount Options */ const discounts = [ { name: 'Revisiting', value: 'Overall 10%' }, { name: 'WIP Disclosure Allowed', value: '50~100 USD', desc: '' } ]; const list = root.querySelector('.option-list'); const discountList = root.querySelector('.discount-list'); const preview = root.querySelector('.preview'); const previewTitle = root.querySelector('.preview-title'); const previewDesc = root.querySelector('.preview-desc'); const previewMedia = root.querySelector('.preview-media'); const previewPrice = root.querySelector('.preview-price'); let pinnedButton = null; let focusedButton = null; let activeButton = null; function stopPreviewVideo() { const oldVideo = previewMedia.querySelector('video'); if (oldVideo) { oldVideo.pause(); oldVideo.removeAttribute('src'); oldVideo.load(); } } /* Center the preview on the selected option row */ function positionPreview(button) { const rect = button.getBoundingClientRect(); const gap = 12; const pad = 8; const width = preview.offsetWidth; const height = preview.offsetHeight; const optionCenterY = rect.top + rect.height / 2; let top = optionCenterY - height / 2; const maxTop = Math.max( pad, window.innerHeight - height - pad ); top = Math.max(pad, Math.min(top, maxTop)); let left = rect.right + gap; /* Move left if there is insufficient room on the right */ if (left + width > window.innerWidth - pad) { left = rect.left - width - gap; } /* Keep the preview within the viewport */ const maxLeft = Math.max( pad, window.innerWidth - width - pad ); left = Math.max(pad, Math.min(left, maxLeft)); preview.style.left = left + 'px'; preview.style.top = top + 'px'; preview.style.bottom = 'auto'; } function showOption(option, button) { activeButton = button; list.querySelectorAll('.option').forEach(function (item) { const selected = item === button; item.classList.toggle('selected', selected); item.setAttribute('aria-pressed', String(selected)); }); /* Set the video aspect ratio */ preview.classList.toggle( 'wide-preview', option.ratio === '2 / 1' ); preview.classList.toggle( 'portrait-preview', option.ratio === '9 / 16' ); previewTitle.textContent = option.name; previewDesc.textContent = option.desc || ''; previewPrice.textContent = option.price; stopPreviewVideo(); previewMedia.replaceChildren(); if (option.video && option.video.trim() !== '') { const video = document.createElement('video'); video.src = option.video.trim(); video.autoplay = true; video.loop = true; video.muted = true; video.playsInline = true; video.preload = 'metadata'; video.setAttribute('muted', ''); video.setAttribute('autoplay', ''); video.setAttribute('loop', ''); video.setAttribute('playsinline', ''); video.setAttribute( 'aria-label', option.name + ' preview' ); video.addEventListener('error', function () { if (activeButton === button) { const empty = document.createElement('div'); empty.className = 'preview-empty'; empty.textContent = 'Unable to load video. Please check the MP4 URL.'; previewMedia.replaceChildren(empty); } }); previewMedia.appendChild(video); const playPromise = video.play(); if ( playPromise && typeof playPromise.catch === 'function' ) { playPromise.catch(function () { /* Handle browser autoplay restrictions */ }); } } else { const empty = document.createElement('div'); empty.className = 'preview-empty'; empty.textContent = 'Video preview coming soon.'; previewMedia.appendChild(empty); } preview.classList.add('active'); /* Position after the preview dimensions are available */ requestAnimationFrame(function () { if ( activeButton === button && preview.classList.contains('active') ) { positionPreview(button); } }); } function hidePreviewIfIdle() { if (!pinnedButton && !focusedButton) { preview.classList.remove('active'); preview.classList.remove('wide-preview'); preview.classList.remove('portrait-preview'); activeButton = null; stopPreviewVideo(); list.querySelectorAll('.option').forEach(function (item) { item.classList.remove('selected'); item.setAttribute('aria-pressed', 'false'); }); } } let currentCategory = ''; options.forEach(function (option) { if (option.category !== currentCategory) { currentCategory = option.category; const heading = document.createElement('div'); heading.className = 'category'; heading.textContent = currentCategory; list.appendChild(heading); } const button = document.createElement('button'); button.type = 'button'; button.className = 'option'; button.setAttribute('aria-pressed', 'false'); const name = document.createElement('span'); name.className = 'option-name'; name.textContent = option.name; const price = document.createElement('span'); price.className = 'option-price'; price.textContent = option.price; button.append(name, price); button.addEventListener('mouseenter', function () { showOption(option, button); }); button.addEventListener('mouseleave', function () { hidePreviewIfIdle(); }); button.addEventListener('focus', function () { focusedButton = button; showOption(option, button); }); button.addEventListener('blur', function () { focusedButton = null; hidePreviewIfIdle(); }); button.addEventListener('click', function () { if (pinnedButton === button) { pinnedButton = null; hidePreviewIfIdle(); } else { pinnedButton = button; showOption(option, button); } }); list.appendChild(button); }); discounts.forEach(function (discount) { const row = document.createElement('div'); row.className = 'discount-row'; const name = document.createElement('div'); name.textContent = discount.name; const value = document.createElement('div'); value.className = 'discount-value'; value.textContent = discount.value; row.append(name, value); discountList.appendChild(row); if (discount.desc) { const note = document.createElement('div'); note.className = 'discount-note'; note.textContent = discount.desc; discountList.appendChild(note); } }); /* Reposition on window resize */ window.addEventListener('resize', function () { if (activeButton && preview.classList.contains('active')) { positionPreview(activeButton); } }); /* Reposition on scroll */ window.addEventListener('scroll', function () { if (activeButton && preview.classList.contains('active')) { positionPreview(activeButton); } }, true); })();

2027 reservation : Open

2027010203040506070809101112
=XOXOOOXOOOOO

Reservation availability is subject to change at any time.
New outfits and new hairstyles for existing clients will be available for commission starting in August.