初次上传
511
DesktopPet.py
Normal file
@@ -0,0 +1,511 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
2333娘桌宠
|
||||
基于 tkinter 的透明窗口桌面宠物,无需第三方依赖。
|
||||
- 左键拖动移动
|
||||
- 双击:开心跳跃 + "2333!" 气泡
|
||||
- 右键:弹出菜单(说话 / 切换表情 / 置顶 / 退出)
|
||||
- 自动呼吸、眨眼、偶尔随机吐槽
|
||||
"""
|
||||
|
||||
import math
|
||||
import random
|
||||
import sys
|
||||
import tkinter as tk
|
||||
|
||||
# ============== 颜色配置 ==============
|
||||
COLOR_BG = '#FF00FF' # 透明色(纯品红,绘制中不使用)
|
||||
COLOR_HAIR = '#00AEEC' # B站蓝
|
||||
COLOR_HAIR_DARK = '#0090C8'
|
||||
COLOR_HAIR_LIGHT = '#5FC8F2'
|
||||
COLOR_SKIN = '#FFE6D5'
|
||||
COLOR_SKIN_SHADOW = '#FAD0BC'
|
||||
COLOR_BLUSH = '#FF9FB2'
|
||||
COLOR_EYE = '#2EA9DF'
|
||||
COLOR_EYE_DARK = '#1B7FB8'
|
||||
COLOR_WHITE = '#FFFFFF'
|
||||
COLOR_DRESS = '#F2FAFF'
|
||||
COLOR_DRESS_BLUE = '#00AEEC'
|
||||
COLOR_DRESS_DARK = '#0090C8'
|
||||
COLOR_MOUTH = '#C8485A'
|
||||
COLOR_MOUTH_INNER = '#FF8A9A'
|
||||
COLOR_TONGUE = '#FFB6C1'
|
||||
COLOR_ACCENT = '#FB7299' # B站粉
|
||||
COLOR_DARK = '#3A3A3A'
|
||||
COLOR_SCREEN = '#1E2233' # 额头成像仪屏幕
|
||||
|
||||
# ============== 画布尺寸 ==============
|
||||
WIDTH = 240
|
||||
HEIGHT = 310
|
||||
CX = WIDTH // 2
|
||||
FRAME_MS = 33 # ~30fps
|
||||
|
||||
# ============== 随机吐槽语 ==============
|
||||
IDLE_MESSAGES = [
|
||||
'2333~', '哈哈哈~', '干杯!(´・ω・`)', '哔哩哔哩☆', '今天也要元气满满哦!',
|
||||
'戳我干嘛 (`ε´)', '最喜欢姐姐了~', '需要充电...zzZ', '2233娘最强!',
|
||||
'233333333', '再看就把你吃掉!', '帮我插个插座?', '咕~ 咕~',
|
||||
'今天视频审核完了吗?', '点击这里投喂电池 →',
|
||||
]
|
||||
|
||||
|
||||
class DesktopPet:
|
||||
"""2333娘桌宠主类"""
|
||||
|
||||
def __init__(self, blocking=True, on_exit=None):
|
||||
"""blocking=True 时调用 mainloop 阻塞;False 时由外部驱动 root.update()。
|
||||
on_exit: 退出时的回调(用于通知调用者恢复)。"""
|
||||
self._blocking = blocking
|
||||
self._on_exit = on_exit
|
||||
self._exited = False
|
||||
self.root = tk.Tk()
|
||||
self.root.title('2333娘')
|
||||
# 初始位置:屏幕右下角
|
||||
sx = self.root.winfo_screenwidth() - WIDTH - 30
|
||||
sy = self.root.winfo_screenheight() - HEIGHT - 80
|
||||
self.root.geometry(f'{WIDTH}x{HEIGHT}+{sx}+{sy}')
|
||||
self.root.overrideredirect(True)
|
||||
self.root.attributes('-topmost', True)
|
||||
self.root.config(bg=COLOR_BG)
|
||||
try:
|
||||
self.root.attributes('-transparentcolor', COLOR_BG)
|
||||
except tk.TclError:
|
||||
pass
|
||||
|
||||
self.canvas = tk.Canvas(
|
||||
self.root, width=WIDTH, height=HEIGHT,
|
||||
bg=COLOR_BG, highlightthickness=0, bd=0
|
||||
)
|
||||
self.canvas.pack()
|
||||
|
||||
# ----- 动画状态 -----
|
||||
self.t = 0.0
|
||||
self.dt = FRAME_MS / 1000.0
|
||||
self.bob_y = 0.0
|
||||
self.jump_y = 0.0
|
||||
self.jump_vel = 0.0
|
||||
|
||||
# 眨眼
|
||||
self.blink_phase = 0.0 # 0=睁眼;>0=正在眨眼
|
||||
self.next_blink = random.uniform(2.0, 5.0)
|
||||
self.eye_open = 1.0
|
||||
|
||||
# 表情与说话
|
||||
self.expression = 'laugh' # laugh / happy / shy / wink
|
||||
self.speech_text = ''
|
||||
self.speech_timer = 0.0
|
||||
self.idle_countdown = random.uniform(6.0, 12.0)
|
||||
|
||||
# 拖动
|
||||
self._drag_dx = 0
|
||||
self._drag_dy = 0
|
||||
self._dragging = False
|
||||
|
||||
# 互动粒子(爱心/星星)
|
||||
self.particles = [] # list of dict
|
||||
|
||||
self._build_menu()
|
||||
self._bind_events()
|
||||
self._schedule_idle_speech()
|
||||
self._tick()
|
||||
if self._blocking:
|
||||
self.root.mainloop()
|
||||
|
||||
# ================= 菜单 =================
|
||||
def _build_menu(self):
|
||||
self.menu = tk.Menu(self.root, tearoff=0)
|
||||
self.menu.add_command(label='说句话 (2333~)', command=self._say_random)
|
||||
self.menu.add_separator()
|
||||
self.menu.add_command(label='表情:大笑', command=lambda: self._set_expr('laugh'))
|
||||
self.menu.add_command(label='表情:开心', command=lambda: self._set_expr('happy'))
|
||||
self.menu.add_command(label='表情:害羞', command=lambda: self._set_expr('shy'))
|
||||
self.menu.add_command(label='表情:眨眼', command=lambda: self._set_expr('wink'))
|
||||
self.menu.add_separator()
|
||||
self.menu.add_command(label='跳一下!', command=self._jump)
|
||||
self.menu.add_command(label='置顶 / 取消置顶', command=self._toggle_topmost)
|
||||
self.menu.add_separator()
|
||||
self.menu.add_command(label='Live2D 模式 ✨', command=self._switch_to_live2d)
|
||||
self.menu.add_separator()
|
||||
self.menu.add_command(label='退出 (。•́︿•̀。)', command=self._quit)
|
||||
|
||||
# ================= 事件绑定 =================
|
||||
def _bind_events(self):
|
||||
self.canvas.bind('<ButtonPress-1>', self._on_press)
|
||||
self.canvas.bind('<B1-Motion>', self._on_drag)
|
||||
self.canvas.bind('<ButtonRelease-1>', self._on_release)
|
||||
self.canvas.bind('<ButtonPress-3>', self._on_right)
|
||||
self.canvas.bind('<Double-Button-1>', self._on_double)
|
||||
self.root.bind('<Escape>', lambda e: self._quit())
|
||||
|
||||
# ----- 鼠标交互 -----
|
||||
def _on_press(self, e):
|
||||
self._dragging = True
|
||||
self._drag_dx = e.x_root - self.root.winfo_x()
|
||||
self._drag_dy = e.y_root - self.root.winfo_y()
|
||||
|
||||
def _on_drag(self, e):
|
||||
if self._dragging:
|
||||
x = e.x_root - self._drag_dx
|
||||
y = e.y_root - self._drag_dy
|
||||
self.root.geometry(f'+{x}+{y}')
|
||||
|
||||
def _on_release(self, e):
|
||||
self._dragging = False
|
||||
|
||||
def _on_right(self, e):
|
||||
try:
|
||||
self.menu.tk_popup(e.x_root, e.y_root)
|
||||
finally:
|
||||
self.menu.grab_release()
|
||||
|
||||
def _on_double(self, e):
|
||||
self._jump()
|
||||
self._say('2333!')
|
||||
|
||||
# ----- 菜单动作 -----
|
||||
def _set_expr(self, expr):
|
||||
self.expression = expr
|
||||
self._say({'laugh': '2333~', 'happy': '嘿嘿~', 'shy': '呜...>//<', 'wink': '★~'}[expr])
|
||||
|
||||
def _say(self, text):
|
||||
self.speech_text = text
|
||||
self.speech_timer = 2.4
|
||||
|
||||
def _say_random(self):
|
||||
self._say(random.choice(IDLE_MESSAGES))
|
||||
|
||||
def _jump(self):
|
||||
if self.jump_y == 0 and self.jump_vel == 0:
|
||||
self.jump_vel = -13.0
|
||||
|
||||
def _toggle_topmost(self):
|
||||
self.root.attributes('-topmost', not self.root.attributes('-topmost'))
|
||||
|
||||
def _switch_to_live2d(self):
|
||||
"""切换回 Live2D 模式(非阻塞模式下通知调用者恢复)"""
|
||||
self._do_exit()
|
||||
|
||||
def _do_exit(self):
|
||||
"""统一退出处理"""
|
||||
if self._exited:
|
||||
return
|
||||
self._exited = True
|
||||
try:
|
||||
self.root.destroy()
|
||||
except Exception:
|
||||
pass
|
||||
if self._on_exit:
|
||||
self._on_exit()
|
||||
elif self._blocking:
|
||||
sys.exit(0)
|
||||
|
||||
def _quit(self):
|
||||
self._do_exit()
|
||||
|
||||
def _schedule_idle_speech(self):
|
||||
# 用随机定时器在 _tick 中处理,这里不需要额外线程
|
||||
pass
|
||||
|
||||
# ================= 主循环 =================
|
||||
def _tick(self):
|
||||
self.t += self.dt
|
||||
|
||||
# 呼吸浮动
|
||||
self.bob_y = math.sin(self.t * 2.2) * 3.0
|
||||
|
||||
# 跳跃物理
|
||||
if self.jump_y < 0 or self.jump_vel < 0:
|
||||
self.jump_vel += 1.1 # 重力
|
||||
self.jump_y += self.jump_vel
|
||||
if self.jump_y >= 0:
|
||||
self.jump_y = 0.0
|
||||
self.jump_vel = 0.0
|
||||
|
||||
# 眨眼计时
|
||||
if self.blink_phase == 0.0:
|
||||
self.next_blink -= self.dt
|
||||
if self.next_blink <= 0:
|
||||
self.blink_phase = 0.0001
|
||||
else:
|
||||
self.blink_phase += self.dt
|
||||
# 0~0.05 闭眼,0.05~0.13 闭着,0.13~0.20 睁眼
|
||||
p = self.blink_phase
|
||||
if p < 0.05:
|
||||
self.eye_open = 1.0 - (p / 0.05)
|
||||
elif p < 0.13:
|
||||
self.eye_open = 0.0
|
||||
elif p < 0.20:
|
||||
self.eye_open = (p - 0.13) / 0.07
|
||||
else:
|
||||
self.eye_open = 1.0
|
||||
self.blink_phase = 0.0
|
||||
self.next_blink = random.uniform(2.5, 6.5)
|
||||
self.eye_open = max(0.0, min(1.0, self.eye_open))
|
||||
|
||||
# wink 表情强制一只眼闭着
|
||||
if self.expression == 'wink':
|
||||
self._wink_left_open = True
|
||||
|
||||
# 说话气泡计时
|
||||
if self.speech_timer > 0:
|
||||
self.speech_timer -= self.dt
|
||||
if self.speech_timer <= 0:
|
||||
self.speech_text = ''
|
||||
|
||||
# 随机吐槽
|
||||
self.idle_countdown -= self.dt
|
||||
if self.idle_countdown <= 0:
|
||||
self.idle_countdown = random.uniform(10.0, 20.0)
|
||||
if not self.speech_text and random.random() < 0.7:
|
||||
self._say(random.choice(IDLE_MESSAGES))
|
||||
|
||||
# 粒子更新
|
||||
self._update_particles()
|
||||
|
||||
self._draw()
|
||||
self.root.after(FRAME_MS, self._tick)
|
||||
|
||||
# ================= 绘制 =================
|
||||
def _draw(self):
|
||||
c = self.canvas
|
||||
c.delete('all')
|
||||
oy = self.bob_y + self.jump_y
|
||||
|
||||
self._draw_hair_back(oy)
|
||||
self._draw_body(oy)
|
||||
self._draw_face(oy)
|
||||
self._draw_forehead_device(oy)
|
||||
self._draw_blush(oy)
|
||||
self._draw_eyes(oy)
|
||||
self._draw_mouth(oy)
|
||||
self._draw_hair_front(oy)
|
||||
self._draw_ahoge(oy)
|
||||
self._draw_particles()
|
||||
self._draw_speech(oy)
|
||||
|
||||
# ----- 后侧头发 -----
|
||||
def _draw_hair_back(self, oy):
|
||||
c = self.canvas
|
||||
# 大块蓝色后发
|
||||
c.create_oval(CX - 96, 36 + oy, CX + 96, 196 + oy, fill=COLOR_HAIR, outline=COLOR_HAIR_DARK, width=2)
|
||||
# 两侧散发
|
||||
c.create_oval(CX - 100, 120 + oy, CX - 60, 230 + oy, fill=COLOR_HAIR, outline=COLOR_HAIR_DARK, width=2)
|
||||
c.create_oval(CX + 60, 120 + oy, CX + 100, 230 + oy, fill=COLOR_HAIR, outline=COLOR_HAIR_DARK, width=2)
|
||||
|
||||
# ----- 脸 -----
|
||||
def _draw_face(self, oy):
|
||||
c = self.canvas
|
||||
c.create_oval(CX - 80, 44 + oy, CX + 80, 196 + oy, fill=COLOR_SKIN, outline=COLOR_SKIN_SHADOW, width=2)
|
||||
|
||||
# ----- 额头成像仪(33娘特征)-----
|
||||
def _draw_forehead_device(self, oy):
|
||||
c = self.canvas
|
||||
cx, cy = CX, 80 + oy
|
||||
# 外圈
|
||||
c.create_oval(cx - 16, cy - 16, cx + 16, cy + 16, fill=COLOR_DRESS_BLUE, outline=COLOR_DRESS_DARK, width=2)
|
||||
# 屏幕
|
||||
c.create_oval(cx - 11, cy - 11, cx + 11, cy + 11, fill=COLOR_SCREEN, outline='')
|
||||
# 屏幕上的小光点(呼吸)
|
||||
glow = 0.5 + 0.5 * math.sin(self.t * 3)
|
||||
col = self._mix(COLOR_HAIR_LIGHT, COLOR_WHITE, glow)
|
||||
c.create_oval(cx - 4, cy - 4, cx + 4, cy + 4, fill=col, outline='')
|
||||
|
||||
# ----- 腮红 -----
|
||||
def _draw_blush(self, oy):
|
||||
c = self.canvas
|
||||
alpha = 1.0
|
||||
if self.expression == 'shy':
|
||||
alpha = 1.4
|
||||
col = self._mix(COLOR_SKIN, COLOR_BLUSH, min(1.0, 0.6 * alpha))
|
||||
c.create_oval(CX - 58, 138 + oy, CX - 28, 156 + oy, fill=col, outline='')
|
||||
c.create_oval(CX + 28, 138 + oy, CX + 58, 156 + oy, fill=col, outline='')
|
||||
|
||||
# ----- 眼睛 -----
|
||||
def _draw_eyes(self, oy):
|
||||
c = self.canvas
|
||||
lex, rex = CX - 34, CX + 34
|
||||
ey = 120 + oy
|
||||
open_f = self.eye_open
|
||||
|
||||
wink = (self.expression == 'wink')
|
||||
left_open = open_f
|
||||
right_open = 0.0 if wink else open_f
|
||||
|
||||
for (ex, op) in ((lex, left_open), (rex, right_open)):
|
||||
if op > 0.15:
|
||||
self._draw_open_eye(ex, ey, op)
|
||||
else:
|
||||
# 闭眼弧线
|
||||
c.create_arc(ex - 14, ey - 6, ex + 14, ey + 8, start=20, extent=140,
|
||||
style='arc', outline=COLOR_DARK, width=2.5)
|
||||
|
||||
def _draw_open_eye(self, ex, ey, op):
|
||||
c = self.canvas
|
||||
# 眼白
|
||||
ry = 22 * op
|
||||
c.create_oval(ex - 16, ey - ry, ex + 16, ey + ry, fill=COLOR_WHITE, outline=COLOR_DARK, width=1.5)
|
||||
# 虹膜
|
||||
ir = 12
|
||||
c.create_oval(ex - ir, ey - ir, ex + ir, ey + ir, fill=COLOR_EYE, outline='')
|
||||
# 瞳孔
|
||||
c.create_oval(ex - 6, ey - 6, ex + 6, ey + 6, fill=COLOR_DARK, outline='')
|
||||
# 高光
|
||||
c.create_oval(ex - 9, ey - 9, ex - 3, ey - 3, fill=COLOR_WHITE, outline='')
|
||||
c.create_oval(ex + 3, ey + 2, ex + 7, ey + 6, fill=COLOR_WHITE, outline='')
|
||||
|
||||
# ----- 嘴 -----
|
||||
def _draw_mouth(self, oy):
|
||||
c = self.canvas
|
||||
mx, my = CX, 158 + oy
|
||||
expr = self.expression
|
||||
if expr == 'laugh':
|
||||
# 大笑:张开嘴
|
||||
w = 20 + 3 * math.sin(self.t * 8)
|
||||
c.create_oval(mx - w, my - 6, mx + w, my + 14, fill=COLOR_MOUTH_INNER, outline=COLOR_MOUTH, width=2)
|
||||
# 舌头
|
||||
c.create_oval(mx - 10, my + 2, mx + 10, my + 14, fill=COLOR_TONGUE, outline='')
|
||||
# 上唇线
|
||||
c.create_arc(mx - w, my - 12, mx + w, my + 6, start=200, extent=140, style='arc', outline=COLOR_MOUTH, width=2)
|
||||
elif expr == 'happy':
|
||||
# 微笑弧
|
||||
c.create_arc(mx - 14, my - 8, mx + 14, my + 10, start=20, extent=140, style='arc', outline=COLOR_MOUTH, width=2.5)
|
||||
elif expr == 'shy':
|
||||
# 小抿嘴
|
||||
c.create_line(mx - 8, my, mx + 8, my, fill=COLOR_MOUTH, width=2.5, smooth=True)
|
||||
c.create_arc(mx - 6, my - 4, mx + 6, my + 4, start=200, extent=140, style='arc', outline=COLOR_MOUTH, width=2)
|
||||
else: # wink
|
||||
c.create_arc(mx - 12, my - 6, mx + 12, my + 12, start=20, extent=140, style='arc', outline=COLOR_MOUTH, width=2.5)
|
||||
|
||||
# ----- 前侧头发(刘海)-----
|
||||
def _draw_hair_front(self, oy):
|
||||
c = self.canvas
|
||||
# 头顶发盖
|
||||
c.create_oval(CX - 86, 30 + oy, CX + 86, 120 + oy, fill=COLOR_HAIR, outline=COLOR_HAIR_DARK, width=2)
|
||||
# 刘海锯齿
|
||||
bang_pts = []
|
||||
tips = [
|
||||
(CX - 80, 96), (CX - 64, 70), (CX - 48, 96),
|
||||
(CX - 30, 74), (CX - 12, 98), (CX + 6, 76),
|
||||
(CX + 24, 96), (CX + 44, 72), (CX + 62, 96),
|
||||
(CX + 80, 78),
|
||||
]
|
||||
top_y = 44 + oy
|
||||
# 沿头顶弧线生成上沿
|
||||
for i, (tx, ty) in enumerate(tips):
|
||||
bang_pts.append((tx, ty + oy))
|
||||
# 用多边形画几缕刘海
|
||||
for i in range(0, len(tips) - 1, 2):
|
||||
x1, y1 = tips[i]
|
||||
x2, y2 = tips[i + 1]
|
||||
xm, ym = (x1 + x2) / 2, max(y1, y2) + 18
|
||||
c.create_polygon(x1, top_y, x1, y1 + oy, xm, ym + oy, x2, y2 + oy, x2, top_y,
|
||||
fill=COLOR_HAIR, outline=COLOR_HAIR_DARK, width=1.5)
|
||||
# 两侧鬓发
|
||||
c.create_polygon(CX - 86, 60 + oy, CX - 92, 170 + oy, CX - 64, 150 + oy, CX - 60, 70 + oy,
|
||||
fill=COLOR_HAIR, outline=COLOR_HAIR_DARK, width=1.5)
|
||||
c.create_polygon(CX + 86, 60 + oy, CX + 92, 170 + oy, CX + 64, 150 + oy, CX + 60, 70 + oy,
|
||||
fill=COLOR_HAIR, outline=COLOR_HAIR_DARK, width=1.5)
|
||||
|
||||
# ----- 呆毛 -----
|
||||
def _draw_ahoge(self, oy):
|
||||
c = self.canvas
|
||||
sway = math.sin(self.t * 3) * 4
|
||||
# 一根弯曲呆毛
|
||||
c.create_line(CX, 30 + oy, CX - 6 + sway, 6 + oy, CX + 6 + sway, 2 + oy,
|
||||
fill=COLOR_HAIR_DARK, width=4, smooth=True, capstyle='round')
|
||||
|
||||
# ----- 身体 / 裙子 -----
|
||||
def _draw_body(self, oy):
|
||||
c = self.canvas
|
||||
# 脖子
|
||||
c.create_rectangle(CX - 14, 186 + oy, CX + 14, 210 + oy, fill=COLOR_SKIN, outline=COLOR_SKIN_SHADOW, width=1.5)
|
||||
# 裙子上半(白色)
|
||||
c.create_polygon(CX - 44, 210 + oy, CX + 44, 210 + oy, CX + 54, 270 + oy, CX - 54, 270 + oy,
|
||||
fill=COLOR_DRESS, outline=COLOR_DRESS_DARK, width=2)
|
||||
# 蓝色领结/缎带
|
||||
c.create_polygon(CX - 24, 206 + oy, CX + 24, 206 + oy, CX + 18, 224 + oy, CX - 18, 224 + oy,
|
||||
fill=COLOR_DRESS_BLUE, outline=COLOR_DRESS_DARK, width=1.5)
|
||||
c.create_oval(CX - 6, 208 + oy, CX + 6, 220 + oy, fill=COLOR_ACCENT, outline='')
|
||||
# 裙摆蓝色边
|
||||
c.create_polygon(CX - 54, 262 + oy, CX + 54, 262 + oy, CX + 58, 276 + oy, CX - 58, 276 + oy,
|
||||
fill=COLOR_DRESS_BLUE, outline=COLOR_DRESS_DARK, width=1.5)
|
||||
# 手臂
|
||||
c.create_oval(CX - 60, 214 + oy, CX - 40, 250 + oy, fill=COLOR_DRESS, outline=COLOR_DRESS_DARK, width=1.5)
|
||||
c.create_oval(CX + 40, 214 + oy, CX + 60, 250 + oy, fill=COLOR_DRESS, outline=COLOR_DRESS_DARK, width=1.5)
|
||||
# 手
|
||||
c.create_oval(CX - 62, 244 + oy, CX - 44, 262 + oy, fill=COLOR_SKIN, outline=COLOR_SKIN_SHADOW, width=1.5)
|
||||
c.create_oval(CX + 44, 244 + oy, CX + 62, 262 + oy, fill=COLOR_SKIN, outline=COLOR_SKIN_SHADOW, width=1.5)
|
||||
|
||||
# ----- 粒子(爱心)-----
|
||||
def _spawn_hearts(self, n=6):
|
||||
for _ in range(n):
|
||||
self.particles.append({
|
||||
'x': CX + random.uniform(-30, 30),
|
||||
'y': 110 + random.uniform(-10, 10),
|
||||
'vx': random.uniform(-1.2, 1.2),
|
||||
'vy': random.uniform(-2.5, -1.0),
|
||||
'life': 1.0,
|
||||
'size': random.uniform(8, 14),
|
||||
})
|
||||
|
||||
def _update_particles(self):
|
||||
for p in self.particles:
|
||||
p['x'] += p['vx']
|
||||
p['y'] += p['vy']
|
||||
p['vy'] += 0.04
|
||||
p['life'] -= self.dt * 0.8
|
||||
self.particles = [p for p in self.particles if p['life'] > 0]
|
||||
|
||||
def _draw_particles(self):
|
||||
c = self.canvas
|
||||
for p in self.particles:
|
||||
s = p['size'] * max(0.2, p['life'])
|
||||
x, y = p['x'], p['y']
|
||||
c.create_text(x, y, text='♥', font=('Segoe UI Symbol', int(s)), fill=COLOR_ACCENT)
|
||||
|
||||
# ----- 说话气泡 -----
|
||||
def _draw_speech(self, oy):
|
||||
if not self.speech_text:
|
||||
return
|
||||
c = self.canvas
|
||||
text = self.speech_text
|
||||
font = ('微软雅黑', 12, 'bold')
|
||||
# 估算宽度
|
||||
w = max(70, len(text) * 14 + 26)
|
||||
h = 36
|
||||
x = CX
|
||||
y = 6 + oy
|
||||
# 气泡圆角矩形
|
||||
pad = 8
|
||||
c.create_rectangle(x - w / 2, y, x + w / 2, y + h, fill=COLOR_WHITE, outline=COLOR_ACCENT, width=2)
|
||||
# 尾巴
|
||||
c.create_polygon(x - 8, y + h - 1, x + 8, y + h - 1, x, y + h + 12,
|
||||
fill=COLOR_WHITE, outline=COLOR_ACCENT, width=2)
|
||||
# 遮掉尾巴上沿的边线
|
||||
c.create_line(x - 7, y + h, x + 7, y + h, fill=COLOR_WHITE, width=3)
|
||||
c.create_text(x, y + h / 2 + 1, text=text, fill=COLOR_ACCENT, font=font)
|
||||
|
||||
# ================= 工具 =================
|
||||
@staticmethod
|
||||
def _mix(c1, c2, t):
|
||||
"""简单颜色线性混合,t in [0,1]"""
|
||||
t = max(0.0, min(1.0, t))
|
||||
|
||||
def parse(h):
|
||||
h = h.lstrip('#')
|
||||
return int(h[0:2], 16), int(h[2:4], 16), int(h[4:6], 16)
|
||||
|
||||
r1, g1, b1 = parse(c1)
|
||||
r2, g2, b2 = parse(c2)
|
||||
r = int(r1 + (r2 - r1) * t)
|
||||
g = int(g1 + (g2 - g1) * t)
|
||||
b = int(b1 + (b2 - b1) * t)
|
||||
return f'#{r:02x}{g:02x}{b:02x}'
|
||||
|
||||
def _on_double_click_heart(self):
|
||||
"""双击时额外撒爱心(供扩展)"""
|
||||
self._spawn_hearts(8)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
DesktopPet()
|
||||
735
Live2DPet.py
Normal file
@@ -0,0 +1,735 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
2333娘 Live2D 桌宠
|
||||
基于 live2d-py (v2cpp) + PyQt5 的透明窗口 Live2D 桌面宠物。
|
||||
使用 2233live2d 模型(Cubism 2 格式:.moc / .mtn / model.json)。
|
||||
- 左键拖动移动窗口;松开(未拖动)= 触发点击动作
|
||||
- 右键:菜单(随机动作 / 随机表情 / 切换角色·服装 / 置顶 / 退出)
|
||||
- 鼠标移动:视线跟随
|
||||
- 滚轮:缩放
|
||||
- 自动眨眼、呼吸、空闲随机动作
|
||||
- 透明区域点击穿透(动态切换 Win32 WS_EX_TRANSPARENT + glReadPixels 检测像素 alpha)
|
||||
"""
|
||||
|
||||
import ctypes
|
||||
import os
|
||||
import random
|
||||
import sys
|
||||
import glob
|
||||
|
||||
import live2d.v2 as live2d
|
||||
from OpenGL import GL
|
||||
from PyQt5.QtCore import Qt, QTimer, QPoint
|
||||
from PyQt5.QtGui import QCursor, QImage, QSurfaceFormat
|
||||
from PyQt5.QtWidgets import (
|
||||
QApplication, QLabel, QMenu, QMessageBox, QOpenGLWidget, QVBoxLayout, QWidget,
|
||||
)
|
||||
|
||||
# ============== Monkey-patch: 预乘 alpha 纹理 + 修正 shader ==============
|
||||
# 匹配 HTML 版本的渲染方式:纹理上传时预乘 alpha,shader 不再做预乘
|
||||
# 修复 mipmap 边缘颜色渗透导致的边线问题
|
||||
from PIL import Image as _PILImage, ImageChops as _ImageChops
|
||||
from live2d.v2.platform_manager import PlatformManager as _PlatformManager
|
||||
from live2d.v2.core.graphics.draw_param_opengl import DrawParamOpenGL as _DrawParamOpenGL
|
||||
import OpenGL.GL as _gl
|
||||
|
||||
|
||||
def _PatchedLoadTexture(self, live2DModel, no, path):
|
||||
"""预乘 alpha 的纹理加载,匹配 WebGL 的 UNPACK_PREMULTIPLY_ALPHA_WEBGL"""
|
||||
image = _PILImage.open(path)
|
||||
if image.mode != 'RGBA':
|
||||
image = image.convert("RGBA")
|
||||
# 预乘 alpha:RGB = RGB * alpha / 255
|
||||
r, g, b, a = image.split()
|
||||
a_rgb = _PILImage.merge("RGB", (a, a, a))
|
||||
rgb = _PILImage.merge("RGB", (r, g, b))
|
||||
rgb_pm = _ImageChops.multiply(rgb, a_rgb)
|
||||
image = _PILImage.merge("RGBA", (*rgb_pm.split(), a))
|
||||
image_data = image.tobytes()
|
||||
width, height = image.size
|
||||
_gl.glEnable(_gl.GL_TEXTURE_2D)
|
||||
texture = _gl.glGenTextures(1)
|
||||
_gl.glBindTexture(_gl.GL_TEXTURE_2D, texture)
|
||||
_gl.glTexImage2D(
|
||||
_gl.GL_TEXTURE_2D, 0, _gl.GL_RGBA, width, height, 0, _gl.GL_RGBA, _gl.GL_UNSIGNED_BYTE, image_data
|
||||
)
|
||||
_gl.glTexParameteri(_gl.GL_TEXTURE_2D, _gl.GL_TEXTURE_MIN_FILTER, _gl.GL_LINEAR_MIPMAP_NEAREST)
|
||||
_gl.glTexParameteri(_gl.GL_TEXTURE_2D, _gl.GL_TEXTURE_MAG_FILTER, _gl.GL_LINEAR)
|
||||
_gl.glGenerateMipmap(_gl.GL_TEXTURE_2D)
|
||||
_gl.glBindTexture(_gl.GL_TEXTURE_2D, 0)
|
||||
live2DModel.setTexture(no, texture)
|
||||
|
||||
|
||||
_PlatformManager.loadTexture = _PatchedLoadTexture
|
||||
|
||||
# 修改 shader 去掉预乘行(因为纹理已预乘,避免双重预乘)
|
||||
_OriginalDrawParamInit = _DrawParamOpenGL.__init__
|
||||
|
||||
|
||||
def _PatchedDrawParamInit(self, version):
|
||||
_OriginalDrawParamInit(self, version)
|
||||
self.aM = self.aM.replace("smpColor.rgb = smpColor.rgb * smpColor.a;", "")
|
||||
self.aJ = self.aJ.replace("col_formask.rgb = col_formask.rgb * col_formask.a;", "")
|
||||
|
||||
|
||||
_DrawParamOpenGL.__init__ = _PatchedDrawParamInit
|
||||
# ============== Monkey-patch 结束 ==============
|
||||
|
||||
# ============== 路径与配置 ==============
|
||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
MODEL_DIR = os.path.join(SCRIPT_DIR, "model")
|
||||
|
||||
# 角色目录(22 / 33)
|
||||
CHARACTERS = ["22", "33"]
|
||||
|
||||
ALPHA_THRESHOLD = 10 # 像素 alpha < 此值视为透明(可穿透)
|
||||
|
||||
|
||||
def ScanModelFiles():
|
||||
"""扫描 model/ 下所有角色目录的 model.*.json,返回 {(角色, 服装名): 路径}"""
|
||||
result = {}
|
||||
for char in CHARACTERS:
|
||||
char_dir = os.path.join(MODEL_DIR, char)
|
||||
if not os.path.isdir(char_dir):
|
||||
continue
|
||||
for path in glob.glob(os.path.join(char_dir, "model.*.json")):
|
||||
fname = os.path.basename(path) # model.default.json
|
||||
costume = fname[len("model."):-len(".json")] # default
|
||||
result[(char, costume)] = path
|
||||
return result
|
||||
|
||||
|
||||
# 服装中文名映射(常见的几个)
|
||||
COSTUME_CN = {
|
||||
"default": "默认",
|
||||
"2016.xmas.1": "2016圣诞(1)",
|
||||
"2016.xmas.2": "2016圣诞(2)",
|
||||
"2017.cba-normal": "2017应援(普)",
|
||||
"2017.cba-super": "2017应援(超)",
|
||||
"2017.newyear": "2017新年",
|
||||
"2017.school": "2017校服",
|
||||
"2017.summer.normal.1": "2017夏装(普1)",
|
||||
"2017.summer.normal.2": "2017夏装(普2)",
|
||||
"2017.summer.super.1": "2017夏装(超1)",
|
||||
"2017.summer.super.2": "2017夏装(超2)",
|
||||
"2017.tomo-bukatsu.high": "2017社团(高)",
|
||||
"2017.tomo-bukatsu.low": "2017社团(低)",
|
||||
"2017.valley": "2017山谷",
|
||||
"2017.vdays": "2017情人节",
|
||||
"2018.bls-summer": "2018BLS夏",
|
||||
"2018.bls-winter": "2018BLS冬",
|
||||
"2018.lover": "2018恋人",
|
||||
"2018.spring": "2018春装",
|
||||
}
|
||||
|
||||
DEFAULT_KEY = ("22", "default")
|
||||
|
||||
WIN_W = 450
|
||||
WIN_H = 650
|
||||
DRAG_THRESHOLD = 5 # 像素,超过则判定为拖动
|
||||
DRAG_SCALE = 0.4 # 视线跟随缩放比例(0=不动, 1=全幅跟随),减小转头幅度
|
||||
|
||||
# 随机字幕(2333娘风格台词)
|
||||
SUBTITLES = [
|
||||
"2333~", "主人好呀!", "今天也元气满满呢!", "陪我玩一会儿嘛~",
|
||||
"嘻嘻嘻~", "想吃饭团了...", "主人在看什么呀?", "摸鱼中,请勿打扰~",
|
||||
"困了...Zzz", "今天直播看了吗?", "投币点赞收藏~", "主人最可爱了!",
|
||||
"哔哩哔哩干杯!", "悄悄摸一下~", "诶嘿嘿~", "要不要一起看番?",
|
||||
"我的发卡好看吗?", "尾巴给你摸一下~", "今天也要好好吃饭哦",
|
||||
]
|
||||
SUBTITLE_INTERVAL = (15000, 30000) # 字幕随机间隔(毫秒)
|
||||
SUBTITLE_DURATION = 6000 # 字幕显示时长(毫秒)
|
||||
|
||||
|
||||
class SubtitleBubble(QWidget):
|
||||
"""字幕气泡:独立透明窗口,显示在桌宠上方"""
|
||||
|
||||
BUBBLE_QSS = """
|
||||
QLabel {
|
||||
background: rgba(35, 35, 42, 220);
|
||||
color: #e8e8ec;
|
||||
padding: 10px 20px;
|
||||
border-radius: 14px;
|
||||
font-family: "Microsoft YaHei", "微软雅黑", sans-serif;
|
||||
font-size: 15px;
|
||||
}
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowFlags(
|
||||
Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool
|
||||
)
|
||||
self.setAttribute(Qt.WA_TranslucentBackground, True)
|
||||
self.setAttribute(Qt.WA_ShowWithoutActivating, True)
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.label = QLabel()
|
||||
self.label.setStyleSheet(self.BUBBLE_QSS)
|
||||
layout.addWidget(self.label)
|
||||
self.hide()
|
||||
self.hide_timer = QTimer(self)
|
||||
self.hide_timer.setSingleShot(True)
|
||||
self.hide_timer.timeout.connect(self.hide)
|
||||
|
||||
def show_text(self, text, pos):
|
||||
"""在指定位置显示字幕,一段时间后自动隐藏"""
|
||||
self.label.setText(text)
|
||||
self.label.adjustSize()
|
||||
self.adjustSize()
|
||||
self.move(pos)
|
||||
self.show()
|
||||
self.hide_timer.start(SUBTITLE_DURATION)
|
||||
|
||||
|
||||
class Live2DPet(QOpenGLWidget):
|
||||
"""Live2D 桌宠主窗口"""
|
||||
|
||||
def __init__(self, model_path: str):
|
||||
super().__init__()
|
||||
self.setWindowFlags(
|
||||
Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool
|
||||
)
|
||||
self.setAttribute(Qt.WA_TranslucentBackground, True)
|
||||
self.setAttribute(Qt.WA_AlwaysStackOnTop, True)
|
||||
self.setMouseTracking(True)
|
||||
self.resize(WIN_W, WIN_H)
|
||||
self.setWindowTitle("2333娘 Live2D 桌宠")
|
||||
|
||||
# 初始位置:屏幕右下角
|
||||
screen = QApplication.primaryScreen().geometry()
|
||||
self.move(screen.width() - WIN_W - 40, screen.height() - WIN_H - 90)
|
||||
|
||||
# 模型状态
|
||||
self.model_path = model_path
|
||||
self.model = None
|
||||
self.scale = 1.05
|
||||
self.offset_y = 0.1 # 模型竖直偏移
|
||||
self._model_cache = ScanModelFiles() # 缓存模型列表,避免每次右键扫描
|
||||
self._menu = None # 预创建菜单缓存,避免首次右键卡顿
|
||||
self._desktop_pet = None # 搞笑模式 DesktopPet 实例
|
||||
self._tk_timer = None # 驱动 tkinter 事件的定时器
|
||||
self._alpha_mask = None # 缓存窗口 alpha 通道,用于点击穿透判定
|
||||
self._alpha_frame = 0 # alpha mask 更新帧计数
|
||||
self._click_through_state = None # 缓存当前 WS_EX_TRANSPARENT 状态
|
||||
|
||||
# 拖动 / 点击判定
|
||||
self._drag_offset = None
|
||||
self._press_pos = None
|
||||
self._moved = False
|
||||
|
||||
# 渲染定时器(~60fps)+ 全局鼠标跟踪
|
||||
self.render_timer = QTimer(self)
|
||||
self.render_timer.timeout.connect(self._tick)
|
||||
self.render_timer.start(16)
|
||||
|
||||
# 空闲随机动作定时器
|
||||
self.idle_timer = QTimer(self)
|
||||
self.idle_timer.timeout.connect(self._idle_action)
|
||||
self._reset_idle_timer()
|
||||
|
||||
# 随机字幕气泡
|
||||
self.bubble = SubtitleBubble()
|
||||
self.subtitle_timer = QTimer(self)
|
||||
self.subtitle_timer.setSingleShot(True)
|
||||
self.subtitle_timer.timeout.connect(self._show_subtitle)
|
||||
self.subtitle_timer.start(random.randint(*SUBTITLE_INTERVAL))
|
||||
|
||||
# ============== 渲染 + 全局鼠标跟踪 + 点击穿透 ==============
|
||||
def _tick(self):
|
||||
"""每帧:全局鼠标位置跟踪视线 + alpha mask 更新 + 点击穿透检测 + 触发重绘"""
|
||||
global_pos = QCursor.pos()
|
||||
local = self.mapFromGlobal(global_pos)
|
||||
# 视线跟随(非拖动状态)
|
||||
if self.model and self._drag_offset is None:
|
||||
try:
|
||||
cx, cy = self.width() / 2, self.height() / 2
|
||||
dx = (local.x() - cx) * DRAG_SCALE + cx
|
||||
dy = (local.y() - cy) * DRAG_SCALE + cy
|
||||
self.model.Drag(dx, dy)
|
||||
except Exception:
|
||||
pass
|
||||
# 每 6 帧用 grabFramebuffer 更新一次 alpha mask(glReadPixels 在 v2 下失败)
|
||||
self._alpha_frame += 1
|
||||
if self._alpha_frame >= 6:
|
||||
self._alpha_frame = 0
|
||||
try:
|
||||
img = self.grabFramebuffer()
|
||||
if img is not None and not img.isNull():
|
||||
img = img.convertToFormat(QImage.Format_RGBA8888)
|
||||
ptr = img.constBits()
|
||||
ptr.setsize(img.byteCount())
|
||||
raw = bytes(ptr)
|
||||
self._alpha_mask = bytes(raw[i] for i in range(3, len(raw), 4))
|
||||
except Exception:
|
||||
self._alpha_mask = None
|
||||
# 点击穿透检测:透明像素 → 穿透;不透明像素 / 拖动中 / 窗口外 → 不穿透
|
||||
if self._drag_offset is not None:
|
||||
self._set_click_through(False)
|
||||
elif 0 <= local.x() < self.width() and 0 <= local.y() < self.height():
|
||||
self._set_click_through(self._is_pixel_transparent(local.x(), local.y()))
|
||||
else:
|
||||
self._set_click_through(False)
|
||||
self.update()
|
||||
|
||||
# ============== OpenGL 生命周期 ==============
|
||||
def initializeGL(self):
|
||||
live2d.glInit()
|
||||
self._load_model(self.model_path)
|
||||
|
||||
def resizeGL(self, w, h):
|
||||
if self.model:
|
||||
self.model.Resize(w, h)
|
||||
self._apply_transform()
|
||||
|
||||
def paintGL(self):
|
||||
live2d.clearBuffer()
|
||||
if self.model:
|
||||
self.model.Update()
|
||||
self.model.Draw()
|
||||
|
||||
def _load_model(self, path: str):
|
||||
self.makeCurrent()
|
||||
try:
|
||||
self.model = live2d.LAppModel()
|
||||
self.model.LoadModelJson(path)
|
||||
self.model.SetAutoBlinkEnable(True)
|
||||
self.model.SetAutoBreathEnable(True)
|
||||
self.model.Resize(self.width(), self.height())
|
||||
self._apply_transform()
|
||||
# 进场 idle
|
||||
try:
|
||||
self.model.StartRandomMotion("idle", live2d.MotionPriority.IDLE)
|
||||
except Exception:
|
||||
pass
|
||||
finally:
|
||||
self.doneCurrent()
|
||||
|
||||
def _apply_transform(self):
|
||||
if not self.model:
|
||||
return
|
||||
try:
|
||||
self.model.SetScale(self.scale)
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
self.model.SetOffset(0, self.offset_y)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# ============== 透明区域点击穿透 ==============
|
||||
# Win32 常量
|
||||
GWL_EXSTYLE = -20
|
||||
WS_EX_TRANSPARENT = 0x00000020
|
||||
|
||||
def _set_click_through(self, through: bool):
|
||||
"""动态设置 WS_EX_TRANSPARENT,让透明区域点击穿透到桌面。
|
||||
带状态缓存,仅在状态变化时调用 Win32 API,避免每帧开销。"""
|
||||
if self._click_through_state == through:
|
||||
return
|
||||
try:
|
||||
hwnd = int(self.winId())
|
||||
ex = ctypes.windll.user32.GetWindowLongW(hwnd, self.GWL_EXSTYLE)
|
||||
if through:
|
||||
ex |= self.WS_EX_TRANSPARENT
|
||||
else:
|
||||
ex &= ~self.WS_EX_TRANSPARENT
|
||||
ctypes.windll.user32.SetWindowLongW(hwnd, self.GWL_EXSTYLE, ex)
|
||||
self._click_through_state = through
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _is_pixel_transparent(self, x: int, y: int) -> bool:
|
||||
"""从缓存的 alpha mask 中查询 (x, y) 是否透明"""
|
||||
if not self.model:
|
||||
return True
|
||||
if self._alpha_mask is None:
|
||||
return False # 无缓存时不穿透(避免误穿透导致无法交互)
|
||||
w, h = self.width(), self.height()
|
||||
if x < 0 or x >= w or y < 0 or y >= h:
|
||||
return True
|
||||
# OpenGL y 轴向上,窗口 y 轴向下,需翻转
|
||||
gl_y = h - 1 - y
|
||||
idx = gl_y * w + x
|
||||
if idx < len(self._alpha_mask):
|
||||
return self._alpha_mask[idx] < ALPHA_THRESHOLD
|
||||
return False
|
||||
|
||||
# ============== 交互 ==============
|
||||
def mousePressEvent(self, e):
|
||||
if e.button() == Qt.LeftButton:
|
||||
self._press_pos = e.globalPos()
|
||||
self._drag_offset = e.globalPos() - self.frameGeometry().topLeft()
|
||||
self._moved = False
|
||||
elif e.button() == Qt.RightButton:
|
||||
self._show_menu(e.globalPos())
|
||||
|
||||
def mouseMoveEvent(self, e):
|
||||
# 拖动窗口(视线跟随由 _tick 全局处理)
|
||||
if self._drag_offset is not None and self._press_pos is not None:
|
||||
if (e.globalPos() - self._press_pos).manhattanLength() > DRAG_THRESHOLD:
|
||||
self._moved = True
|
||||
self.move(e.globalPos() - self._drag_offset)
|
||||
|
||||
def mouseReleaseEvent(self, e):
|
||||
if e.button() == Qt.LeftButton:
|
||||
if not self._moved and self.model:
|
||||
# 视为点击模型 → 触发动作
|
||||
try:
|
||||
self.model.StartRandomMotion("tap_body", live2d.MotionPriority.NORMAL)
|
||||
except Exception:
|
||||
try:
|
||||
self.model.StartRandomMotion("idle", live2d.MotionPriority.IDLE)
|
||||
except Exception:
|
||||
pass
|
||||
self._drag_offset = None
|
||||
self._press_pos = None
|
||||
self._moved = False
|
||||
|
||||
def wheelEvent(self, e):
|
||||
delta = e.angleDelta().y()
|
||||
if delta > 0:
|
||||
self.scale = min(self.scale * 1.08, 3.0)
|
||||
else:
|
||||
self.scale = max(self.scale / 1.08, 0.3)
|
||||
self._apply_transform()
|
||||
self.update()
|
||||
|
||||
def leaveEvent(self, e):
|
||||
# 鼠标离开窗口时无需处理(_tick 全局跟踪会继续跟随)
|
||||
pass
|
||||
|
||||
def keyPressEvent(self, e):
|
||||
if e.key() == Qt.Key_Escape:
|
||||
QApplication.quit()
|
||||
|
||||
def showEvent(self, e):
|
||||
super().showEvent(e)
|
||||
# 窗口显示后预创建菜单,触发字体/QSS 首次加载,避免首次右键卡顿
|
||||
if self._menu is None:
|
||||
self._build_menu()
|
||||
|
||||
# ============== 菜单 ==============
|
||||
MENU_QSS = """
|
||||
QMenu {
|
||||
background: rgba(35, 35, 42, 245);
|
||||
border: 1px solid rgba(120, 120, 140, 60);
|
||||
border-radius: 10px;
|
||||
padding: 6px;
|
||||
color: #e8e8ec;
|
||||
font-family: "Microsoft YaHei", "微软雅黑", sans-serif;
|
||||
font-size: 15px;
|
||||
}
|
||||
QMenu::item {
|
||||
padding: 7px 28px 7px 22px;
|
||||
border-radius: 6px;
|
||||
margin: 1px 4px;
|
||||
}
|
||||
QMenu::item:selected {
|
||||
background: rgba(86, 122, 232, 200);
|
||||
color: #ffffff;
|
||||
}
|
||||
QMenu::item:checked {
|
||||
background: rgba(86, 232, 144, 80);
|
||||
color: #ffffff;
|
||||
}
|
||||
QMenu::item:checked:selected {
|
||||
background: rgba(86, 232, 144, 160);
|
||||
}
|
||||
QMenu::separator {
|
||||
height: 1px;
|
||||
background: rgba(255, 255, 255, 35);
|
||||
margin: 5px 10px;
|
||||
}
|
||||
QMessageBox {
|
||||
background: rgba(35, 35, 42, 245);
|
||||
border: 1px solid rgba(120, 120, 140, 60);
|
||||
border-radius: 10px;
|
||||
font-family: "Microsoft YaHei", "微软雅黑", sans-serif;
|
||||
}
|
||||
QMessageBox QLabel {
|
||||
color: #e8e8ec;
|
||||
font-family: "Microsoft YaHei", "微软雅黑", sans-serif;
|
||||
font-size: 15px;
|
||||
}
|
||||
QPushButton {
|
||||
background: rgba(86, 122, 232, 200);
|
||||
color: #ffffff;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
padding: 6px 18px;
|
||||
font-family: "Microsoft YaHei", "微软雅黑", sans-serif;
|
||||
}
|
||||
QPushButton:hover {
|
||||
background: rgba(106, 142, 252, 230);
|
||||
}
|
||||
"""
|
||||
|
||||
def _build_menu(self):
|
||||
"""预创建并缓存菜单,避免每次右键重建导致卡顿"""
|
||||
menu = QMenu(self)
|
||||
menu.setStyleSheet(self.MENU_QSS)
|
||||
|
||||
self._act_motion = menu.addAction("随机动作 ♪")
|
||||
self._act_expr = menu.addAction("随机表情 ☆")
|
||||
self._act_thank = menu.addAction("感谢动作 ♥")
|
||||
self._act_say = menu.addAction("说句话 ✦")
|
||||
menu.addSeparator()
|
||||
|
||||
# 切换角色·服装(两级子菜单:22 / 33 → 服装列表)
|
||||
self._switch_menu = menu.addMenu("切换角色·服装")
|
||||
models = self._model_cache
|
||||
self._costume_actions = {}
|
||||
for char in CHARACTERS:
|
||||
char_menu = self._switch_menu.addMenu(f"{char}娘")
|
||||
char_menu.setStyleSheet(self.MENU_QSS)
|
||||
for (c, costume), path in sorted(models.items()):
|
||||
if c != char:
|
||||
continue
|
||||
label = COSTUME_CN.get(costume, costume)
|
||||
act = char_menu.addAction(label)
|
||||
act.setData(path)
|
||||
act.setCheckable(True)
|
||||
self._costume_actions[path] = act
|
||||
|
||||
menu.addSeparator()
|
||||
self._act_top = menu.addAction("置顶 / 取消置顶")
|
||||
self._act_fun = menu.addAction("搞笑模式 🤪")
|
||||
self._act_about = menu.addAction("开发者名单 ℹ")
|
||||
self._act_quit = menu.addAction("退出 (。•́︿•̀。)")
|
||||
self._menu = menu
|
||||
|
||||
def _show_menu(self, global_pos):
|
||||
if self._menu is None:
|
||||
self._build_menu()
|
||||
# 更新服装选中状态
|
||||
for path, act in self._costume_actions.items():
|
||||
act.setChecked(path == self.model_path)
|
||||
|
||||
action = self._menu.exec_(global_pos)
|
||||
if action is None:
|
||||
return
|
||||
if action == self._act_motion:
|
||||
self._random_motion()
|
||||
elif action == self._act_expr:
|
||||
self._random_expression()
|
||||
elif action == self._act_thank:
|
||||
self._thank_motion()
|
||||
elif action == self._act_say:
|
||||
self._show_subtitle()
|
||||
self.subtitle_timer.stop()
|
||||
self.subtitle_timer.start(random.randint(*SUBTITLE_INTERVAL))
|
||||
elif action == self._act_top:
|
||||
flags = self.windowFlags()
|
||||
self.setWindowFlags(flags ^ Qt.WindowStaysOnTopHint)
|
||||
self.show()
|
||||
elif action == self._act_fun:
|
||||
self._switch_to_desktop_pet()
|
||||
elif action == self._act_about:
|
||||
self._show_about()
|
||||
elif action == self._act_quit:
|
||||
QApplication.quit()
|
||||
elif action in self._costume_actions.values():
|
||||
path = action.data()
|
||||
if path and os.path.isfile(path):
|
||||
self.model_path = path
|
||||
self._load_model(path)
|
||||
|
||||
def _switch_to_desktop_pet(self):
|
||||
"""切换到 tkinter 版搞笑模式:隐藏 Live2D 窗口,内嵌运行 DesktopPet"""
|
||||
from DesktopPet import DesktopPet
|
||||
self.hide()
|
||||
self.render_timer.stop()
|
||||
self.bubble.hide()
|
||||
# 非阻塞运行 DesktopPet,退出时回调恢复 Live2D
|
||||
self._desktop_pet = DesktopPet(
|
||||
blocking=False,
|
||||
on_exit=self._restore_from_desktop_pet,
|
||||
)
|
||||
# 用 QTimer 驱动 tkinter 事件循环
|
||||
self._tk_timer = QTimer(self)
|
||||
self._tk_timer.timeout.connect(self._pump_tk)
|
||||
self._tk_timer.start(16)
|
||||
|
||||
def _pump_tk(self):
|
||||
"""驱动 tkinter 事件处理"""
|
||||
try:
|
||||
if self._desktop_pet and not self._desktop_pet._exited:
|
||||
self._desktop_pet.root.update()
|
||||
else:
|
||||
self._tk_timer.stop()
|
||||
except Exception:
|
||||
# root 已销毁
|
||||
self._tk_timer.stop()
|
||||
|
||||
def _restore_from_desktop_pet(self):
|
||||
"""DesktopPet 退出后恢复 Live2D"""
|
||||
self._tk_timer.stop()
|
||||
self._desktop_pet = None
|
||||
self.render_timer.start(16)
|
||||
self.show()
|
||||
|
||||
def _show_about(self):
|
||||
"""显示开发者名单"""
|
||||
msg = QMessageBox(self)
|
||||
msg.setWindowTitle("开发者名单")
|
||||
msg.setText(
|
||||
"<div style='line-height:1.6'>"
|
||||
"<h3 style='margin:0 0 8px'>2333娘 Live2D 桌宠</h3>"
|
||||
"<table style='white-space:pre'>"
|
||||
"<tr><td style='color:#888'>Mincrohard_1724</td></tr>"
|
||||
"<tr><td style='color:#888'>Dinganzhi</td></tr>"
|
||||
"<tr><td style='color:#888'>MicGan(Chindows)</td></tr>"
|
||||
"<tr><td style='color:#888'>TermiNexus</td></tr>"
|
||||
"<tr><td style='color:#888'>悠然自得</td></tr>"
|
||||
"</table>"
|
||||
"<p style='color:#aaa;margin-top:10px'>谨献给每一个需要陪伴的人 ♡</p>"
|
||||
"</div>"
|
||||
)
|
||||
msg.setStyleSheet(self.MENU_QSS)
|
||||
msg.exec_()
|
||||
|
||||
# ============== 行为 ==============
|
||||
def _random_motion(self):
|
||||
if not self.model:
|
||||
return
|
||||
# 2233 模型的动作组:idle / tap_body / thanking
|
||||
group = random.choice(["idle", "tap_body", "thanking"])
|
||||
try:
|
||||
self.model.StartRandomMotion(group, live2d.MotionPriority.NORMAL)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _random_expression(self):
|
||||
if not self.model:
|
||||
return
|
||||
try:
|
||||
self.model.SetRandomExpression()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _thank_motion(self):
|
||||
if not self.model:
|
||||
return
|
||||
try:
|
||||
self.model.StartRandomMotion("thanking", live2d.MotionPriority.FORCE)
|
||||
except Exception:
|
||||
try:
|
||||
self.model.StartRandomMotion("idle", live2d.MotionPriority.NORMAL)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _idle_action(self):
|
||||
if not self.model:
|
||||
return
|
||||
# 随机:动作 或 表情
|
||||
if random.random() < 0.6:
|
||||
self._random_motion()
|
||||
else:
|
||||
self._random_expression()
|
||||
self._reset_idle_timer()
|
||||
|
||||
def _model_top_y(self):
|
||||
"""从 alpha mask 找到模型最上方的非透明像素(窗口坐标 y),None 表示无数据"""
|
||||
if not self._alpha_mask:
|
||||
return None
|
||||
w, h = self.width(), self.height()
|
||||
for y in range(h):
|
||||
gl_y = h - 1 - y
|
||||
row_start = gl_y * w
|
||||
if max(self._alpha_mask[row_start:row_start + w]) >= ALPHA_THRESHOLD:
|
||||
return y
|
||||
return None
|
||||
|
||||
def _show_subtitle(self):
|
||||
"""随机显示一条字幕气泡,紧贴模型头部上方"""
|
||||
text = random.choice(SUBTITLES)
|
||||
self.bubble.show_text(text, QPoint(0, 0)) # 先 show 再算尺寸
|
||||
fg = self.frameGeometry()
|
||||
bx = fg.center().x() - self.bubble.width() // 2
|
||||
# 用模型实际顶部定位,回退到窗口顶部
|
||||
top_y = self._model_top_y()
|
||||
anchor_y = top_y if top_y is not None else 0
|
||||
by = fg.top() + anchor_y - self.bubble.height() - 12
|
||||
# 屏幕上方不够时放到模型下方
|
||||
screen_top = QApplication.primaryScreen().availableGeometry().top()
|
||||
if by < screen_top:
|
||||
bottom_y = self.height()
|
||||
by = fg.top() + bottom_y + 12
|
||||
self.bubble.move(bx, by)
|
||||
self.subtitle_timer.start(random.randint(*SUBTITLE_INTERVAL))
|
||||
|
||||
def _reset_idle_timer(self):
|
||||
self.idle_timer.start(random.randint(7000, 15000))
|
||||
|
||||
# ============== 退出清理 ==============
|
||||
def closeEvent(self, e):
|
||||
try:
|
||||
self.render_timer.stop()
|
||||
self.idle_timer.stop()
|
||||
self.subtitle_timer.stop()
|
||||
self.bubble.close()
|
||||
except Exception:
|
||||
pass
|
||||
# 清理搞笑模式
|
||||
try:
|
||||
if self._tk_timer:
|
||||
self._tk_timer.stop()
|
||||
if self._desktop_pet and not self._desktop_pet._exited:
|
||||
self._desktop_pet._do_exit()
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
self.makeCurrent()
|
||||
self.model = None
|
||||
self.doneCurrent()
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
live2d.dispose()
|
||||
except Exception:
|
||||
pass
|
||||
e.accept()
|
||||
# Qt.Tool 窗口关闭不会自动退出事件循环,需显式 quit
|
||||
QApplication.quit()
|
||||
|
||||
|
||||
def main():
|
||||
# 确保 OpenGL 上下文带 alpha 通道(透明窗口必需)+ MSAA 抗锯齿
|
||||
fmt = QSurfaceFormat()
|
||||
fmt.setAlphaBufferSize(8)
|
||||
fmt.setDepthBufferSize(24)
|
||||
fmt.setSamples(4) # MSAA 4x 抗锯齿,减少模型边缘锯齿
|
||||
fmt.setSwapBehavior(QSurfaceFormat.DoubleBuffer)
|
||||
QSurfaceFormat.setDefaultFormat(fmt)
|
||||
|
||||
# 关闭 live2d-py 日志刷屏
|
||||
try:
|
||||
live2d.setLogLevel(live2d.Live2DLogLevels.Off)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
live2d.init()
|
||||
|
||||
app = QApplication(sys.argv)
|
||||
app.setApplicationName("2333娘 Live2D 桌宠")
|
||||
|
||||
models = ScanModelFiles()
|
||||
model_path = models.get(DEFAULT_KEY)
|
||||
if not model_path or not os.path.isfile(model_path):
|
||||
# 回退:取第一个可用的
|
||||
if models:
|
||||
model_path = list(models.values())[0]
|
||||
else:
|
||||
print(f"[错误] 在 {MODEL_DIR} 下找不到任何模型文件")
|
||||
print("请确认 model/22 或 model/33 目录存在且包含 model.*.json")
|
||||
sys.exit(1)
|
||||
|
||||
pet = Live2DPet(model_path)
|
||||
pet.show()
|
||||
|
||||
sys.exit(app.exec_())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
44
Live2DPet.spec
Normal file
@@ -0,0 +1,44 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['Live2DPet.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[],
|
||||
hiddenimports=[],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
[],
|
||||
exclude_binaries=True,
|
||||
name='Live2DPet',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
console=False,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
)
|
||||
coll = COLLECT(
|
||||
exe,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
name='Live2DPet',
|
||||
)
|
||||
10
README.md
Normal file
@@ -0,0 +1,10 @@
|
||||
```bash
|
||||
pip install live2d pyqt5
|
||||
```
|
||||
主入口在 Live2DPet.py
|
||||
用 pyinstaller 打包其即可
|
||||
```bash
|
||||
pyinstaller -w Live2DPet.py --onefile
|
||||
```
|
||||
|
||||
需要让程序工作目录下有“model”文件夹
|
||||
29
_2233live2d-main/README.md
Normal file
@@ -0,0 +1,29 @@
|
||||
## 2233live2d
|
||||
|
||||
从 [哔哩哔哩 Windows 客户端](https://app.bilibili.com/) 解包得到的 2233 娘 live2D 模型
|
||||
|
||||
---
|
||||
|
||||
食用方式:
|
||||
|
||||
使用非常简单,只需要如下三步:
|
||||
|
||||
1. 引入`live2d.js`
|
||||
|
||||
```html
|
||||
<script type="text/javascript" src="res/js/live2d.js"></script>
|
||||
```
|
||||
|
||||
2. 放置 canvas
|
||||
|
||||
```html
|
||||
<canvas id="live2d" width="512" height="512"></canvas>
|
||||
```
|
||||
|
||||
3. 绑定模型
|
||||
|
||||
```js
|
||||
loadlive2d("live2d", "res/model/22/model.default.json");
|
||||
```
|
||||
|
||||
\* 示例 html 可见`demo.html`
|
||||
15
_2233live2d-main/demo.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>live2d测试</title>
|
||||
<script type="text/javascript" src="res/js/live2d.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<canvas id="live2d" width="512" height="512"></canvas>
|
||||
<script>loadlive2d("live2d", "res/model/22/model.default.json");</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
BIN
_2233live2d-main/favicon.ico
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
322
_2233live2d-main/index.html
Normal file
@@ -0,0 +1,322 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
|
||||
<link rel="shortcut icon" href="favicon.ico">
|
||||
<title>哔哩哔哩2233娘 Live2D 预览</title>
|
||||
<meta name="description" content="哔哩哔哩客户端中的所有2233官方liv2d模型" />
|
||||
<meta name="keywords" content="哔哩哔哩,bilibili,2233,live2d" />
|
||||
<style>
|
||||
/* ── CSS 变量 ── */
|
||||
:root,
|
||||
[data-theme="dark"] {
|
||||
--bg-body: #18191c;
|
||||
--bg-panel: #1a1d22;
|
||||
--bg-btn: #23262d;
|
||||
--border-main: #2a2d33;
|
||||
--border-btn: #3a3d44;
|
||||
--color-label: #888;
|
||||
--color-btn: #ccc;
|
||||
--color-title: #e0e0e0;
|
||||
--color-sub: #666;
|
||||
--bg-canvas: #0d0d0d;
|
||||
}
|
||||
|
||||
[data-theme="light"] {
|
||||
--bg-body: #f4f5f7;
|
||||
--bg-panel: #ffffff;
|
||||
--bg-btn: #f0f1f3;
|
||||
--border-main: #dde0e6;
|
||||
--border-btn: #c8ccd4;
|
||||
--color-label: #999;
|
||||
--color-btn: #444;
|
||||
--color-title: #222;
|
||||
--color-sub: #aaa;
|
||||
--bg-canvas: #e8e8ec;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--bg-body);
|
||||
font-family: "Microsoft YaHei", sans-serif;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
h1 {
|
||||
padding: 18px 24px 14px;
|
||||
font-size: 18px;
|
||||
color: var(--color-title);
|
||||
background: var(--bg-panel);
|
||||
border-bottom: 1px solid var(--border-main);
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
h1 span {
|
||||
font-size: 12px;
|
||||
color: var(--color-sub);
|
||||
margin-left: 10px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
/* ── 主布局 ── */
|
||||
.main {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ── 左侧:预览区 ── */
|
||||
.preview {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: var(--bg-canvas);
|
||||
border-right: 1px solid var(--border-main);
|
||||
position: relative;
|
||||
min-height: 480px;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.preview-label {
|
||||
position: absolute;
|
||||
top: 14px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
font-size: 13px;
|
||||
color: var(--color-sub);
|
||||
white-space: nowrap;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
canvas#live2d {
|
||||
display: block;
|
||||
/* 实际尺寸由 JS 控制,这里只做视觉居中 */
|
||||
}
|
||||
|
||||
/* ── 右侧:控制区 ── */
|
||||
.controls {
|
||||
width: 400px;
|
||||
flex-shrink: 0;
|
||||
background: var(--bg-panel);
|
||||
overflow-y: auto;
|
||||
padding: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.controls .label {
|
||||
font-size: 11px;
|
||||
color: var(--color-label);
|
||||
margin-top: 8px;
|
||||
margin-bottom: 2px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.controls .label:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* 角色切换 */
|
||||
.char-row {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.char-btn {
|
||||
flex: 1;
|
||||
padding: 8px 0;
|
||||
border: 1px solid var(--border-btn);
|
||||
border-radius: 4px;
|
||||
background: var(--bg-btn);
|
||||
color: var(--color-btn);
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.char-btn:hover {
|
||||
border-color: #00a1d6;
|
||||
color: #00a1d6;
|
||||
}
|
||||
|
||||
.char-btn.active {
|
||||
background: #00a1d6;
|
||||
border-color: #00a1d6;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn {
|
||||
width: 100%;
|
||||
padding: 7px 14px;
|
||||
border: 1px solid var(--border-btn);
|
||||
border-radius: 4px;
|
||||
background: var(--bg-btn);
|
||||
color: var(--color-btn);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s;
|
||||
outline: none;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
border-color: #00a1d6;
|
||||
color: #00a1d6;
|
||||
}
|
||||
|
||||
.btn.active {
|
||||
background: #00a1d6;
|
||||
border-color: #00a1d6;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* ── 右下角主题切换 ── */
|
||||
.theme-toggle {
|
||||
position: fixed;
|
||||
right: 20px;
|
||||
top: 10px;
|
||||
padding: 7px 14px;
|
||||
border: 1px solid var(--border-btn);
|
||||
border-radius: 20px;
|
||||
background: var(--bg-btn);
|
||||
color: var(--color-btn);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
|
||||
transition: all 0.15s;
|
||||
z-index: 9999;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.theme-toggle:hover {
|
||||
border-color: #00a1d6;
|
||||
color: #00a1d6;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>2233娘 Live2D 预览</h1>
|
||||
<div class="main">
|
||||
<!-- 左:canvas -->
|
||||
<div class="preview">
|
||||
<div class="preview-label" id="previewLabel">加载中...</div>
|
||||
<canvas id="live2d" width="512" height="512"></canvas>
|
||||
</div>
|
||||
<!-- 右:控制 -->
|
||||
<div class="controls" id="controls">
|
||||
<span class="label">角色</span>
|
||||
<div class="char-row">
|
||||
<button class="char-btn active" data-char="22">22娘</button>
|
||||
<button class="char-btn" data-char="33">33娘</button>
|
||||
</div>
|
||||
<span class="label">服装</span>
|
||||
<!-- 模型按钮由 JS 渲染 -->
|
||||
</div>
|
||||
</div>
|
||||
<button class="theme-toggle" id="themeToggle"></button>
|
||||
<!-- 引入Live2D_JS -->
|
||||
<script type="text/javascript" src="res/js/live2d.js"></script>
|
||||
<script>
|
||||
// ── 模型列表 ──────────────────────────────────────────────────────────────
|
||||
const MODELS = [
|
||||
{ key: 'default', label: '默认模型' },
|
||||
{ key: '2016.xmas.1', label: '2016圣诞节 Ver.1' },
|
||||
{ key: '2016.xmas.2', label: '2016圣诞节 Ver.2' },
|
||||
{ key: '2017.newyear', label: '2017新年' },
|
||||
{ key: '2017.school', label: '2017校园' },
|
||||
{ key: '2017.vdays', label: '2017情人节' },
|
||||
{ key: '2017.summer.normal.1', label: '2017夏季(普通版)Ver.1' },
|
||||
{ key: '2017.summer.super.1', label: '2017夏季(高级版)Ver.1' },
|
||||
{ key: '2017.summer.normal.2', label: '2017夏季(普通版)Ver.2' },
|
||||
{ key: '2017.summer.super.2', label: '2017夏季(高级版)Ver.2' },
|
||||
{ key: '2017.cba-normal', label: '2017CBA(普通版)' },
|
||||
{ key: '2017.cba-super', label: '2017CBA(高级版)' },
|
||||
{ key: '2017.tomo-bukatsu.low', label: '2017朋友社团活动(普通版)' },
|
||||
{ key: '2017.tomo-bukatsu.high', label: '2017朋友社团活动(高级版)' },
|
||||
{ key: '2017.valley', label: '2017山谷?' },
|
||||
{ key: '2018.spring', label: '2018春季' },
|
||||
{ key: '2018.lover', label: '2018情人节' },
|
||||
{ key: '2018.bls-summer', label: '2018夏季 BLS' },
|
||||
{ key: '2018.bls-winter', label: '2018冬季 BLS' },
|
||||
]
|
||||
let currentChar = '22'
|
||||
let currentModel = 'default'
|
||||
// ── 渲染模型按钮 ──────────────────────────────────────────────────────────
|
||||
const controls = document.getElementById('controls')
|
||||
function renderModelBtns() {
|
||||
// 移除旧的模型按钮(保留角色行和 label)
|
||||
controls.querySelectorAll('.btn').forEach(el => el.remove())
|
||||
MODELS.forEach(m => {
|
||||
const btn = document.createElement('button')
|
||||
btn.className = 'btn' + (m.key === currentModel ? ' active' : '')
|
||||
btn.textContent = m.label
|
||||
btn.addEventListener('click', () => loadModel(currentChar, m.key))
|
||||
controls.appendChild(btn)
|
||||
})
|
||||
}
|
||||
// ── 加载模型 ──────────────────────────────────────────────────────────────
|
||||
function loadModel(char, modelKey) {
|
||||
currentChar = char
|
||||
currentModel = modelKey
|
||||
const path = `res/model/${char}/model.${modelKey}.json`
|
||||
document.getElementById('previewLabel').textContent =
|
||||
`${char}娘 · ${MODELS.find(m => m.key === modelKey)?.label ?? modelKey}`
|
||||
// 更新按钮状态
|
||||
controls.querySelectorAll('.btn').forEach((btn, i) => {
|
||||
btn.classList.toggle('active', MODELS[i].key === modelKey)
|
||||
})
|
||||
controls.querySelectorAll('.char-btn').forEach(btn => {
|
||||
btn.classList.toggle('active', btn.dataset.char === char)
|
||||
})
|
||||
loadlive2d('live2d', path)
|
||||
}
|
||||
// ── 角色切换 ──────────────────────────────────────────────────────────────
|
||||
controls.querySelectorAll('.char-btn').forEach(btn => {
|
||||
btn.addEventListener('click', () => loadModel(btn.dataset.char, currentModel))
|
||||
})
|
||||
// ── 主题切换 ──────────────────────────────────────────────────────────────
|
||||
const STORAGE_KEY = 'live2d_theme'
|
||||
const themeBtn = document.getElementById('themeToggle')
|
||||
function applyTheme(theme) {
|
||||
document.documentElement.setAttribute('data-theme', theme)
|
||||
themeBtn.textContent = theme === 'dark' ? '☀️ 浅色' : '🌙 深色'
|
||||
}
|
||||
function getInitialTheme() {
|
||||
const saved = localStorage.getItem(STORAGE_KEY)
|
||||
if (saved) return saved
|
||||
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
|
||||
}
|
||||
applyTheme(getInitialTheme())
|
||||
themeBtn.addEventListener('click', () => {
|
||||
const next = document.documentElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark'
|
||||
applyTheme(next)
|
||||
localStorage.setItem(STORAGE_KEY, next)
|
||||
})
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
|
||||
if (!localStorage.getItem(STORAGE_KEY)) applyTheme(e.matches ? 'dark' : 'light')
|
||||
})
|
||||
// ── 初始化 ────────────────────────────────────────────────────────────────
|
||||
renderModelBtns()
|
||||
loadModel('22', 'default')
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
5
_2233live2d-main/res/js/live2d.js
Normal file
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 309 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 280 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 109 KiB |
|
After Width: | Height: | Size: 242 KiB |
|
After Width: | Height: | Size: 138 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 283 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 55 KiB |
BIN
_2233live2d-main/res/model/22/22.v2.moc
Normal file
46
_2233live2d-main/res/model/22/model.2016.xmas.1.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2016-xmas",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2016.xmas/texture_01.png",
|
||||
"22.1024/closet.2016.xmas/texture_02.png",
|
||||
"22.1024/closet.2016.xmas/texture_03_1.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2016.xmas.2.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2016-xmas",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2016.xmas/texture_01.png",
|
||||
"22.1024/closet.2016.xmas/texture_02.png",
|
||||
"22.1024/closet.2016.xmas/texture_03_2.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2017.cba-normal.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-cba-normal",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.cba-normal/texture_01.png",
|
||||
"22.1024/closet.2017.cba-normal/texture_02.png",
|
||||
"22.1024/closet.2017.cba-normal/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2017.cba-super.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-cba-super",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.cba-super/texture_01.png",
|
||||
"22.1024/closet.2017.cba-super/texture_02.png",
|
||||
"22.1024/closet.2017.cba-super/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2017.newyear.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-newyear",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.newyear/texture_01.png",
|
||||
"22.1024/closet.2017.newyear/texture_02.png",
|
||||
"22.1024/closet.2017.newyear/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2017.school.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-school",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.school/texture_01.png",
|
||||
"22.1024/closet.2017.school/texture_02.png",
|
||||
"22.1024/closet.2017.school/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-summer-normal",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.summer.normal/texture_01.png",
|
||||
"22.1024/closet.2017.summer.normal/texture_02.png",
|
||||
"22.1024/closet.2017.summer.normal/texture_03_1.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-summer-normal",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.summer.normal/texture_01.png",
|
||||
"22.1024/closet.2017.summer.normal/texture_02.png",
|
||||
"22.1024/closet.2017.summer.normal/texture_03_2.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2017.summer.super.1.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-summer-super",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.summer.super/texture_01.png",
|
||||
"22.1024/closet.2017.summer.super/texture_02.png",
|
||||
"22.1024/closet.2017.summer.super/texture_03_1.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2017.summer.super.2.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-summer-super",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.summer.super/texture_01.png",
|
||||
"22.1024/closet.2017.summer.super/texture_02.png",
|
||||
"22.1024/closet.2017.summer.super/texture_03_2.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-tomo-bukatsu-high",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.tomo-bukatsu.high/texture_01.png",
|
||||
"22.1024/closet.2017.tomo-bukatsu.high/texture_02.png",
|
||||
"22.1024/closet.2017.tomo-bukatsu.high/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-tomo-bukatsu-low",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.tomo-bukatsu.low/texture_01.png",
|
||||
"22.1024/closet.2017.tomo-bukatsu.low/texture_02.png",
|
||||
"22.1024/closet.2017.tomo-bukatsu.low/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2017.valley.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-valley",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.valley/texture_01.png",
|
||||
"22.1024/closet.2017.valley/texture_02.png",
|
||||
"22.1024/closet.2017.valley/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2017.vdays.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2017-vdays",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2017.vdays/texture_01.png",
|
||||
"22.1024/closet.2017.vdays/texture_02.png",
|
||||
"22.1024/closet.2017.vdays/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2018.bls-summer.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2018-bls-summer",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2018.bls-summer/texture_01.png",
|
||||
"22.1024/closet.2018.bls-summer/texture_02.png",
|
||||
"22.1024/closet.2018.bls-summer/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2018.bls-winter.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2018-bls-winter",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2018.bls-winter/texture_01.png",
|
||||
"22.1024/closet.2018.bls-winter/texture_02.png",
|
||||
"22.1024/closet.2018.bls-winter/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2018.lover.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2018-lover",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2018.lover/texture_01.png",
|
||||
"22.1024/closet.2018.lover/texture_02.png",
|
||||
"22.1024/closet.2018.lover/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.2018.spring.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-2018-spring",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.2018.spring/texture_01.png",
|
||||
"22.1024/closet.2018.spring/texture_02.png",
|
||||
"22.1024/closet.2018.spring/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
46
_2233live2d-main/res/model/22/model.default.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"type": "Live2D Model Setting",
|
||||
"name": "22-default",
|
||||
"label": "22",
|
||||
"model": "22.v2.moc",
|
||||
"textures": [
|
||||
"22.1024/closet.default.v2/texture_00.png",
|
||||
"22.1024/closet.default.v2/texture_01.png",
|
||||
"22.1024/closet.default.v2/texture_02.png",
|
||||
"22.1024/closet.default.v2/texture_03.png"
|
||||
],
|
||||
"layout": { "center_x": 0, "center_y": 0.1, "width": 2.3, "height": 2.3 },
|
||||
"motions": {
|
||||
"idle": [
|
||||
{
|
||||
"file": "motions/22.v2.idle-01.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-02.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
},
|
||||
{
|
||||
"file": "motions/22.v2.idle-03.mtn",
|
||||
"fade_in": 100,
|
||||
"fade_out": 100
|
||||
}
|
||||
],
|
||||
"tap_body": [
|
||||
{
|
||||
"file": "motions/22.v2.touch.mtn",
|
||||
"fade_in": 500,
|
||||
"fade_out": 200
|
||||
}
|
||||
],
|
||||
"thanking": [
|
||||
{
|
||||
"file": "motions/22.v2.thanking.mtn",
|
||||
"fade_in": 2000,
|
||||
"fade_out": 2000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
40
_2233live2d-main/res/model/22/motions/22.v2.idle-01.mtn
Normal file
@@ -0,0 +1,40 @@
|
||||
# Live2D Animator Motion Data
|
||||
$fps=30
|
||||
|
||||
$fadein=0
|
||||
|
||||
$fadeout=0
|
||||
|
||||
PARAM_ANGLE_X=2,1.987,1.95,1.89,1.81,1.7,1.58,1.45,1.3,1.14,0.96,0.78,0.59,0.4,0.2,0,-0.2,-0.4,-0.59,-0.78,-0.96,-1.14,-1.3,-1.45,-1.58,-1.7,-1.81,-1.89,-1.95,-1.99,-2,-1.987,-1.95,-1.89,-1.81,-1.7,-1.58,-1.45,-1.3,-1.14,-0.96,-0.78,-0.59,-0.4,-0.2,0,0.2,0.4,0.59,0.78,0.96,1.14,1.3,1.45,1.58,1.7,1.81,1.89,1.95,1.99,2,1.987,1.95,1.89,1.81,1.7,1.58,1.45,1.3,1.14,0.96,0.78,0.59,0.4,0.2,0,-0.2,-0.4,-0.59,-0.78,-0.96,-1.14,-1.3,-1.45,-1.58,-1.7,-1.81,-1.89,-1.95,-1.99,-2,-1.987,-1.95,-1.89,-1.81,-1.7,-1.58,-1.45,-1.3,-1.14,-0.96,-0.78,-0.59,-0.4,-0.2,0,0.2,0.4,0.59,0.78,0.96,1.14,1.3,1.45,1.58,1.7,1.81,1.89,1.95,1.99,2
|
||||
|
||||
PARAM_ANGLE_Y=8,7.91,7.66,7.27,6.77,6.18,5.53,4.85,4.15,3.47,2.82,2.23,1.73,1.34,1.09,1,1.11,1.43,1.94,2.58,3.34,4.17,5.05,5.95,6.83,7.66,8.42,9.06,9.57,9.89,10,9.89,9.57,9.06,8.42,7.66,6.83,5.95,5.05,4.17,3.34,2.58,1.94,1.43,1.11,1,1.09,1.34,1.73,2.23,2.82,3.47,4.15,4.85,5.53,6.18,6.77,7.27,7.66,7.91,8,7.91,7.66,7.27,6.77,6.18,5.53,4.85,4.15,3.47,2.82,2.23,1.73,1.34,1.09,1,1.11,1.43,1.94,2.58,3.34,4.17,5.05,5.95,6.83,7.66,8.42,9.06,9.57,9.89,10,9.89,9.57,9.06,8.42,7.66,6.83,5.95,5.05,4.17,3.34,2.58,1.94,1.43,1.11,1,1.09,1.34,1.73,2.23,2.82,3.47,4.15,4.85,5.53,6.18,6.77,7.27,7.66,7.91,8
|
||||
|
||||
PARAM_ANGLE_Z=6,5.96,5.86,5.69,5.47,5.18,4.85,4.48,4.07,3.63,3.15,2.65,2.13,1.59,1.05,0.5,-0.05,-0.59,-1.13,-1.65,-2.15,-2.63,-3.07,-3.48,-3.85,-4.18,-4.47,-4.69,-4.86,-4.96,-5,-4.96,-4.86,-4.69,-4.47,-4.18,-3.85,-3.48,-3.07,-2.63,-2.15,-1.65,-1.13,-0.59,-0.05,0.5,1.05,1.59,2.13,2.65,3.15,3.63,4.07,4.48,4.85,5.18,5.47,5.69,5.86,5.96,6,5.96,5.86,5.69,5.47,5.18,4.85,4.48,4.07,3.63,3.15,2.65,2.13,1.59,1.05,0.5,-0.05,-0.59,-1.13,-1.65,-2.15,-2.63,-3.07,-3.48,-3.85,-4.18,-4.47,-4.69,-4.86,-4.96,-5,-4.96,-4.86,-4.69,-4.47,-4.18,-3.85,-3.48,-3.07,-2.63,-2.15,-1.65,-1.13,-0.59,-0.05,0.5,1.05,1.59,2.13,2.65,3.15,3.63,4.07,4.48,4.85,5.18,5.47,5.69,5.86,5.96,6
|
||||
|
||||
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
|
||||
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
|
||||
PARAM_EYE_L=0,0.007,0.026,0.06,0.09,0.14,0.2,0.26,0.32,0.39,0.46,0.54,0.61,0.68,0.74,0.8,0.86,0.91,0.94,0.97,0.993,1,0.97,0.87,0.74,0.58,0.42,0.26,0.13,0.03,0,0.009,0.03,0.07,0.13,0.19,0.26,0.33,0.41,0.49,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.993,1,1,1,1,1,0.93,0.75,0.53,0.32,0.15,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_EYEK_R=0,0.007,0.026,0.06,0.09,0.14,0.2,0.26,0.32,0.39,0.46,0.54,0.61,0.68,0.74,0.8,0.86,0.91,0.94,0.97,0.993,1,0.97,0.87,0.74,0.58,0.42,0.26,0.13,0.03,0,0.009,0.03,0.07,0.13,0.19,0.26,0.33,0.41,0.49,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.993,1,1,1,1,1,0.93,0.75,0.53,0.32,0.15,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_EYE_BALL_X=-0.06,-0.06,-0.059,-0.057,-0.055,-0.052,-0.049,-0.046,-0.041,-0.037,-0.032,-0.026,-0.02,-0.014,-0.007,0,0.007,0.013,0.019,0.024,0.029,0.033,0.037,0.04,0.043,0.045,0.047,0.048,0.049,0.05,0.05,0.049,0.048,0.045,0.041,0.037,0.032,0.027,0.023,0.018,0.013,0.009,0.005,0.002,0.001,0,0,0,0,0,0,0,0,0,-0.004,-0.015,-0.028,-0.041,-0.051,-0.058,-0.06,-0.06,-0.059,-0.057,-0.055,-0.052,-0.049,-0.046,-0.041,-0.037,-0.032,-0.026,-0.02,-0.014,-0.007,0,0.007,0.013,0.019,0.024,0.029,0.033,0.037,0.04,0.043,0.045,0.047,0.048,0.049,0.05,0.05,0.05,0.05,0.048,0.047,0.045,0.043,0.04,0.037,0.033,0.029,0.024,0.019,0.013,0.007,0,-0.007,-0.014,-0.02,-0.026,-0.032,-0.037,-0.041,-0.046,-0.049,-0.052,-0.055,-0.057,-0.059,-0.06,-0.06
|
||||
|
||||
PARAM_EYE_BALL_Y=-0.25,-0.246,-0.234,-0.216,-0.19,-0.16,-0.13,-0.1,-0.07,-0.04,-0.01,0.02,0.05,0.064,0.076,0.08,0.075,0.06,0.04,0.01,-0.03,-0.06,-0.1,-0.15,-0.19,-0.22,-0.26,-0.29,-0.31,-0.325,-0.33,-0.325,-0.31,-0.29,-0.26,-0.22,-0.19,-0.15,-0.1,-0.06,-0.03,0.01,0.04,0.06,0.075,0.08,0.08,0.078,0.074,0.067,0.057,0.043,0.024,0,-0.04,-0.09,-0.15,-0.19,-0.22,-0.24,-0.25,-0.246,-0.234,-0.216,-0.19,-0.16,-0.13,-0.1,-0.07,-0.04,-0.01,0.02,0.05,0.064,0.076,0.08,0.075,0.06,0.04,0.01,-0.03,-0.06,-0.1,-0.15,-0.19,-0.22,-0.26,-0.29,-0.31,-0.325,-0.33,-0.325,-0.31,-0.29,-0.26,-0.22,-0.19,-0.15,-0.1,-0.06,-0.03,0.01,0.04,0.06,0.075,0.08,0.076,0.064,0.046,0.02,-0.01,-0.04,-0.07,-0.1,-0.13,-0.16,-0.19,-0.22,-0.234,-0.246,-0.25
|
||||
|
||||
PARAM_MOUTH_OPEN_Y=0
|
||||
|
||||
PARAM_CHEEK=0
|
||||
|
||||
PARAM_ARMR_ANGLE_Z=0
|
||||
|
||||
PARAM_ARML_ANGLE_Z=0
|
||||
|
||||
PARAM_BODY_ANGLE_X=0
|
||||
|
||||
PARAM_BODY_ANGLE_Z=0
|
||||
|
||||
PARAM_BODY2_ANGLE_Z=-1,-0.994,-0.975,-0.94,-0.9,-0.85,-0.79,-0.72,-0.65,-0.57,-0.48,-0.39,-0.3,-0.2,-0.1,0,0.1,0.2,0.3,0.39,0.48,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.994,1,0.994,0.975,0.94,0.9,0.85,0.79,0.72,0.65,0.57,0.48,0.39,0.3,0.2,0.1,0,-0.1,-0.2,-0.3,-0.39,-0.48,-0.57,-0.65,-0.72,-0.79,-0.85,-0.9,-0.94,-0.97,-0.994,-1,-0.994,-0.975,-0.94,-0.9,-0.85,-0.79,-0.72,-0.65,-0.57,-0.48,-0.39,-0.3,-0.2,-0.1,0,0.1,0.2,0.3,0.39,0.48,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.994,1,0.994,0.975,0.94,0.9,0.85,0.79,0.72,0.65,0.57,0.48,0.39,0.3,0.2,0.1,0,-0.1,-0.2,-0.3,-0.39,-0.48,-0.57,-0.65,-0.72,-0.79,-0.85,-0.9,-0.94,-0.97,-0.994,-1
|
||||
|
||||
PARAM_BODY3_ANGLE_Z=1,0.994,0.975,0.94,0.9,0.85,0.79,0.72,0.65,0.57,0.48,0.39,0.3,0.2,0.1,0,-0.1,-0.2,-0.3,-0.39,-0.48,-0.57,-0.65,-0.72,-0.79,-0.85,-0.9,-0.94,-0.97,-0.994,-1,-0.994,-0.975,-0.94,-0.9,-0.85,-0.79,-0.72,-0.65,-0.57,-0.48,-0.39,-0.3,-0.2,-0.1,0,0.1,0.2,0.3,0.39,0.48,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.994,1,0.994,0.975,0.94,0.9,0.85,0.79,0.72,0.65,0.57,0.48,0.39,0.3,0.2,0.1,0,-0.1,-0.2,-0.3,-0.39,-0.48,-0.57,-0.65,-0.72,-0.79,-0.85,-0.9,-0.94,-0.97,-0.994,-1,-0.994,-0.975,-0.94,-0.9,-0.85,-0.79,-0.72,-0.65,-0.57,-0.48,-0.39,-0.3,-0.2,-0.1,0,0.1,0.2,0.3,0.39,0.48,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.994,1
|
||||
41
_2233live2d-main/res/model/22/motions/22.v2.idle-02.mtn
Normal file
@@ -0,0 +1,41 @@
|
||||
# Live2D Animator Motion Data
|
||||
$fps=30
|
||||
|
||||
$fadein=0
|
||||
|
||||
$fadeout=0
|
||||
|
||||
PARAM_ANGLE_X=2,1.998,1.992,1.981,1.965,1.945,1.92,1.89,1.85,1.81,1.76,1.71,1.64,1.58,1.5,1.42,1.33,1.24,1.13,1.02,0.9,0.77,0.64,0.49,0.34,0.17,0,-1.86,-6.09,-11.64,-17.16,-21.3,-23,-22.21,-20.09,-17.02,-13.38,-9.62,-5.98,-2.91,-0.79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03,0.1,0.21,0.35,0.51,0.69,0.88,1.07,1.26,1.43,1.59,1.73,1.84,1.93,1.98,2
|
||||
|
||||
PARAM_ANGLE_Y=8,7.93,7.74,7.43,7.03,6.55,6.01,5.43,4.81,4.18,3.56,2.94,2.37,1.83,1.38,1,0.66,0.41,0.24,0.12,0.05,0.01,-0.011,-0.015,-0.01,-0.004,0,2.25,7.73,15,22.27,27.75,30,28.97,26.2,22.2,17.45,12.55,7.8,3.8,1.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.1,0.39,0.83,1.39,2.05,2.78,3.52,4.28,5.02,5.73,6.36,6.92,7.38,7.72,7.93,8
|
||||
|
||||
PARAM_ANGLE_Z=6,5.987,5.95,5.88,5.78,5.66,5.5,5.32,5.1,4.86,4.58,4.27,3.92,3.53,3.12,2.67,2.17,1.65,1.08,0.47,-0.18,-0.87,-1.6,-2.38,-3.21,-4.08,-5,-7.04,-10.51,-14.73,-18.8,-21.79,-23,-21.45,-17.3,-11.29,-4.18,3.18,10.29,16.3,20.45,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,21.82,21.32,20.51,19.44,18.16,16.7,15.05,13.35,11.52,9.67,7.79,5.98,4.18,2.49,0.89,-0.54,-1.82,-2.93,-3.81,-4.46,-4.86,-5,-4.86,-4.47,-3.86,-3.08,-2.18,-1.18,-0.16,0.89,1.9,2.88,3.75,4.52,5.15,5.61,5.9,6
|
||||
|
||||
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.92,0.74,0.5,0.26,0.08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
|
||||
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.92,0.74,0.5,0.26,0.08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
|
||||
PARAM_EYE_L=0
|
||||
|
||||
PARAM_EYEK_R=0
|
||||
|
||||
PARAM_EYE_BALL_X=-0.06,-0.06,-0.058,-0.056,-0.054,-0.05,-0.046,-0.042,-0.038,-0.033,-0.027,-0.022,-0.016,-0.011,-0.005,0,0.006,0.01,0.013,0.015,0.017,0.018,0.019,0.02,0.02,0.02,0.02,0.02,0.02,0.018,0.016,0.015,0.013,0.011,0.009,0.007,0.005,0.004,0.002,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.003,-0.006,-0.01,-0.015,-0.021,-0.026,-0.032,-0.038,-0.043,-0.048,-0.052,-0.055,-0.058,-0.059,-0.06
|
||||
|
||||
PARAM_EYE_BALL_Y=-0.25,-0.246,-0.234,-0.216,-0.19,-0.16,-0.13,-0.1,-0.07,-0.04,-0.01,0.02,0.05,0.064,0.076,0.08,0.073,0.056,0.03,0.01,-0.02,-0.05,-0.07,-0.1,-0.114,-0.126,-0.13,-0.128,-0.124,-0.116,-0.107,-0.096,-0.084,-0.071,-0.059,-0.046,-0.034,-0.023,-0.014,-0.006,-0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.003,-0.012,-0.026,-0.044,-0.06,-0.09,-0.11,-0.13,-0.16,-0.18,-0.199,-0.216,-0.231,-0.241,-0.248,-0.25
|
||||
|
||||
PARAM_MOUTH_OPEN_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.013,0.05,0.1,0.18,0.26,0.35,0.45,0.55,0.65,0.74,0.82,0.9,0.95,0.99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.993,0.975,0.94,0.91,0.86,0.8,0.74,0.68,0.61,0.54,0.47,0.41,0.34,0.28,0.22,0.17,0.12,0.08,0.04,0.02,0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_CHEEK=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.013,0.05,0.1,0.18,0.26,0.35,0.45,0.55,0.65,0.74,0.82,0.9,0.95,0.99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_ARMR_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.003,-0.01,-0.022,-0.037,-0.055,-0.074,-0.095,-0.12,-0.136,-0.155,-0.173,-0.188,-0.2,-0.207,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.209,-0.21,-0.21,-0.208,-0.21,-0.207,-0.206,-0.21,-0.204,-0.203,-0.202,-0.201,-0.2,-0.198,-0.194,-0.189,-0.183,-0.175,-0.167,-0.157,-0.147,-0.137,-0.126,-0.114,-0.103,-0.091,-0.079,-0.068,-0.057,-0.046,-0.035,-0.026,-0.016,-0.008,0,0.007,0.01,0.01,0.01,0.01,0.01,0.008,0.007,0.006,0.005,0.004,0.003,0.002,0.001,0,0
|
||||
|
||||
PARAM_ARML_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.003,-0.01,-0.022,-0.037,-0.055,-0.074,-0.095,-0.12,-0.136,-0.155,-0.173,-0.188,-0.2,-0.207,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.209,-0.21,-0.208,-0.21,-0.207,-0.21,-0.205,-0.204,-0.203,-0.202,-0.201,-0.2,-0.197,-0.192,-0.185,-0.176,-0.166,-0.154,-0.141,-0.128,-0.114,-0.1,-0.086,-0.072,-0.059,-0.046,-0.034,-0.023,-0.014,-0.005,0.001,0.006,0.009,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.008,0.007,0.006,0.005,0.004,0.003,0.002,0.001,0,0
|
||||
|
||||
PARAM_BODY_ANGLE_X=0
|
||||
|
||||
PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.013,0.05,0.1,0.18,0.26,0.35,0.45,0.55,0.65,0.74,0.82,0.9,0.95,0.99,1,0.995,0.981,0.96,0.93,0.89,0.85,0.81,0.76,0.7,0.65,0.59,0.54,0.48,0.42,0.37,0.31,0.26,0.21,0.17,0.13,0.09,0.06,0.03,0.016,0.004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_BODY2_ANGLE_Z=-1,-0.99,-0.96,-0.92,-0.86,-0.79,-0.7,-0.61,-0.51,-0.41,-0.3,-0.19,-0.07,0.04,0.16,0.27,0.38,0.48,0.57,0.67,0.75,0.82,0.88,0.93,0.97,0.99,1,0.993,0.973,0.94,0.9,0.84,0.78,0.71,0.63,0.55,0.46,0.37,0.28,0.18,0.09,0,-0.1,-0.18,-0.27,-0.34,-0.41,-0.48,-0.54,-0.59,-0.64,-0.69,-0.73,-0.77,-0.81,-0.84,-0.87,-0.89,-0.92,-0.934,-0.951,-0.965,-0.976,-0.985,-0.992,-0.996,-0.999,-1,-0.987,-0.95,-0.89,-0.81,-0.72,-0.61,-0.48,-0.36,-0.22,-0.09,0.05,0.19,0.32,0.45,0.56,0.67,0.76,0.85,0.91,0.96,0.99,1,0.97,0.9,0.79,0.65,0.49,0.31,0.12,-0.07,-0.26,-0.43,-0.59,-0.73,-0.84,-0.93,-0.98,-1
|
||||
|
||||
PARAM_BODY3_ANGLE_Z=1,0.99,0.96,0.92,0.86,0.79,0.7,0.61,0.51,0.41,0.3,0.19,0.07,-0.04,-0.16,-0.27,-0.38,-0.48,-0.57,-0.67,-0.75,-0.82,-0.88,-0.93,-0.97,-0.99,-1,-0.91,-0.66,-0.27,0.23,0.83,1.5,2.22,2.96,3.7,4.43,5.12,5.74,6.28,6.71,7,7.23,7.44,7.63,7.8,7.95,8.1,8.22,8.34,8.44,8.53,8.61,8.68,8.74,8.79,8.84,8.87,8.91,8.93,8.952,8.968,8.98,8.989,8.994,8.998,9,9,8.93,8.75,8.45,8.05,7.58,7.04,6.42,5.79,5.12,4.43,3.74,3.07,2.4,1.77,1.18,0.65,0.18,-0.23,-0.56,-0.8,-0.95,-1,-0.97,-0.9,-0.79,-0.65,-0.49,-0.31,-0.12,0.07,0.26,0.43,0.59,0.73,0.84,0.93,0.98,1
|
||||
|
||||
29
_2233live2d-main/res/model/22/motions/22.v2.idle-03.mtn
Normal file
@@ -0,0 +1,29 @@
|
||||
# Live2D Animator Motion Data
|
||||
$fps=30
|
||||
|
||||
$fadein=0
|
||||
|
||||
$fadeout=0
|
||||
|
||||
PARAM_ANGLE_X=0,0,0,0,0,0,-0.08,-0.27,-0.56,-0.92,-1.32,-1.74,-2.16,-2.57,-2.95,-3.29,-3.58,-3.8,-3.95,-4,-3.86,-3.52,-3.03,-2.43,-1.78,-1.1,-0.4,0.26,0.91,1.49,2,2.48,2.78,2.93,2.99,3.01,3.005,3,2.94,2.76,2.49,2.12,1.69,1.21,0.68,0.13,-0.43,-0.99,-1.53,-2.04,-2.52,-2.94,-3.3,-3.6,-3.82,-3.95,-4,-3.92,-3.7,-3.35,-2.89,-2.36,-1.76,-1.12,-0.46,0.21,0.86,1.45,2,2.48,2.78,2.93,3,3.01,3.005,3,2.9,2.66,2.33,1.95,1.55,1.16,0.79,0.48,0.22,0.06,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_ANGLE_Y=1,1,1,1,1,1,2.03,4.53,7.59,10.57,12.96,14.49,15,13.9,11.21,7.94,4.75,2.18,0.55,0,0.48,1.69,3.33,5.25,7.24,9.2,11.06,12.62,13.88,14.7,15,13.82,10.96,7.47,4.06,1.33,-0.41,-1,-0.68,0.18,1.5,3.16,5,7,9,10.84,12.5,13.82,14.68,15,13.9,11.21,7.94,4.75,2.18,0.55,0,0.28,1.03,2.19,3.64,5.25,7,8.75,10.36,11.81,12.97,13.72,14,12.9,10.21,6.94,3.75,1.18,-0.45,-1,-0.94,-0.77,-0.56,-0.3,-0.04,0.23,0.47,0.68,0.85,0.96,1,1,1,1,1,1,1
|
||||
|
||||
PARAM_ANGLE_Z=0,0,0,0,0,0,-0.52,-1.86,-3.81,-6.23,-8.92,-11.72,-14.57,-17.33,-19.91,-22.24,-24.16,-25.68,-26.66,-27,-26.38,-24.74,-22.33,-19.26,-15.73,-11.77,-7.4,-2.89,1.94,6.87,12,17.64,21.61,24.16,25.71,26.54,26.91,27,26.52,25.14,23.03,20.22,16.91,13.16,9.09,4.88,0.55,-3.79,-7.96,-11.89,-15.55,-18.8,-21.62,-23.9,-25.58,-26.64,-27,-26.64,-25.63,-23.97,-21.7,-18.96,-15.66,-11.89,-7.81,-3.27,1.6,6.62,12,17.5,21.42,24,25.6,26.49,26.9,27,26.13,23.96,21.01,17.56,13.97,10.44,7.09,4.28,2.01,0.54,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_EYE_L_OPEN=1,0.82,0.54,0.27,0.08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03,0.11,0.22,0.35,0.48,0.61,0.74,0.84,0.93,0.98,1,0.74,0.26,0,0.26,0.74,1
|
||||
|
||||
PARAM_EYE_R_OPEN=1,0.82,0.54,0.27,0.08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03,0.11,0.22,0.35,0.48,0.61,0.74,0.84,0.93,0.98,1,0.74,0.26,0,0.26,0.74,1
|
||||
|
||||
PARAM_EYE_L=1,0.91,0.76,0.63,0.53,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.474,0.43,0.38,0.32,0.25,0.19,0.13,0.08,0.04,0.01,0,0.26,0.74,1,1,1,1
|
||||
|
||||
PARAM_EYEK_R=1,0.91,0.76,0.63,0.53,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.49,0.474,0.43,0.38,0.32,0.25,0.19,0.13,0.08,0.04,0.01,0,0.26,0.74,1,1,1,1
|
||||
|
||||
PARAM_BROW_L_Y=0,0.18,0.46,0.73,0.92,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.97,0.89,0.78,0.65,0.52,0.39,0.26,0.16,0.07,0.02,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_BROW_R_Y=0,0.18,0.46,0.73,0.92,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.97,0.89,0.78,0.65,0.52,0.39,0.26,0.16,0.07,0.02,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_MOUTH_FORM=-1,-0.64,-0.07,0.46,0.85,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.94,0.77,0.56,0.3,0.04,-0.23,-0.47,-0.68,-0.85,-0.96,-1,-1,-1,-1,-1,-1,-1
|
||||
|
||||
PARAM_MOUTH_OPEN_Y=0
|
||||
|
||||
46
_2233live2d-main/res/model/22/motions/22.v2.thanking.mtn
Normal file
@@ -0,0 +1,46 @@
|
||||
# Live2D Animator Motion Data
|
||||
$fps=30
|
||||
|
||||
$fadein=1000
|
||||
|
||||
$fadeout=1000
|
||||
|
||||
PARAM_ANGLE_X=0,-0.27,-1.03,-2.21,-3.77,-5.61,-7.69,-9.95,-12.29,-14.69,-17.1,-19.42,-21.6,-23.64,-25.44,-27.01,-28.28,-29.21,-29.8,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-29.85,-29.41,-28.71,-27.78,-26.65,-25.35,-23.86,-22.27,-20.59,-18.83,-17.06,-15.22,-13.42,-11.64,-9.91,-8.24,-6.7,-5.26,-3.95,-2.81,-1.83,-1.05,-0.48,-0.12,0
|
||||
|
||||
PARAM_ANGLE_Y=0,0.03,0.14,0.32,0.58,0.93,1.36,1.89,2.51,3.24,4.06,4.99,6,7.13,8.35,9.69,11.12,12.64,14.27,16,18.67,21.2,23.59,25.71,27.47,28.83,29.69,30,27.5,23.49,19.75,17.05,16,16.011,16.04,16.1,16.17,16.26,16.37,16.49,16.63,16.78,16.94,17.11,17.29,17.48,17.67,17.87,18.07,18.27,18.47,18.68,18.88,19.08,19.28,19.47,19.65,19.83,20,20.15,20.3,20.44,20.57,20.67,20.77,20.85,20.92,20.96,20.99,21,20.55,19.79,19.23,19,18.89,18.78,18.67,18.57,18.47,18.37,18.27,18.18,18.09,18,17.91,17.82,17.74,17.66,17.58,17.5,17.42,17.35,17.28,17.21,17.14,17.08,17.01,16.95,16.9,16.84,16.78,16.73,16.68,16.63,16.58,16.54,16.49,16.45,16.41,16.38,16.34,16.31,16.27,16.24,16.22,16.19,16.16,16.14,16.12,16.101,16.083,16.067,16.053,16.04,16.03,16.021,16.013,16.007,16.003,16.001,16,16,16,16,16,16,16,16,16,16,16,15.92,15.69,15.31,14.82,14.21,13.52,12.72,11.88,10.98,10.04,9.1,8.12,7.16,6.21,5.28,4.39,3.57,2.81,2.11,1.5,0.98,0.56,0.25,0.06,0
|
||||
|
||||
PARAM_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.016,0.06,0.14,0.24,0.37,0.52,0.69,0.88,1.09,1.32,1.55,1.81,2.07,2.34,2.61,2.89,3.18,3.46,3.75,4.03,4.31,4.59,4.85,5.11,5.36,5.6,5.82,6.02,6.22,6.39,6.54,6.68,6.79,6.88,6.95,6.99,7,6.52,5.72,5.18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5.34,6.25,7.55,9.04,10.58,12.03,13.26,14.2,14.79,15,14.92,14.71,14.36,13.89,13.32,12.67,11.93,11.14,10.3,9.41,8.53,7.61,6.71,5.82,4.95,4.12,3.35,2.63,1.98,1.4,0.92,0.53,0.24,0.06,0
|
||||
|
||||
PARAM_EYE_L_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.93,0.75,0.53,0.32,0.15,0.04,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
|
||||
PARAM_EYE_R_OPEN=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.93,0.75,0.53,0.32,0.15,0.04,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.82,0.54,0.27,0.08,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
|
||||
PARAM_EYE_L=0,0.009,0.03,0.07,0.13,0.19,0.26,0.33,0.41,0.49,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.993,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03,0.12,0.25,0.4,0.56,0.7,0.83,0.92,0.98,1,1,1,1,1,1,0.991,0.97,0.93,0.88,0.82,0.76,0.69,0.62,0.55,0.47,0.4,0.33,0.26,0.2,0.14,0.09,0.06,0.03,0.007,0
|
||||
|
||||
PARAM_EYEK_R=0,0.009,0.03,0.07,0.13,0.19,0.26,0.33,0.41,0.49,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.993,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03,0.12,0.25,0.4,0.56,0.7,0.83,0.92,0.98,1,1,1,1,1,1,0.991,0.97,0.93,0.88,0.82,0.76,0.69,0.62,0.55,0.47,0.4,0.33,0.26,0.2,0.14,0.09,0.06,0.03,0.007,0
|
||||
|
||||
PARAM_EYE_BALL_X=0
|
||||
|
||||
PARAM_EYE_BALL_Y=0
|
||||
|
||||
PARAM_EYEDEFORM=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.62,0.82,0.96,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_MOUTH_OPEN_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.97,0.88,0.75,0.6,0.44,0.3,0.17,0.08,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_MOUTH_1=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.76,0.36,0.09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_CHEEK=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.997,0.989,0.977,0.96,0.94,0.92,0.89,0.86,0.82,0.79,0.75,0.71,0.67,0.63,0.59,0.55,0.51,0.46,0.42,0.38,0.34,0.3,0.26,0.22,0.19,0.16,0.13,0.1,0.07,0.05,0.034,0.02,0.009,0.002,0
|
||||
|
||||
PARAM_ARMR_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.24,-0.64,-0.91,-1,-0.91,-0.76,-0.65,-0.62,-0.71,-0.86,-0.97,-1,-0.89,-0.71,-0.59,-0.55,-0.66,-0.84,-0.96,-1,-0.91,-0.76,-0.65,-0.62,-0.71,-0.86,-0.97,-1,-0.89,-0.71,-0.59,-0.55,-0.66,-0.84,-0.96,-1,-0.91,-0.76,-0.65,-0.62,-0.71,-0.86,-0.97,-1,-0.89,-0.71,-0.59,-0.55,-0.66,-0.84,-0.96,-1,-1,-1,-1,-1,-1,-0.97,-0.88,-0.75,-0.6,-0.44,-0.3,-0.17,-0.08,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_ARML_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.24,-0.64,-0.91,-1,-0.91,-0.76,-0.65,-0.62,-0.71,-0.86,-0.97,-1,-0.89,-0.71,-0.59,-0.55,-0.66,-0.84,-0.96,-1,-0.91,-0.76,-0.65,-0.62,-0.71,-0.86,-0.97,-1,-0.89,-0.71,-0.59,-0.55,-0.66,-0.84,-0.96,-1,-0.91,-0.76,-0.65,-0.62,-0.71,-0.86,-0.97,-1,-0.89,-0.71,-0.59,-0.55,-0.66,-0.84,-0.96,-1,-1,-1,-1,-1,-1,-0.97,-0.88,-0.75,-0.6,-0.44,-0.3,-0.17,-0.08,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_BODY_ANGLE_X=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2.42,-6.39,-9.11,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9.66,-8.75,-7.45,-5.96,-4.42,-2.97,-1.74,-0.8,-0.21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2.18,-5.75,-8.2,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-8.69,-7.88,-6.71,-5.37,-3.97,-2.68,-1.57,-0.72,-0.19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_BODY2_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1.21,-3.19,-4.56,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4.83,-4.38,-3.73,-2.98,-2.21,-1.49,-0.87,-0.4,-0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
PARAM_BODY3_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.48,1.28,1.82,2,1.995,1.982,1.96,1.93,1.89,1.85,1.8,1.74,1.68,1.61,1.53,1.45,1.37,1.28,1.19,1.09,0.99,0.89,0.79,0.68,0.57,0.46,0.35,0.24,0.13,0.01,-0.1,-0.21,-0.32,-0.43,-0.54,-0.65,-0.75,-0.86,-0.96,-1.06,-1.15,-1.24,-1.33,-1.42,-1.49,-1.57,-1.64,-1.7,-1.76,-1.82,-1.86,-1.9,-1.94,-1.96,-1.984,-1.996,-2,-1.995,-1.979,-1.95,-1.92,-1.88,-1.83,-1.78,-1.71,-1.65,-1.58,-1.5,-1.43,-1.35,-1.26,-1.18,-1.1,-1.01,-0.93,-0.84,-0.76,-0.68,-0.6,-0.52,-0.45,-0.38,-0.31,-0.25,-0.2,-0.15,-0.11,-0.07,-0.04,-0.02,-0.005,0
|
||||
|
||||
PARAM_LEGL_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2,0.52,0.74,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.81,0.78,0.71,0.6,0.48,0.36,0.24,0.14,0.06,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
46
_2233live2d-main/res/model/22/motions/22.v2.touch.mtn
Normal file
@@ -0,0 +1,46 @@
|
||||
# Live2D Animator Motion Data
|
||||
$fps=30
|
||||
|
||||
$fadein=0
|
||||
|
||||
$fadeout=0
|
||||
|
||||
PARAM_ANGLE_X=0,0.38,1.37,2.82,4.61,6.6,8.69,10.79,12.84,14.75,16.47,17.9,19.02,19.75,20,20,20,20,20,20,20,20,20,19.31,17.47,14.8,11.63,8.37,5.2,2.53,0.69,0
|
||||
|
||||
PARAM_ANGLE_Y=0,-0.36,-1.31,-2.68,-4.38,-6.27,-8.25,-10.25,-12.19,-14.01,-15.65,-17,-18.07,-18.76,-19,-17.43,-14.03,-9.79,-5.39,-1.37,1.96,4.17,5,4.83,4.37,3.7,2.91,2.09,1.3,0.63,0.17,0
|
||||
|
||||
PARAM_ANGLE_Z=0,0.34,1.24,2.54,4.15,5.94,7.82,9.71,11.55,13.27,14.82,16.11,17.12,17.77,18,17.68,16.92,15.85,14.54,13.08,11.47,9.78,8,6.1,4.51,3.19,2.13,1.32,0.71,0.3,0.07,0
|
||||
|
||||
PARAM_EYE_L_OPEN=1,0.998,0.991,0.982,0.97,0.957,0.944,0.93,0.917,0.904,0.893,0.884,0.876,0.872,0.87,0.87,0.872,0.874,0.878,0.883,0.89,0.899,0.91,0.924,0.938,0.952,0.964,0.976,0.986,0.993,0.998,1
|
||||
|
||||
PARAM_EYE_R_OPEN=1,0.981,0.93,0.86,0.77,0.67,0.57,0.46,0.36,0.26,0.18,0.11,0.05,0.01,0,0,0,0,0,0,0,0,0,0.03,0.13,0.26,0.42,0.58,0.74,0.87,0.97,1
|
||||
|
||||
PARAM_EYE_L=0,0.019,0.07,0.14,0.23,0.33,0.43,0.54,0.64,0.74,0.82,0.89,0.95,0.99,1,1,1,1,1,1,1,1,1,0.97,0.87,0.74,0.58,0.42,0.26,0.13,0.03,0
|
||||
|
||||
PARAM_EYEK_R=0
|
||||
|
||||
PARAM_EYE_BALL_X=0,-0.009,-0.03,-0.07,-0.11,-0.16,-0.2,-0.25,-0.3,-0.35,-0.39,-0.42,-0.45,-0.464,-0.47,-0.47,-0.47,-0.47,-0.47,-0.467,-0.463,-0.458,-0.45,-0.43,-0.38,-0.32,-0.25,-0.18,-0.11,-0.05,-0.01,0
|
||||
|
||||
PARAM_EYE_BALL_Y=0,0.011,0.04,0.08,0.13,0.19,0.25,0.31,0.37,0.43,0.48,0.52,0.55,0.57,0.58,0.572,0.553,0.52,0.49,0.45,0.4,0.35,0.29,0.23,0.17,0.12,0.08,0.05,0.03,0.013,0.003,0
|
||||
|
||||
PARAM_EYEDEFORM=0
|
||||
|
||||
PARAM_MOUTH_OPEN_Y=0,0.014,0.05,0.11,0.17,0.25,0.33,0.4,0.48,0.55,0.62,0.67,0.71,0.74,0.75,0.741,0.72,0.68,0.63,0.57,0.51,0.45,0.38,0.32,0.26,0.2,0.14,0.09,0.06,0.03,0.007,0
|
||||
|
||||
PARAM_MOUTH_1=0
|
||||
|
||||
PARAM_CHEEK=0
|
||||
|
||||
PARAM_ARMR_ANGLE_Z=0,0.005,0.016,0.034,0.06,0.08,0.1,0.13,0.15,0.18,0.2,0.215,0.228,0.237,0.24,0.237,0.229,0.217,0.201,0.183,0.164,0.14,0.12,0.1,0.082,0.063,0.046,0.03,0.018,0.008,0.002,0
|
||||
|
||||
PARAM_ARML_ANGLE_Z=0,0.002,0.006,0.013,0.021,0.03,0.039,0.049,0.058,0.066,0.074,0.081,0.086,0.089,0.09,0.089,0.086,0.081,0.075,0.069,0.062,0.054,0.046,0.038,0.031,0.024,0.017,0.011,0.007,0.003,0.001,0
|
||||
|
||||
PARAM_BODY_ANGLE_X=0,0.19,0.69,1.41,2.31,3.3,4.34,5.4,6.42,7.37,8.24,8.95,9.51,9.87,10,9.997,9.96,9.87,9.7,9.45,9.09,8.61,8,7.11,6.05,4.88,3.7,2.58,1.56,0.74,0.2,0
|
||||
|
||||
PARAM_BODY_ANGLE_Z=0,-0.19,-0.69,-1.41,-2.31,-3.3,-4.34,-5.4,-6.42,-7.37,-8.24,-8.95,-9.51,-9.87,-10,-9.87,-9.54,-9.02,-8.38,-7.64,-6.84,-5.98,-5.12,-4.24,-3.41,-2.63,-1.9,-1.27,-0.74,-0.34,-0.09,0
|
||||
|
||||
PARAM_BODY2_ANGLE_Z=0,-0.1,-0.34,-0.71,-1.15,-1.65,-2.17,-2.7,-3.21,-3.69,-4.12,-4.47,-4.76,-4.94,-5,-4.94,-4.77,-4.51,-4.19,-3.82,-3.42,-2.99,-2.56,-2.12,-1.71,-1.31,-0.95,-0.63,-0.37,-0.17,-0.04,0
|
||||
|
||||
PARAM_BODY3_ANGLE_Z=0
|
||||
|
||||
PARAM_LEGL_ANGLE_Z=0
|
||||
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 91 KiB |