Token导航 LogoToken导航TokenDH.com
研究检索敏感数据github未标认证来源可访问许可证需确认审计提醒

game-3d-assets游戏 3D 资产

Agent Skill

game-3d-assets 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

7,944

周安装

331

GitHub Stars

109

下载量

2,648
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:game-3d-assets(游戏 3D 资产)
来源仓库:https://github.com/opusgamelabs/game-creator
仓库路径:skills/game-3d-assets
安装命令:
npx skills add https://github.com/opusgamelabs/game-creator --skill game-3d-assets
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/opusgamelabs/game-creator --skill game-3d-assets

简介

用于查找、检索和筛选相关信息,支持基于关键词快速定位候选结果。

  • 适用于在游戏开发中获取 3D 模型、贴图或其他美术资源相关线索时。
  • 安装方式:GitHub 仓库,命令为 npx skills add opusgamelabs/game-creator --skill game-3d-assets。
  • 使用前建议核对原始 README 以确认具体功能和使用方法。
  • 注意权限范围和维护状态,避免触发联网、命令执行或文件读写操作。

SKILL.md

Game 3D Asset Engineer (Model Pipeline)

You are an expert 3D game artist and integrator. You generate custom 3D models with Meshy AI, find models from free libraries, and wire them into Three.js games — replacing primitive geometry with recognizable 3D models.

Philosophy

Primitive cubes and spheres are fast to scaffold, but players can't tell a house from a tree. Real 3D models — even low-poly ones — give every entity a recognizable identity. Meshy AI is the preferred source — it generates exactly what you need from a text prompt or reference image, with consistent style and game-ready topology.

Asset Tiers

TierSourceAuthBest for
1. Meshy AI (preferred)meshy.aiMESHY_API_KEYCustom characters, props, and scenery from text/image — exact match to game theme
2. Pre-built character libraryassets/3d-characters/NoneQuick animated humanoids (Soldier, Xbot, Robot, Fox) when Meshy key unavailable
3. Sketchfabsketchfab.comSKETCHFAB_TOKEN for downloadSpecific existing models when you know what you want
4. Poly Havenpolyhaven.comNoneCC0 environment props
5. Poly.pizzapoly.pizzaPOLY_PIZZA_API_KEY10K+ low-poly CC-BY models
6. Procedural geometry (last resort)CodeN/ABoxGeometry/SphereGeometry

Meshy API Key

Meshy AI is the preferred source for all 3D assets. Before prompting the user, check if the key already exists: test -f.env && grep -q '^MESHY_API_KEY=.'.env && echo "found" If found, export it with set -a;..env; set +a and skip the prompt.

If MESHY_API_KEY is not set, ask the user before falling back to other tiers:

I'd like to generate custom 3D models with Meshy AI for the best results. You can get a free API key: 1. Sign up at https://app.meshy.ai 2. Go to Settings → API Keys 3. Create a new API key Paste your key below like: MESHY_API_KEY=your-key-here (It will be saved to.env and redacted from this conversation automatically.) Or type "skip" to use free model libraries instead.

If the user provides a key, use it for all meshy-generate.mjs calls. If they skip, fall through to Tier 2+.

Pre-built Animated Characters (No Auth, Direct Download)

These GLB files from the Three.js repo have Idle + Walk + Run animations and work immediately:

ModelURLAnimationsSizeLicense
Soldierhttps://raw.githubusercontent.com/mrdoob/three.js/dev/examples/models/gltf/Soldier.glbIdle, Walk, Run, TPose2.2 MBMIT
Xbothttps://raw.githubusercontent.com/mrdoob/three.js/dev/examples/models/gltf/Xbot.glbidle, walk, run + additive poses2.9 MBMIT
RobotExpressivehttps://raw.githubusercontent.com/mrdoob/three.js/dev/examples/models/gltf/RobotExpressive/RobotExpressive.glbIdle, Walking, Running, Dance, Jump + 8 more464 KBMIT
Foxhttps://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/Fox/glTF-Binary/Fox.glbSurvey (idle), Walk, Run163 KBCC0/CC-BY 4.0

Gesture Characters (from assets/3d-characters/)

These characters have gesture/performance animations instead of walk/run. Best for standing-position games (debate, dance-off, boxing, rhythm):

