feat: Generate VTuber character sheet with expression assets

The Gemini service has been updated to generate a character sheet rather than a single avatar image. This sheet includes the main character and separate assets for closed eyes and an open mouth.

The `AvatarConfig` type and `RiggingEditor` component have been extended to handle these new expression assets (`textureClosedEye`, `textureOpenMouth`). A new `Sprite` component has been added to `Studio.tsx` to correctly render these specific regions from the generated character sheet. The UI has been updated to reflect the new generation process.
This commit is contained in:
James Twose
2025-11-20 20:55:47 +01:00
parent b6017794a5
commit 3eff403fb4
6 changed files with 183 additions and 114 deletions
+14 -9
View File
@@ -1,25 +1,30 @@
import { GoogleGenAI } from "@google/genai";
/**
* Generates a VTuber avatar image based on user description.
* Generates a VTuber avatar character sheet.
* Uses gemini-3-pro-image-preview for high quality.
*/
export const generateAvatarImage = async (description: string): Promise<string> => {
try {
// Initialize client inside the function to ensure we use the most up-to-date API key
// after the user has completed the selection flow.
const ai = new GoogleGenAI({ apiKey: process.env.API_KEY });
// We construct a prompt that encourages a good format for a 2D avatar (front facing, clean background)
const prompt = `
Create a high-quality, flat 2D anime or stylized character illustration suitable for a VTuber avatar.
The character should be facing forward (front view).
The background should be a solid, single color (white or bright green) to allow for easy removal or masking.
Create a VTuber character sheet with a flat 2D anime style.
LAYOUT:
1. MAIN CHARACTER (Left side, takes up 70% of width):
- Front-facing view, head and shoulders.
- Neutral expression, eyes open, mouth closed.
2. EXPRESSION ASSETS (Right side, vertical column):
- Top: The same character's face with EYES CLOSED (for blinking).
- Bottom: The same character's face with MOUTH OPEN (for talking).
Character Description: ${description}
Style: Vibrant, clean lines, detailed eyes.
Focus: Head and shoulders only.
Style: Vibrant, clean lines, solid white or green background for easy keying.
`;
const response = await ai.models.generateContent({
@@ -31,7 +36,7 @@ export const generateAvatarImage = async (description: string): Promise<string>
},
config: {
imageConfig: {
aspectRatio: "1:1",
aspectRatio: "16:9", // Wide to fit character sheet
imageSize: "1K"
}
}