Hwado Live2D

訪れいただきありがとうございます。
ご自由にご覧ください。

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 = 予約可能 / X = 予約不能

(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

ハロウィーンアセット

イメージをクリックしてみてください。

ポートフォリオ


ご依頼に関する注意事項・利用規約

お申し込みをもって、以下の内容に同意したものとみなします。
注意事項を確認しなかったことによって発生した問題について、制作者は責任を負いかねます。

ご案内

1. パーツ分けされたPSDファイルが必要です。
└ パーツ分けが不十分な場合、イラストレーター様に修正を依頼していただくか、追加のパーツ分け料金が発生する場合があります。
2. 制作過程および完成モデルをSNSに掲載する場合があります。
制作物を使用する際は、(@Hwado_62)のクレジット表記をお願いいたします。
3. 公開日を指定することができます。
非公開期間によっては追加料金が発生する場合があります。永久非公開には対応しておりません。
4. 納品するのは、モデルの実行用ファイルである MOC3ファイルのみ です。
元のプロジェクトファイル(CMO3)は納品いたしません。

禁止事項

モデルファイルの無断配布・共有・転売は禁止です。
モデルを使用できるのは、ご依頼者本人のみです。友人や知人への共有も禁止しております。
元ファイルのリバースエンジニアリング、およびそれによって復元したファイルを利用した修正・改変・再加工は禁止です。
元ファイルが必要な場合や修正をご希望の場合は、リバースエンジニアリングを行わず、制作者へ直接お問い合わせください。正式にご購入いただくか、修正作業をご依頼ください。

お受けできないご依頼

制作者の技術・対応能力の範囲を超える場合、
ご依頼をお断りすることがあります。

  • G-18:ゴア表現

  • R-18:成人向けの過激な表現

  • メカ・フルアーマー


お支払い・返金について

⚠️ 企業・事務所などの所属の方は、別途お見積もりとなります。お支払いはPaypal invoiceとなります。予約金はお見積もり金額の10%です。
ご依頼者様の都合による予約キャンセルの場合、予約金は返金いたしません。
お見積もりのご案内から48時間以内に予約金をお振り込みいただくことで、
ご依頼が正式に確定します。
制作者の個人的な事情により予約をキャンセルする場合は、
予約金を含め全額返金いたします。
制作は、お見積もり金額の 50% の入金確認後に開始いたします。
分割払いにも対応しております。
完成モデルは、全額のお支払いを確認した後に納品いたします。
制作開始後(50%入金後)の返金はできません。


制作の流れ

申込書の提出→ -----お見積もりのご案内→ ---予約金のお振り込み→ ----ご依頼確定
-
お見積もり金額の50%の入金確認後、制作開始
-
中間修正段階
修正第1段階:頭部全体
修正第2段階:身体全体
-
残金の入金確認後、完成モデルを納品


Live2D 価格


Live2D loop animation wallpaper

ループアニメ壁紙

150 USD~

制作期間:14日間

  • リピーター様限定でご依頼可能

  • オプションによって料金が異なります

King seola / Art : Kkumang


Oltho-B / Art : Lim jaejin

LD Full body Rigging

プレミアムリギング

1800USD

制作期間: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動画URLを設定してください。'; 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のURLを確認してください。'; 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); })();

↓ 項目にマウスを合わせるか、クリックしてプレビューをご確認ください。 ↑

追加オプション(USD)
オプションの数やディテールによって、料金が変動する場合があります。

割引