ModelAnimationsFacesSizeLicense
TrumpStillLook (idle), Clap, Dance, Point, Talk, Twist1,2661.2 MBCC-BY (Sketchfab)
Biden1 Mixamo idle/sway50,0003.3 MBCC-BY (Sketchfab)

Copy from the character library (no auth needed):

cp <plugin>/assets/3d-characters/models/trump.glb public/assets/models/
cp <plugin>/assets/3d-characters/models/biden.glb public/assets/models/

Trump clipMap:

{
  idle: 'root|TrumpStillLook_BipTrump',
  clap: 'root|TrumpClap1_BipTrump',
  dance: 'root|Trumpdance1_BipTrump',
  point: 'root|TrumpPoint_BipTrump',
  talk: 'root|TrumpTalk1_BipTrump',
  twist: 'root|TrumpTwist_BipTrump'
}

Biden clipMap:

{ idle: 'mixamo.com' }

Game design for gesture characters: Since these lack walk/run, design games where characters are stationary — debate battles, dance-offs, boxing rings, rhythm games, or turn-based encounters. Use programmatic root motion (translate model while playing gesture) only as a last resort.

Download with curl — no auth needed:

curl -L -o public/assets/models/Soldier.glb "https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/models/gltf/Soldier.glb"

Clip name mapping varies per model. Always log clip names on load and define a clipMap per character:

// Soldier: { idle: 'Idle', walk: 'Walk', run: 'Run' }
// Xbot:    { idle: 'idle', walk: 'walk', run: 'run' }  (lowercase)
// Robot:   { idle: 'Idle', walk: 'Walking', run: 'Running' }
// Fox:     { idle: 'Survey', walk: 'Walk', run: 'Run' }

Character Selection — Tiered Fallback

For EACH character in the game, try these tiers in order:

Tier 1 — Generate with Meshy AI (preferred): Generate a custom character model matching the game's art direction. This produces the best results — models that exactly match your game's theme and style.

# Generate character from text description
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
  --mode text-to-3d \
  --prompt "a stylized <character description>, low poly game character, full body, t-pose" \
  --polycount 15000 --pbr \
  --output public/assets/models/ --slug <character-slug>

# Then rig for animation (humanoid characters)
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
  --mode rig --task-id <refine-task-id> \
  --height 1.7 \
  --output public/assets/models/ --slug <character-slug>-rigged

After rigging, the model comes with basic walk/run animations. Log clip names to build the clipMap.

For named personalities, be descriptive: "a cartoon caricature of <Name>, <hair/glasses/suit details>, low poly game character".

Tier 2 — Pre-built in assets/3d-characters/: If Meshy is unavailable, check manifest.json for a name/theme match. Copy the GLB. Done.

Tier 3 — Search Sketchfab for character-specific model: Use find-3d-asset.mjs:

node scripts/find-3d-asset.mjs --query "<character name> animated character" --max-faces 10000 --list-only

Tier 4 — Generic library fallback: Use the best thematic match from assets/3d-characters/:

  • Soldier — action/military/generic human (default)
  • Xbot — sci-fi/tech/futuristic
  • RobotExpressive — cartoon/casual (most animations, 13 clips)
  • Fox — nature/animal

Multi-character games: When using Meshy, generate each character with distinct descriptions for visual variety. When falling back to library models, assign different models to each character (e.g., Soldier for one, Xbot for another).

Sketchfab Token (Tier 3 fallback)

Only needed if falling back to Sketchfab. Search is free but download requires SKETCHFAB_TOKEN. Before prompting, check if the key already exists: test -f.env && grep -q '^SKETCHFAB_TOKEN=.'.env && echo "found" If found, export it with set -a;..env; set +a and skip the prompt.

If needed and not set, ask the user:

I need a Sketchfab API token to download this model. You can get one for free: 1. Sign in at https://sketchfab.com 2. Go to https://sketchfab.com/settings/password → "API Token" 3. Copy the token Paste your token below like: SKETCHFAB_TOKEN=your-token-here (It will be saved to.env and redacted from this conversation automatically.)

Then use it via: set -a;..env; set +a && node scripts/find-3d-asset.mjs...

Search & Download Script

Use scripts/find-3d-asset.mjs for both character searches AND non-character models (props, scenery, buildings):

