artist onboarding

Guide for artist onboarding

Artist Onboarding Guide: 3D Asset Standards

Purpose: This document defines the technical specifications and formatting requirements for all 3D assets in Legends of Hastinapur. Following these standards ensures seamless integration between art, game client, and server.

šŸŽÆ Core Principles

  1. Single Source of Truth: All asset references live in gamedata.json (items/NPCs) or world_entities.json (environment).
  2. Server-Client Parity: Every visual object must have a corresponding server-side logic entry (for collision, interaction).
  3. Performance First: Optimize for web/mobile delivery. File size and polygon count matter.

šŸ“¦ File Format Standards

Asset TypeFormatReason
Static Models (Props, Items, Environment).glb (glTF Binary)Compressed, web-optimized, single-file with textures.
Rigged Characters (Players, NPCs).glb (glTF Binary)Supports skinned meshes and embedded animations.
AnimationsEmbedded in .glb OR separate .glb clipsPrefer embedded for simplicity. Separate clips for shared anim libraries.
Textures.webp (diffuse/albedo), .png (alpha masks).webp for best compression. Use .png only when alpha channel is critical.
Terrain Heightmaps.png (16-bit grayscale)Standard for runtime height sampling.
Terrain Splatmaps.png (RGBA, 4 layers per map)Each channel = one terrain layer (grass, dirt, rock, sand).
Audio.ogg (Vorbis)Best compression for game audio. No .mp3 or .wav.
IMPORTANT
NO .obj, .fbx, or .blend files in production. These are source formats. Convert to .glb before committing.

šŸ“ Technical Specifications

Characters (Players & NPCs)

AttributeSpecification
Poly Count< 10,000 tris for players, < 5,000 tris for common NPCs, < 2,000 tris for background NPCs.
Texture Resolution1024x1024 max for players. 512x512 for NPCs.
RigHumanoid skeleton with standard bone names (see _rig_template.blend).
OriginFeet at world origin (0, 0, 0). Y-up.
Scale1 unit = 1 meter. Average human height ~1.8 units.

Items (Weapons, Armor, Tools)

AttributeSpecification
Poly Count< 2,000 tris for weapons, < 1,500 tris for held items.
Texture Resolution512x512 max. Use texture atlases where possible.
OriginGrip point or logical center.
Namingitem_<category>_<name>.glb (e.g., item_weapon_bronze_sword.glb).

Environment (Trees, Rocks, Buildings)

AttributeSpecification
Poly Count< 3,000 tris for trees, < 1,000 tris for rocks, < 10,000 tris for buildings.
LODsRequired for objects with > 2,000 tris. Provide LOD0, LOD1, LOD2.
CollisionIf object is solid (blocks pathing), provide a simple box/convex hull collider OR mark as solid: true in the World Editor.
OriginBottom center (floor level).
Namingenv_<zone>_<type>_<name>.glb (e.g., env_hastinapur_tree_mango_01.glb).

Terrain

AttributeSpecification
Tile Size64x64 or 128x128 world units per chunk.
Heightmap Resolution65x65 or 129x129 pixels (power of 2 + 1).
Splatmap LayersMax 4 per splatmap. Use multiple splatmaps for > 4 textures.
Namingterrain_<zone>_<chunk_x>_<chunk_y>.glb for meshes, terrain_<zone>_heightmap.png.

šŸŽ¬ Animation Standards

AttributeSpecification
Tick AlignmentThe server runs on 0.6 second ticks. Animations should be multiples of 0.6s (e.g., 0.6s, 1.2s, 1.8s).
Loop PointsLoop animations must have identical first and last frames.
Naming Conventionanim_<action>_<style>.glb (e.g., anim_attack_slash.glb, anim_idle_stand.glb).
Required Anims (Characters)idle, walk, run, attack (per weapon style), hit, death, skill_<skillname>.

Animation Durations Reference

ActionDurationTicks
Attack (Melee)0.6s or 1.2s1-2
Attack (Ranged)1.2s2
Cast (Magic)1.8s3
Death1.2s2
Skill Action (e.g., Mining)2.4s4

šŸ“ Folder Structure

loh-game/assets/
ā”œā”€ā”€ models/
│   ā”œā”€ā”€ characters/         # Player models, base meshes
│   ā”œā”€ā”€ npcs/               # NPC models (e.g., Guard, Merchant)
│   ā”œā”€ā”€ items/
│   │   ā”œā”€ā”€ weapons/        # Swords, bows, etc.
│   │   ā”œā”€ā”€ armor/          # Helmets, platebodies, etc.
│   │   └── tools/          # Pickaxes, axes, nets
│   ā”œā”€ā”€ environment/
│   │   ā”œā”€ā”€ nature/         # Trees, rocks, plants
│   │   ā”œā”€ā”€ buildings/      # Houses, temples, banks
│   │   └── props/          # Chests, tables, signs
│   └── terrain/            # Terrain chunks, heightmaps
ā”œā”€ā”€ animations/
│   ā”œā”€ā”€ combat/             # Attack anims by style
│   ā”œā”€ā”€ skills/             # Woodcutting, mining, etc.
│   └── social/             # Emotes, idles
ā”œā”€ā”€ textures/
│   ā”œā”€ā”€ characters/
│   ā”œā”€ā”€ environment/
│   └── terrain/            # Splatmap layers
└── audio/
    ā”œā”€ā”€ sfx/                # Sound effects
    └── music/              # Background tracks

šŸ”„ Workflow: From Blender to Game

  1. Create/Edit in Blender (or your DCC).
  2. Export as .glb (Settings: Geometry + Textures embedded, Apply Modifiers, Y-up).
  3. Optimize using gltf-transform optimize <input.glb> <output.glb> (installs via npm).
  4. Validate using the glTF Validator: https://github.khronos.org/glTF-Validator/
  5. Place in the correct assets/ subfolder.
  6. Register in gamedata.json (for items/NPCs) or via the World Editor (for environment).
  7. Test in-game or in the Simulacrum visualizer.

āš ļø Common Mistakes

MistakeFix
Submitting .obj or .fbxConvert to .glb before commit.
Animation not loopingEnsure first/last keyframes are identical.
Character floatingOrigin must be at feet (Y=0).
Textures too largeResize to spec (512x512 / 1024x1024). Use .webp.
Mismatched animation durationAlign to 0.6s multiples.
No collision dataMark as solid: true in World Editor or provide collider.


Questions? Ask in #art-pipeline on Discord or tag @TechArt in your PR.