Hwado Live2D

2027년 예약 : 오픈

개인 및 기업 의뢰 모두 환영합니다.
기업 및 프로젝트 의뢰: 규모와 일정에 따라 별도로 협의 가능합니다.
간단한 문의, 질문은 Q&A(익명 가능)으로 부탁드립니다.

할로윈 에셋

이미지를 클릭해보세요.

포트폴리오


공지 사항

신청함으로 아래 내용에 동의한 것으로 간주합니다.
공지사항을 확인하지 않음으로 발생하는 모든 문제는 작업자가 책임 질 수 없습니다.

안내

1. 파츠가 분리된 PSD 파일이 필요합니다.
└ 파츠 분리가 부족할 경우, 일러스트레이터에게 수정 요청을 하거나,
추가 파츠 분리 비용이 발생할 수 있습니다.
2. 작업과정과 완성본은 SNS에 업로드 될 수 있습니다.
작업물 사용 시 아이디(@Hwado_62)를 기재해주세요.
3. 공개 날짜는 지정이 가능합니다.
일정 기간부터는 추가금이 발생할 수 있습니다.
영구 비공개는 불가능합니다.
4. 완성본은 모델 실행용 (moc3) 파일만 전달됩니다.
작업 원본 파일 (cmo3)은 전달되지 않습니다.

금지

모델 파일의 무단 배포 및 공유, 재판매 금지입니다.
의뢰자 본인만 사용 가능합니다. 지인 공유도 안됩니다.
원본 파일의 역복원 및 이를 이용한 수정·재가공을 허용하지 않습니다.
원본이나 수정이 필요하신 경우, 역복원하지 마시고 해당 작업자에게 직접 문의하여
정식으로 구매하거나 수정 작업을 요청해 주세요.

거절

역량 부족으로 거절할 수 있습니다.

  • G-18 고어 요소

  • R-18 성인 등급의 수위 요소

  • 메카, 풀 아머


결제, 환불

⚠️ 기업·MCN 소속의 경우 별도 견적이 적용됩니다.결제는 계좌이체로 진행됩니다.견적은 부가세 10% 포함된 가격으로 안내됩니다.
개인은 현금영수증 / 사업자이실 경우 세금계산서가 완성본 전달과 함께 발급됩니다.
예약금은 견적의 10%이며, 예약 취소 시 환불되지 않습니다.
견적 안내 후 48시간 내 예약금을 입금하셔야 신청 확정이 됩니다.
- 작가의 개인 사정으로 인한 예약 취소는 예약금 포함 100% 환불됩니다.작업은 견적의 50%가 입금된 후에 시작됩니다.
분할 결제가 가능하며, 완성본은 전체 금액이 결제된 후에 전달됩니다.
작업 시작 후 (50%) 환불은 불가능합니다.


작업 진행 과정

신청서 제출 ------→ ------ 견적 안내------ → ------ 예약금 입금------ → ------ 신청 확정
-
견적 50% 입금 확인, 작업 진행
-
중간 수정 단계
수정 1단계 : 헤드 전체
수정 2단계 : 바디 전체
-
잔금 입금 확인, 완성본 전달


Live2D 가격 안내

모든 금액은 부가세 10% 포함된 가격입니다.


Live2D loop animation wallpaper

루프 애니메이션 월페이퍼

150,000원~

작업 기간 : 14일

  • 기존 의뢰자 한정 의뢰 가능

  • 옵션에 따라 가격 상이

킹설아 / 일러스트 : 꾸망


올쏘비 / 일러스트 : Lim jaejin

LD Full body Rigging

프리미엄 리깅

2,000,000원

작업 기간 : 40일

  • 두상과 몸의 자연스럽고 넓은 가동범위

  • 말랑하고 부드러운 물리로 모델의 매력을 돋보이게 해줍니다.

  • 윙크, 화난 눈썹, 기쁨, 놀람 기본 포함


기본 포함 기능

+ 무료 서비스 옵션

(() => { 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); })();

↓ 항목에 마우스를 올리거나 클릭하여 미리보기를 확인해 보세요. ↑

추가 옵션
옵션 수, 디테일에 따라 가격이 상이할 수 있습니다.

할인 옵션