node scripts/find-3d-asset.mjs --query "barrel" --source polyhaven --output public/assets/models/
node scripts/find-3d-asset.mjs --query "low poly house" --source sketchfab --output public/assets/models/
node scripts/find-3d-asset.mjs --query "coin" --list-only

AssetLoader Utility

Create src/level/AssetLoader.js. Critical: use SkeletonUtils.clone() for animated models — regular .clone() breaks skeleton bindings and causes T-pose.

import * as THREE from 'three';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';
import * as SkeletonUtils from 'three/addons/utils/SkeletonUtils.js';

const loader = new GLTFLoader();
loader.setMeshoptDecoder(MeshoptDecoder); // required for meshopt-compressed GLBs
const cache = new Map();

/** Load a static (non-animated) model. Uses regular clone. */
export async function loadModel(path) {
  const gltf = await _load(path);
  const clone = gltf.scene.clone(true);
  clone.traverse((c) => {
    if (c.isMesh) { c.castShadow = true; c.receiveShadow = true; }
  });
  return clone;
}

/** Load an animated (skeletal) model. Uses SkeletonUtils.clone to preserve bone bindings. */
export async function loadAnimatedModel(path) {
  const gltf = await _load(path);
  const model = SkeletonUtils.clone(gltf.scene);
  model.traverse((c) => {
    if (c.isMesh) { c.castShadow = true; c.receiveShadow = true; }
  });
  return { model, clips: gltf.animations };
}

export function disposeAll() {
  cache.forEach((p) => p.then((gltf) => {
    gltf.scene.traverse((c) => {
      if (c.isMesh) {
        c.geometry.dispose();
        if (Array.isArray(c.material)) c.material.forEach(m => m.dispose());
        else c.material.dispose();
      }
    });
  }));
  cache.clear();
}

function _load(path) {
  if (!cache.has(path)) {
    cache.set(path, new Promise((resolve, reject) => {
      loader.load(path, resolve, undefined,
        (err) => reject(new Error(`Failed to load: ${path} — ${err.message || err}`)));
    }));
  }
  return cache.get(path);
}

Compressed GLB Support

GLBs optimized by scripts/optimize-glb.mjs (or meshy-generate.mjs / find-3d-asset.mjs which call it automatically) use meshopt compression. The MeshoptDecoder import + loader.setMeshoptDecoder() call above is required to load these compressed files. Without it, Three.js will fail to parse the geometry buffers.

CRITICAL: SkeletonUtils.clone vs.clone()

MethodUse forWhat happens
gltf.scene.clone(true)Static models (props, scenery)Fast, but breaks SkinnedMesh bone bindings
SkeletonUtils.clone(gltf.scene)Animated charactersProperly re-binds SkinnedMesh to cloned Skeleton

If you use .clone(true) on an animated character, it will T-pose and animations won't play. Always use SkeletonUtils.clone() for anything with skeletal animation.

Third-Person Character Controller

The proven pattern from the official Three.js webgl_animation_walk example:

Camera: OrbitControls with Target Follow

import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

// Setup
const orbitControls = new OrbitControls(camera, renderer.domElement);
orbitControls.enablePan = false;
orbitControls.enableDamping = true;
orbitControls.maxPolarAngle = Math.PI / 2 - 0.05; // don't go underground
orbitControls.target.set(0, 1, 0);

// Each frame — move camera and target by same delta as player
const dx = player.position.x - oldX;
const dz = player.position.z - oldZ;
orbitControls.target.x += dx;
orbitControls.target.z += dz;
orbitControls.target.y = player.position.y + 1;
camera.position.x += dx;
camera.position.z += dz;
orbitControls.update();

Movement: Camera-Relative WASD

const _v = new THREE.Vector3();
const _q = new THREE.Quaternion();
const _up = new THREE.Vector3(0, 1, 0);

// Get camera azimuth from OrbitControls
const azimuth = orbitControls.getAzimuthalAngle();

// Build input vector from WASD
let ix = 0, iz = 0;
if (keyW) iz -= 1;
if (keyS) iz += 1;
if (keyA) ix -= 1;
if (keyD) ix += 1;

// Rotate input by camera azimuth → world space movement
_v.set(ix, 0, iz).normalize();
_v.applyAxisAngle(_up, azimuth);

// Move player
player.position.addScaledVector(_v, speed * delta);