(function () { const root = document.getElementById('hwado-pricing'); if (!root || root.dataset.ready) return; root.dataset.ready = 'true'; /* ======================================== オプションデータ 価格はUSD表記です。 説明はdesc欄で編集できます。 必要がない限りMP4のURLは変更しないでください。 ======================================== */ const options = [ /* 表情 */ { category: '表情', name: '表情追加(簡単)', price: '10', desc: '', video: 'https://framerusercontent.com/assets/yqEwC8eHpoc9ctjI6wzDsIQds.mp4' }, { category: '表情', name: '表情追加(複雑)', price: '50+', desc: '', video: 'https://framerusercontent.com/assets/Z36cZAJEt8wwO3MHh5DCT2yXc.mp4' }, { category: '表情', name: '口形状の変形', price: '150', desc: '', video: 'https://framerusercontent.com/assets/8Akkibwvr5ueNkHNrQMY972q3mg.mp4' }, { category: '表情', name: 'VBridger', price: '200', desc: '', video: 'https://framerusercontent.com/assets/qo4oXYngQuzUK94b090HFdOvANM.mp4', ratio: '2 / 1' }, { category: '表情', name: '舌出し', price: '100', desc: '', video: 'https://framerusercontent.com/assets/aFqZAXdsOun5ptJeCPM9gO0fOZg.mp4' }, /* 動物系アイテム(表情連動) */ { category: '動物系アイテム(表情連動)', name: '動物の耳', price: '100', desc: '', video: 'https://framerusercontent.com/assets/YjxQR3523rZf7CmYlJl7YjWUY4M.mp4' }, { category: '動物系アイテム(表情連動)', name: '角', price: '50+', desc: '', video: 'https://framerusercontent.com/assets/QhiySQHF20yGXbdEYNnwXwAnWA.mp4' }, { category: '動物系アイテム(表情連動)', name: 'しっぽ', price: '50', desc: '', video: 'https://framerusercontent.com/assets/SoydsYo3M7Fm7hu3UR2ZoN8zGrM.mp4' }, { category: '動物系アイテム(表情連動)', name: '翼', price: '50+', desc: '小型サイズを基準としています。', video: 'https://framerusercontent.com/assets/Q7ZJ1Rxioc5gAuQHs5WjkKgweOk.mp4' }, /* 頭部アクセサリー・ヘアスタイル */ { category: '頭部アクセサリー・ヘアスタイル', name: 'メガネ・マスク', price: '50', desc: '', video: 'https://framerusercontent.com/assets/S2BRNncMHUXy3y7VcWySJbf9M.mp4' }, { category: '頭部アクセサリー・ヘアスタイル', name: '大型マスク・帽子・頭部全体を覆う被り物', price: '100', desc: '', video: 'https://framerusercontent.com/assets/yPhswdT0cUqYKgkiamJLKYHZav4.mp4' }, { category: '頭部アクセサリー・ヘアスタイル', name: '前髪追加', price: '300', desc: '', video: 'https://framerusercontent.com/assets/7U3uuDpBZKNNn9sjvqT4FsXoY.mp4' }, { category: '頭部アクセサリー・ヘアスタイル', name: 'ヘアスタイル全体の追加', price: '350', desc: '', video: 'https://framerusercontent.com/assets/pQPq9cU3EExiBWiC52CslPSU5u0.mp4' }, /* 腕ポーズ・衣装追加 */ { category: '腕ポーズ・衣装追加', name: '腕ポーズ(小物なし)', price: '片腕 50 / 両腕 70', desc: '', video: 'https://framerusercontent.com/assets/ESYhJ5otsDEiDK2vGKUqvpS1mpA.mp4' }, { category: '腕ポーズ・衣装追加', name: 'マイク・小物ありの腕ポーズ', price: '80+', desc: '', video: 'https://framerusercontent.com/assets/8Sx2OvDv6joRInn4A2neOAppc84.mp4' }, { category: '腕ポーズ・衣装追加', name: 'ゲームパッド(キーボード連動)', price: '100', desc: '', video: 'https://framerusercontent.com/assets/Fn6mwlp3lwOpNiA5ZzF10BHaz4.mp4' }, { category: '腕ポーズ・衣装追加', name: 'タブレット・マウストラッキング', price: '100+', desc: '', video: 'https://framerusercontent.com/assets/ARqGveWLXmlxWEAgEuB5BavH4Q.mp4' }, { category: '腕ポーズ・衣装追加', name: '上着のON/OFF', price: '300', desc: '', video: 'https://framerusercontent.com/assets/XrhHI44pAOoAbUC3AI4L8Llvc.mp4' }, { category: '腕ポーズ・衣装追加', name: '衣装全体の追加', price: '600+', desc: '', video: 'https://framerusercontent.com/assets/v5W6fe4G8mAzKgKen1TGOdYxJMY.mp4', ratio: '9 / 16' }, { category: '腕ポーズ・衣装追加', name: '全身の色変更', price: '100+', desc: '全身の色変更', video: 'https://framerusercontent.com/assets/rQxuMCaT0hO9xqFNzASZtVAPSs.mp4', ratio: '9 / 16' }, /* プレミアムオプション */ { category: 'プレミアムオプション', name: '画面に近づく動き', price: '300', desc: '', video: 'https://framerusercontent.com/assets/uA2cM0Vx4sWCwtir1scao4UEec8.mp4' }, { category: 'プレミアムオプション', name: 'ハンドトラッキング', price: '500', desc: '', video: 'https://framerusercontent.com/assets/jNighQsUQyOrjiBxVrzhBBrA.mp4' }, { category: 'プレミアムオプション', name: 'SD化・ちびキャラ化', price: '400', desc: '', video: 'https://framerusercontent.com/assets/mbV2IVxVFyHhBzwvN5uSQWMY5e8.mp4' }, { category: 'プレミアムオプション', name: '左右180度回転', price: '1,000', desc: '', video: 'https://framerusercontent.com/assets/6KPteHItZrPGO1MagpB2uqXVUx8.mp4' } ]; /* 割引オプション */ const discounts = [ { name: 'リピーター割引', value: '全体から10%OFF' }, { name: '制作過程の公開許可', 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(); } } /* 選択したオプション行の中央にプレビューを配置 */ 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のURLを確認してください。'; 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年の予約 : 可能

2027010203040506070809101112
=XOXOOOXOOOOO

予約状況は随時変更される場合があります。
リピーター様の新衣装・新ヘアのご依頼は8月より受付可能です。