(function () { const root = document.getElementById('hwado-pricing'); if (!root || root.dataset.ready) return; root.dataset.ready = 'true'; /* ======================================== 옵션 데이터 실제 MP4 주소를 video: ''에 입력하세요. ======================================== */ const options = [ /* 표정 */ { category: '표정', name: '표정(간단)', price: '10,000', desc: '기본 표정 추가', video: 'https://framerusercontent.com/assets/yqEwC8eHpoc9ctjI6wzDsIQds.mp4' }, { category: '표정', name: '표정 (복잡)', price: '50,000+', desc: '애니메이션, 특수 표정 등', video: 'https://framerusercontent.com/assets/Z36cZAJEt8wwO3MHh5DCT2yXc.mp4' }, { category: '표정', name: '입모양 변형', price: '150,000', desc: '입모양 변형', video: 'https://framerusercontent.com/assets/8Akkibwvr5ueNkHNrQMY972q3mg.mp4' }, { category: '표정', name: 'VBridger', price: '200,000', desc: 'VBridger 좌우 비교 영상, 퍼펙트 싱크는 아직 받지 않습니다.', video: 'https://framerusercontent.com/assets/qo4oXYngQuzUK94b090HFdOvANM.mp4', ratio: '2 / 1' }, { category: '표정', name: '메롱 혀', price: '100,000', desc: '혀 내밀기 인식', video: 'https://framerusercontent.com/assets/aFqZAXdsOun5ptJeCPM9gO0fOZg.mp4' }, /* 동물 아이템 */ { category: '동물 아이템', name: '동물 귀', price: '100,000', desc: '동물 귀 - 눈썹, 눈 깜빡임 연동', video: 'https://framerusercontent.com/assets/YjxQR3523rZf7CmYlJl7YjWUY4M.mp4' }, { category: '동물 아이템', name: '뿔', price: '50,000+', desc: '디자인에 따라 가격이 달라질 수 있습니다.', video: 'https://framerusercontent.com/assets/QhiySQHF20yGXbdEYNnwXwAnWA.mp4' }, { category: '동물 아이템', name: '꼬리', price: '50,000', desc: '꼬리 - 미소 연동', video: 'https://framerusercontent.com/assets/SoydsYo3M7Fm7hu3UR2ZoN8zGrM.mp4' }, { category: '동물 아이템', name: '날개 (작은 기준)', price: '50,000+', desc: '디자인, 크기에 따라 달라질 수 있습니다.', video: 'https://framerusercontent.com/assets/Q7ZJ1Rxioc5gAuQHs5WjkKgweOk.mp4' }, /* 소품, 헤어 */ { category: '소품, 헤어', name: '안경, 마스크', price: '50,000', desc: '안경, 마스크 추가', video: 'https://framerusercontent.com/assets/S2BRNncMHUXy3y7VcWySJbf9M.mp4' }, { category: '소품, 헤어', name: '가면, 두상 전체 탈', price: '100,000+', desc: '가면, 두상 전체를 덮는 탈', video: 'https://framerusercontent.com/assets/yPhswdT0cUqYKgkiamJLKYHZav4.mp4' }, { category: '소품, 헤어', name: '뒷머리만 추가', price: '300,000', desc: '뒷머리만 추가', video: 'https://framerusercontent.com/assets/7U3uuDpBZKNNn9sjvqT4FsXoY.mp4' }, { category: '소품, 헤어', name: '전체 헤어 추가', price: '350,000+', desc: '전체 헤어 추가', video: 'https://framerusercontent.com/assets/pQPq9cU3EExiBWiC52CslPSU5u0.mp4' }, /* 팔 포즈, 의상 */ { category: '팔 포즈, 의상', name: '팔 포즈 (소품 X)', price: '한 팔 50,000 / 양팔 70,000', desc: '소품이 없는 팔 포즈 - 애니메이션 추가 시 추가금 발생', video: 'https://framerusercontent.com/assets/ESYhJ5otsDEiDK2vGKUqvpS1mpA.mp4' }, { category: '팔 포즈, 의상', name: '팔 포즈 (소품 O)', price: '80,000+', desc: '마이크 또는 소품을 사용하는 팔 포즈', video: 'https://framerusercontent.com/assets/8Sx2OvDv6joRInn4A2neOAppc84.mp4' }, { category: '팔 포즈, 의상', name: '게임패드 (키보드)', price: '100,000+', desc: '게임패드의 키를 키보드에 연동합니다.', video: 'https://framerusercontent.com/assets/Fn6mwlp3lwOpNiA5ZzF10BHaz4.mp4' }, { category: '팔 포즈, 의상', name: '타블릿 / 마우스 추적', price: '100,000+', desc: '타블릿 또는 마우스 추적', video: 'https://framerusercontent.com/assets/ARqGveWLXmlxWEAgEuB5BavH4Q.mp4' }, { category: '팔 포즈, 의상', name: '겉옷 추가', price: '300,000+', desc: '겉옷 추가', video: 'https://framerusercontent.com/assets/XrhHI44pAOoAbUC3AI4L8Llvc.mp4' }, { category: '팔 포즈, 의상', name: '전체 의상 추가', price: '600,000+', desc: '전체 의상 추가 · 전신 확인용', video: 'https://framerusercontent.com/assets/v5W6fe4G8mAzKgKen1TGOdYxJMY.mp4', ratio: '9 / 16' }, { category: '팔 포즈, 의상', name: '색상 변경 (전신 기준)', price: '100,000+', desc: '색상 변경 (전신 기준)', video: 'https://framerusercontent.com/assets/rQxuMCaT0hO9xqFNzASZtVAPSs.mp4', ratio: '9 / 16' }, /* 프리미엄 추가 */ { category: '프리미엄 추가', name: '가치코이', price: '300,000', desc: '화면 기준으로 가까워지고 멀어지는 거리를 표현합니다.', video: 'https://framerusercontent.com/assets/uA2cM0Vx4sWCwtir1scao4UEec8.mp4' }, { category: '프리미엄 추가', name: '핸드트래킹', price: '500,000', desc: '웹캠을 이용하여 손을 트래킹합니다.', video: 'https://framerusercontent.com/assets/jNighQsUQyOrjiBxVrzhBBrA.mp4' }, { category: '프리미엄 추가', name: 'SD화', price: '400,000', desc: 'SD로 변합니다. 일러스트 작가님의 허락이 필요합니다.', video: 'https://framerusercontent.com/assets/mbV2IVxVFyHhBzwvN5uSQWMY5e8.mp4' }, { category: '프리미엄 추가', name: '완전 측면', price: '1,000,000', desc: '좌우 180도 회전', video: 'https://framerusercontent.com/assets/6KPteHItZrPGO1MagpB2uqXVUx8.mp4' } ]; /* 할인 옵션 */ const discounts = [ { name: '재방문 할인', value: '전체 10%' }, { name: '작업 과정 공개 허용', value: '100,000', desc: 'X만 공개 시 50,000원 할인, 방송까지 공개 시 10만원 할인' } ]; 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(); } } /* ======================================== 핵심 수정: 미리보기 카드 중앙을 옵션 행 중앙에 정렬 ======================================== */ 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; /* 오른쪽 공간이 부족하면 왼쪽에 배치 */ if (left + width > window.innerWidth - pad) { left = rect.left - width - gap; } /* 화면 좌우 경계 제한 */ 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)); }); /* 옵션별 영상 비율 */ 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 + ' 미리보기' ); video.addEventListener('error', function () { if (activeButton === button) { const empty = document.createElement('div'); empty.className = 'preview-empty'; empty.textContent = '영상을 불러올 수 없습니다. MP4 주소를 확인해 주세요.'; previewMedia.replaceChildren(empty); } }); previewMedia.appendChild(video); const playPromise = video.play(); if ( playPromise && typeof playPromise.catch === 'function' ) { playPromise.catch(function () { /* 브라우저의 자동 재생 제한 */ }); } } else { const empty = document.createElement('div'); empty.className = 'preview-empty'; empty.textContent = '이 옵션의 영상을 준비 중입니다.'; previewMedia.appendChild(empty); } preview.classList.add('active'); /* 카드 표시 후 실제 크기로 위치 계산 */ 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); } }); /* 창 크기가 바뀌면 옵션 중앙에 맞춰 다시 배치 */ window.addEventListener('resize', function () { if (activeButton && preview.classList.contains('active')) { positionPreview(activeButton); } }); /* 스크롤 시에도 현재 옵션의 위치를 다시 계산 */ window.addEventListener('scroll', function () { if (activeButton && preview.classList.contains('active')) { positionPreview(activeButton); } }, true); })();

2027년 예약 : Open

2027010203040506070809101112
=XOXOOOXOOOOO

예약 현황은 언제든 변경될 수 있습니다.
기존 의뢰자 분들의 신의상, 신헤어 의뢰는 8월부터 가능합니다.