// Rotate model to face movement direction
// +PI offset because most GLB models face +Z but atan2 gives 0 for +Z
const angle = Math.atan2(_v.x, _v.z) + Math.PI;
_q.setFromAxisAngle(_up, angle);
model.quaternion.rotateTowards(_q, turnSpeed * delta);

Animation: fadeToAction Pattern

fadeToAction(name, duration = 0.3) {
  const next = actions[name];
  if (!next || next === activeAction) return;
  if (activeAction) activeAction.fadeOut(duration);
  next.reset().setEffectiveTimeScale(1).setEffectiveWeight(1).fadeIn(duration).play();
  activeAction = next;
}

// In update loop:
if (isMoving) {
  fadeToAction(shiftHeld ? 'run' : 'walk');
} else {
  fadeToAction('idle');
}
if (mixer) mixer.update(delta);

Post-Load Verification (MANDATORY)

After loading ANY 3D model (Meshy-generated, library, or Sketchfab), always verify orientation and scale. Skipping this leads to backwards characters and models that overflow their containers.

  1. Log bounding box immediately after loading — size and center
  2. Check facing direction — most Meshy models face +Z, most library models vary. Set rotationY per model in Constants.js. Start with Math.PI for Meshy models.
  3. Check scale — calculate auto-scale to fit target height. Ensure models fit within their environment (e.g., characters inside a ring, players on a platform).
  4. Align to floor — set position.y = -box.min.y to plant feet on ground
  5. Take a Playwright screenshot to visually confirm facing + fit. Don't skip this.

See the meshyai skill's "Post-Generation Verification" section for detailed code patterns.

Common Pitfalls

  1. T-posing animated characters — You used .clone() instead of SkeletonUtils.clone(). The skeleton binding is broken.
  2. Model faces wrong direction — Meshy models typically face +Z. Add rotationY: Math.PI in Constants.js. Always verify with a screenshot.
  3. Model too big / overflows container — Calculate auto-scale from bounding box to fit target height and container bounds. Never assume scale=1.0 is correct.
  4. Animation not playing — Forgot mixer.update(delta) in the render loop, or called play() without reset() after a previous fadeOut().
  5. Camera fights with OrbitControls — Never call camera.lookAt() when using OrbitControls. It manages lookAt internally.
  6. "Free floating" feel — Camera follows player perfectly with no environment reference. Add a grid (THREE.GridHelper) and place props near spawn so movement is visible.
  7. Clip names differ per model — Always log clips.map(c => c.name) on load and define a clipMap per character. Never hardcode clip names.
  8. Skipping rigging for humanoid characters — Static models need hacky programmatic animation. Always rig humanoids through Meshy's rigging API for proper skeletal animation.

Process

Step 0: Check Meshy API Key

Before starting, check if MESHY_API_KEY is available. If not, ask the user for one (see "Meshy API Key" section above). If the user skips, proceed with Tier 2+ fallbacks.

Step 1: Audit

  • Read package.json to confirm Three.js
  • Read entity files for BoxGeometry, SphereGeometry, etc.
  • List every entity using geometric shapes

Step 2: Plan

EntityModel SourceTypeNotes
PlayerMeshy text-to-3d → rigAnimated characterCustom generated + rigged
EnemyMeshy text-to-3d → rigAnimated characterCustom generated + rigged
TreeMeshy text-to-3dStatic prop"a low poly stylized tree, game asset"
BarrelMeshy text-to-3dStatic prop"a wooden barrel, low poly game asset"

If Meshy unavailable, fall back to library characters + find-3d-asset.mjs for props.

Step 3: Generate / Download

# With Meshy (preferred) — generate each entity
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
  --mode text-to-3d \
  --prompt "a heroic knight, low poly game character, full body" \
  --polycount 15000 --pbr \
  --output public/assets/models/ --slug player

# Rig humanoid characters for animation
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
  --mode rig --task-id <refine-task-id> --height 1.7 \
  --output public/assets/models/ --slug player-rigged

# Generate static props
MESHY_API_KEY=<key> node scripts/meshy-generate.mjs \
  --mode text-to-3d \
  --prompt "a wooden barrel, low poly game asset" \
  --polycount 5000 \
  --output public/assets/models/ --slug barrel

# Fallback: library characters
cp <plugin-root>/assets/3d-characters/models/Soldier.glb public/assets/models/

# Fallback: search free libraries for props
node scripts/find-3d-asset.mjs --query "barrel" --source polyhaven --output public/assets/models/

Step 4: Integrate

  1. Create src/level/AssetLoader.js with SkeletonUtils.clone() for animated models
  2. Add character definitions to Constants.js with clipMap per model
  3. Set up OrbitControls camera with target-follow pattern
  4. Implement fadeToAction() for animation crossfading
  5. Use camera-relative WASD movement with applyAxisAngle(_up, azimuth)
  6. Add Math.PI offset to model facing rotation
  7. Add THREE.GridHelper to ground for visible movement reference

Step 5: Verify

  • Run npm run dev and walk around with WASD
  • Confirm character animates (Idle when stopped, Walk when moving, Run with Shift)
  • Confirm character faces movement direction
  • Orbit camera with mouse drag, zoom with scroll
  • Run npm run build to confirm no errors

Troubleshooting

Model stuck in T-pose (not animating)

Cause: Using .clone(true) instead of SkeletonUtils.clone() breaks skeleton bindings on animated GLB models. Fix: Always use SkeletonUtils.clone() from three/addons/utils/SkeletonUtils.js for any model with animations. Regular .clone() copies the mesh but not the skeleton bindings.

Sketchfab download returns 403 Forbidden

Cause: The Sketchfab API requires authentication for model downloads, or the model license doesn't permit downloading. Fix: Ensure SKETCHFAB_TOKEN is set in environment. Check the model's license on Sketchfab — only CC-licensed models can be downloaded via API. Try alternative sources (Poly Haven, Poly.pizza) which don't require auth for free models.

meshopt decoder error on model load

Cause: Some GLB files use meshopt compression which requires a decoder not loaded by default in Three.js. Fix: Add the meshopt decoder before loading: import {MeshoptDecoder} from 'three/addons/libs/meshopt_decoder.module.js'; loader.setMeshoptDecoder(MeshoptDecoder);

Animation not playing after model loads

Cause: Animation clips not connected to the model's AnimationMixer, or clip names don't match expected values. Fix: Create an AnimationMixer for the model, then use mixer.clipAction(clip).play(). Log gltf.animations.map(a => a.name) to see available clip names — they vary by model source. Define a clipMap per character to map generic names (idle, walk, run) to actual clip names.

Camera fights with OrbitControls (jittering)

Cause: Manual camera position updates conflict with OrbitControls trying to maintain its own camera state. Fix: Don't set camera.position directly when using OrbitControls. Instead, update controls.target to follow the player, and let OrbitControls manage the camera position relative to the target. Call controls.update() once per frame in the animation loop.

Security Notes

  • Third-party model downloads: Models downloaded from Sketchfab, Poly Haven, and Poly.pizza are binary GLB/GLTF files (3D geometry, textures, animations). They are not executable code and cannot perform arbitrary actions. Three.js's GLTFLoader parses only valid glTF data structures.
  • Meshy AI API: Meshy generates models server-side from text/image prompts. The API key is stored in a local .env file and passed only to the Meshy API. Generated models are downloaded as GLB binaries.
  • API key storage: All API keys (MESHY_API_KEY, SKETCHFAB_TOKEN) are stored in the project's .env file (which should be gitignored) and loaded via environment variables. Keys are never embedded in game source code or deployed artifacts.
  • Content scope: Downloaded models are used only as visual assets rendered by Three.js. No text content from third-party sources is interpreted as instructions or commands.

Checklist

  • AssetLoader.js uses SkeletonUtils.clone() for animated models
  • clipMap defined per character model (clip names vary)
  • OrbitControls with target-follow (not manual camera.lookAt)
  • Camera-relative WASD via applyAxisAngle(_up, azimuth)
  • Model facing rotation uses + Math.PI offset in atan2
  • fadeToAction() pattern with reset() before fadeIn().play()
  • mixer.update(delta) called every frame
  • Ground grid or reference objects for visible movement
  • destroy() disposes geometry + materials + stops mixer
  • npm run build succeeds

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

32.79%
按下载量换算868

Claude

29.63%
按下载量换算785

Cursor

19.54%
按下载量换算517

Gemini CLI

9.43%
按下载量换算250

安全审计

Gen Agent Trust Hub

通过

Socket

可疑

Snyk

可疑

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills