@zigrivers/scaffold 3.4.1 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -0
- package/content/knowledge/game/game-accessibility.md +328 -0
- package/content/knowledge/game/game-ai-patterns.md +542 -0
- package/content/knowledge/game/game-asset-pipeline.md +359 -0
- package/content/knowledge/game/game-audio-design.md +342 -0
- package/content/knowledge/game/game-binary-vcs-strategy.md +396 -0
- package/content/knowledge/game/game-design-document.md +260 -0
- package/content/knowledge/game/game-domain-patterns.md +297 -0
- package/content/knowledge/game/game-economy-design.md +355 -0
- package/content/knowledge/game/game-engine-selection.md +242 -0
- package/content/knowledge/game/game-input-systems.md +357 -0
- package/content/knowledge/game/game-level-content-design.md +455 -0
- package/content/knowledge/game/game-liveops-analytics.md +280 -0
- package/content/knowledge/game/game-localization.md +323 -0
- package/content/knowledge/game/game-milestone-definitions.md +337 -0
- package/content/knowledge/game/game-modding-ugc.md +390 -0
- package/content/knowledge/game/game-narrative-design.md +404 -0
- package/content/knowledge/game/game-networking.md +391 -0
- package/content/knowledge/game/game-performance-budgeting.md +378 -0
- package/content/knowledge/game/game-platform-certification.md +417 -0
- package/content/knowledge/game/game-project-structure.md +360 -0
- package/content/knowledge/game/game-save-systems.md +452 -0
- package/content/knowledge/game/game-testing-strategy.md +470 -0
- package/content/knowledge/game/game-ui-patterns.md +475 -0
- package/content/knowledge/game/game-vr-ar-design.md +313 -0
- package/content/knowledge/review/review-art-bible.md +305 -0
- package/content/knowledge/review/review-game-design.md +303 -0
- package/content/knowledge/review/review-game-economy.md +272 -0
- package/content/knowledge/review/review-netcode.md +280 -0
- package/content/knowledge/review/review-platform-cert.md +341 -0
- package/content/methodology/custom-defaults.yml +25 -0
- package/content/methodology/deep.yml +25 -0
- package/content/methodology/game-overlay.yml +145 -0
- package/content/methodology/mvp.yml +25 -0
- package/content/pipeline/architecture/ai-behavior-design.md +87 -0
- package/content/pipeline/architecture/netcode-spec.md +86 -0
- package/content/pipeline/architecture/review-netcode.md +78 -0
- package/content/pipeline/foundation/performance-budgets.md +91 -0
- package/content/pipeline/modeling/narrative-bible.md +84 -0
- package/content/pipeline/pre/game-design-document.md +89 -0
- package/content/pipeline/pre/review-gdd.md +74 -0
- package/content/pipeline/quality/analytics-telemetry.md +98 -0
- package/content/pipeline/quality/live-ops-plan.md +99 -0
- package/content/pipeline/quality/platform-cert-prep.md +129 -0
- package/content/pipeline/quality/playtest-plan.md +83 -0
- package/content/pipeline/specification/art-bible.md +87 -0
- package/content/pipeline/specification/audio-design.md +96 -0
- package/content/pipeline/specification/content-structure-design.md +141 -0
- package/content/pipeline/specification/economy-design.md +104 -0
- package/content/pipeline/specification/game-accessibility.md +82 -0
- package/content/pipeline/specification/game-ui-spec.md +97 -0
- package/content/pipeline/specification/input-controls-spec.md +81 -0
- package/content/pipeline/specification/localization-plan.md +113 -0
- package/content/pipeline/specification/modding-ugc-spec.md +116 -0
- package/content/pipeline/specification/online-services-spec.md +104 -0
- package/content/pipeline/specification/review-economy.md +87 -0
- package/content/pipeline/specification/review-game-ui.md +73 -0
- package/content/pipeline/specification/save-system-spec.md +116 -0
- package/dist/cli/commands/adopt.d.ts.map +1 -1
- package/dist/cli/commands/adopt.js +25 -0
- package/dist/cli/commands/adopt.js.map +1 -1
- package/dist/cli/commands/adopt.test.js +28 -1
- package/dist/cli/commands/adopt.test.js.map +1 -1
- package/dist/cli/commands/build.test.js +3 -0
- package/dist/cli/commands/build.test.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +6 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.test.js +12 -1
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/knowledge.test.js +8 -0
- package/dist/cli/commands/knowledge.test.js.map +1 -1
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +19 -5
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/next.test.js +56 -0
- package/dist/cli/commands/next.test.js.map +1 -1
- package/dist/cli/commands/rework.d.ts.map +1 -1
- package/dist/cli/commands/rework.js +11 -2
- package/dist/cli/commands/rework.js.map +1 -1
- package/dist/cli/commands/rework.test.js +5 -0
- package/dist/cli/commands/rework.test.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +54 -4
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/run.test.js +384 -0
- package/dist/cli/commands/run.test.js.map +1 -1
- package/dist/cli/commands/skip.test.js +3 -0
- package/dist/cli/commands/skip.test.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +16 -3
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/status.test.js +55 -0
- package/dist/cli/commands/status.test.js.map +1 -1
- package/dist/cli/output/auto.d.ts +3 -0
- package/dist/cli/output/auto.d.ts.map +1 -1
- package/dist/cli/output/auto.js +9 -0
- package/dist/cli/output/auto.js.map +1 -1
- package/dist/cli/output/context.d.ts +6 -0
- package/dist/cli/output/context.d.ts.map +1 -1
- package/dist/cli/output/context.js.map +1 -1
- package/dist/cli/output/context.test.js +87 -0
- package/dist/cli/output/context.test.js.map +1 -1
- package/dist/cli/output/error-display.test.js +3 -0
- package/dist/cli/output/error-display.test.js.map +1 -1
- package/dist/cli/output/interactive.d.ts +3 -0
- package/dist/cli/output/interactive.d.ts.map +1 -1
- package/dist/cli/output/interactive.js +76 -0
- package/dist/cli/output/interactive.js.map +1 -1
- package/dist/cli/output/json.d.ts +3 -0
- package/dist/cli/output/json.d.ts.map +1 -1
- package/dist/cli/output/json.js +9 -0
- package/dist/cli/output/json.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +3 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +641 -15
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +26 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/schema.test.js +192 -1
- package/dist/config/schema.test.js.map +1 -1
- package/dist/core/assembly/overlay-loader.d.ts +24 -0
- package/dist/core/assembly/overlay-loader.d.ts.map +1 -0
- package/dist/core/assembly/overlay-loader.js +190 -0
- package/dist/core/assembly/overlay-loader.js.map +1 -0
- package/dist/core/assembly/overlay-loader.test.d.ts +2 -0
- package/dist/core/assembly/overlay-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/overlay-loader.test.js +106 -0
- package/dist/core/assembly/overlay-loader.test.js.map +1 -0
- package/dist/core/assembly/overlay-resolver.d.ts +15 -0
- package/dist/core/assembly/overlay-resolver.d.ts.map +1 -0
- package/dist/core/assembly/overlay-resolver.js +58 -0
- package/dist/core/assembly/overlay-resolver.js.map +1 -0
- package/dist/core/assembly/overlay-resolver.test.d.ts +2 -0
- package/dist/core/assembly/overlay-resolver.test.d.ts.map +1 -0
- package/dist/core/assembly/overlay-resolver.test.js +246 -0
- package/dist/core/assembly/overlay-resolver.test.js.map +1 -0
- package/dist/core/assembly/overlay-state-resolver.d.ts +26 -0
- package/dist/core/assembly/overlay-state-resolver.d.ts.map +1 -0
- package/dist/core/assembly/overlay-state-resolver.js +63 -0
- package/dist/core/assembly/overlay-state-resolver.js.map +1 -0
- package/dist/core/assembly/overlay-state-resolver.test.d.ts +2 -0
- package/dist/core/assembly/overlay-state-resolver.test.d.ts.map +1 -0
- package/dist/core/assembly/overlay-state-resolver.test.js +256 -0
- package/dist/core/assembly/overlay-state-resolver.test.js.map +1 -0
- package/dist/core/assembly/preset-loader.d.ts +1 -0
- package/dist/core/assembly/preset-loader.d.ts.map +1 -1
- package/dist/core/assembly/preset-loader.js +2 -0
- package/dist/core/assembly/preset-loader.js.map +1 -1
- package/dist/core/dependency/eligibility.test.js +3 -0
- package/dist/core/dependency/eligibility.test.js.map +1 -1
- package/dist/e2e/game-pipeline.test.d.ts +10 -0
- package/dist/e2e/game-pipeline.test.d.ts.map +1 -0
- package/dist/e2e/game-pipeline.test.js +298 -0
- package/dist/e2e/game-pipeline.test.js.map +1 -0
- package/dist/e2e/init.test.js +3 -0
- package/dist/e2e/init.test.js.map +1 -1
- package/dist/project/adopt.d.ts +3 -1
- package/dist/project/adopt.d.ts.map +1 -1
- package/dist/project/adopt.js +29 -1
- package/dist/project/adopt.js.map +1 -1
- package/dist/project/adopt.test.js +51 -1
- package/dist/project/adopt.test.js.map +1 -1
- package/dist/types/config.d.ts +50 -4
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.test.d.ts +2 -0
- package/dist/types/config.test.d.ts.map +1 -0
- package/dist/types/config.test.js +97 -0
- package/dist/types/config.test.js.map +1 -0
- package/dist/utils/eligible.d.ts +3 -2
- package/dist/utils/eligible.d.ts.map +1 -1
- package/dist/utils/eligible.js +18 -4
- package/dist/utils/eligible.js.map +1 -1
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +31 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/errors.test.js +4 -1
- package/dist/utils/errors.test.js.map +1 -1
- package/dist/wizard/questions.d.ts +4 -0
- package/dist/wizard/questions.d.ts.map +1 -1
- package/dist/wizard/questions.js +59 -1
- package/dist/wizard/questions.js.map +1 -1
- package/dist/wizard/questions.test.js +178 -4
- package/dist/wizard/questions.test.js.map +1 -1
- package/dist/wizard/wizard.d.ts +1 -0
- package/dist/wizard/wizard.d.ts.map +1 -1
- package/dist/wizard/wizard.js +4 -1
- package/dist/wizard/wizard.js.map +1 -1
- package/dist/wizard/wizard.test.js +102 -4
- package/dist/wizard/wizard.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: game-vr-ar-design
|
|
3
|
+
description: VR comfort and locomotion, stereo rendering budgets, spatial UI, hand tracking, gaze interaction, motion sickness, and certification
|
|
4
|
+
topics: [game-dev, vr, ar, comfort, locomotion, spatial-ui]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
VR and AR development is fundamentally constrained by human physiology in ways that flat-screen development is not. Every design decision — camera movement, UI placement, rendering performance, input method — must account for the vestibular system, visual comfort, and spatial cognition of the player. A frame drop that is a minor annoyance on a monitor becomes nausea-inducing in a headset. A UI panel that works at arm's length on a screen becomes unreadable at 0.5 meters or causes eye strain at 0.3 meters. Motion that the player did not initiate with their own body creates a sensory conflict that the brain interprets as poisoning. VR/AR design is not flat-screen design with head tracking bolted on — it requires rethinking interaction, performance, and comfort from first principles.
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
### Performance Targets
|
|
12
|
+
|
|
13
|
+
VR has the most demanding performance requirements in real-time rendering because dropped frames directly cause motion sickness:
|
|
14
|
+
|
|
15
|
+
- **Quest 3 / Quest Pro**: 72 Hz or 90 Hz (90 Hz strongly recommended). Per-eye resolution: 2064x2208. Total pixels per frame: ~9.1 million (both eyes). GPU: Mobile Adreno, roughly equivalent to a 2018 mid-range phone GPU.
|
|
16
|
+
- **PlayStation VR2**: 90 Hz or 120 Hz. Per-eye resolution: 2000x2040. Total pixels: ~8.2 million. GPU: PS5 AMD RDNA2 — much more capable than Quest but still must hit 90+ Hz.
|
|
17
|
+
- **PC VR (Valve Index, Pimax)**: 90 Hz, 120 Hz, or 144 Hz. Per-eye resolution varies (Index: 1440x1600). GPU: Desktop RTX-class, but driving high refresh rates at high resolution is still demanding.
|
|
18
|
+
- **Apple Vision Pro**: 90 Hz with dynamic foveated rendering. Per-eye resolution: ~3660x3200. GPU: M2+R1 chip with dedicated real-time sensor processing.
|
|
19
|
+
|
|
20
|
+
**The golden rule**: Never drop below the headset's target frame rate. A single dropped frame is noticeable. Sustained drops below target cause discomfort within 30 seconds and nausea within 2-3 minutes for sensitive users.
|
|
21
|
+
|
|
22
|
+
**Motion-to-photon latency**: The time between the player moving their head and the display updating. Must be below 20 ms. Above 20 ms, the visual world lags behind head movement, creating a disconnect that triggers motion sickness. Headset runtimes (SteamVR, Oculus Runtime) provide reprojection/timewarp as a safety net, but it is a fallback, not a strategy.
|
|
23
|
+
|
|
24
|
+
### Comfort Ratings
|
|
25
|
+
|
|
26
|
+
Platform holders (Meta, Sony, Apple) require games to self-rate their comfort level:
|
|
27
|
+
|
|
28
|
+
- **Comfortable**: Stationary or room-scale with no artificial locomotion. Suitable for all players. (Example: Beat Saber, puzzle games)
|
|
29
|
+
- **Moderate**: Slow artificial locomotion with comfort options. Most players tolerate with breaks. (Example: Walkabout Mini Golf, seated cockpit games)
|
|
30
|
+
- **Intense**: Fast movement, artificial rotation, or camera control not driven by head movement. Many players experience discomfort. (Example: fast FPS games, roller coaster simulations)
|
|
31
|
+
|
|
32
|
+
### Locomotion Options
|
|
33
|
+
|
|
34
|
+
Locomotion is the most contentious design problem in VR. Every method trades off between immersion, comfort, and accessibility.
|
|
35
|
+
|
|
36
|
+
**Teleportation:**
|
|
37
|
+
- Player points a parabolic arc, selects a destination, and instantly moves there
|
|
38
|
+
- Most comfortable (zero vestibular conflict)
|
|
39
|
+
- Breaks spatial continuity — players lose sense of distance traveled
|
|
40
|
+
- Standard for Quest platform and first-time VR users
|
|
41
|
+
|
|
42
|
+
**Smooth locomotion (thumbstick movement):**
|
|
43
|
+
- Continuous movement in the direction the player is looking or pointing
|
|
44
|
+
- Familiar to flat-screen gamers
|
|
45
|
+
- Causes motion sickness in 30-60% of new VR users
|
|
46
|
+
- Always offer as an option alongside teleportation, never as the only choice
|
|
47
|
+
|
|
48
|
+
**Snap turn vs smooth turn:**
|
|
49
|
+
- Snap turn rotates in fixed increments (30, 45, or 90 degrees) — eliminates rotational vestibular mismatch
|
|
50
|
+
- Smooth turn rotates continuously — more immersive but more nauseating
|
|
51
|
+
- Default to snap turn; offer smooth turn as an advanced option
|
|
52
|
+
|
|
53
|
+
**Room-scale (1:1 physical movement):**
|
|
54
|
+
- Player walks in real space; movement is tracked 1:1 in the virtual world
|
|
55
|
+
- Zero motion sickness (vestibular and visual signals match perfectly)
|
|
56
|
+
- Limited by physical play area (typically 2x2 m to 3x3 m)
|
|
57
|
+
- Best for experiences designed around small spaces
|
|
58
|
+
|
|
59
|
+
## Deep Guidance
|
|
60
|
+
|
|
61
|
+
### Stereo Rendering Architecture
|
|
62
|
+
|
|
63
|
+
VR renders every frame twice — once per eye — with slightly different camera positions to create stereoscopic depth. This doubles the rendering cost compared to flat-screen at the same resolution.
|
|
64
|
+
|
|
65
|
+
**Single-pass stereo rendering:**
|
|
66
|
+
|
|
67
|
+
Modern VR SDKs (OpenXR, Unity XR, Unreal VR) support single-pass stereo, which renders both eyes in a single draw call using instanced rendering. This eliminates the CPU overhead of submitting draw calls twice.
|
|
68
|
+
|
|
69
|
+
```hlsl
|
|
70
|
+
// Single-pass instanced stereo vertex shader (HLSL / Unity URP example)
|
|
71
|
+
// The GPU renders each triangle twice — once per eye — using SV_InstanceID
|
|
72
|
+
// or unity_StereoEyeIndex to select the correct view-projection matrix.
|
|
73
|
+
|
|
74
|
+
struct VertexInput {
|
|
75
|
+
float3 positionOS : POSITION;
|
|
76
|
+
float3 normalOS : NORMAL;
|
|
77
|
+
float2 uv : TEXCOORD0;
|
|
78
|
+
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
struct VertexOutput {
|
|
82
|
+
float4 positionCS : SV_POSITION;
|
|
83
|
+
float2 uv : TEXCOORD0;
|
|
84
|
+
float3 normalWS : TEXCOORD1;
|
|
85
|
+
UNITY_VERTEX_OUTPUT_STEREO
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
VertexOutput vert(VertexInput input) {
|
|
89
|
+
VertexOutput output;
|
|
90
|
+
UNITY_SETUP_INSTANCE_ID(input);
|
|
91
|
+
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
92
|
+
|
|
93
|
+
float3 positionWS = TransformObjectToWorld(input.positionOS);
|
|
94
|
+
output.positionCS = TransformWorldToHClip(positionWS);
|
|
95
|
+
output.normalWS = TransformObjectToWorldNormal(input.normalOS);
|
|
96
|
+
output.uv = input.uv;
|
|
97
|
+
return output;
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Foveated rendering:**
|
|
102
|
+
|
|
103
|
+
Foveated rendering reduces pixel workload by rendering the periphery at lower resolution than the center of the player's gaze. Fixed foveated rendering uses a static center region; eye-tracked foveated rendering dynamically follows the player's gaze.
|
|
104
|
+
|
|
105
|
+
Performance impact:
|
|
106
|
+
- Fixed foveated rendering (Quest 3): 20-30% GPU time savings at high foveation levels
|
|
107
|
+
- Eye-tracked foveated rendering (PSVR2, Vision Pro): 40-50% GPU time savings with no perceptible quality loss
|
|
108
|
+
- Outer ring can render at 1/4 to 1/16 resolution with minimal visual impact because peripheral vision has very low acuity
|
|
109
|
+
|
|
110
|
+
**Rendering budget for Quest 3 (mobile VR):**
|
|
111
|
+
- Target: 90 FPS = 11.1 ms per frame
|
|
112
|
+
- Draw calls: 50-100 maximum (batching and instancing are critical)
|
|
113
|
+
- Triangles: 100K-300K per frame (both eyes combined)
|
|
114
|
+
- Texture memory: 200-400 MB (compressed ASTC textures mandatory)
|
|
115
|
+
- Shader complexity: avoid multi-pass shaders; one directional light, baked GI, no real-time shadows if possible
|
|
116
|
+
- Post-processing: avoid or minimize — bloom, SSAO, and motion blur are expensive and motion blur in VR causes nausea
|
|
117
|
+
|
|
118
|
+
**Rendering budget for PC VR:**
|
|
119
|
+
- Target: 90-120 FPS depending on headset
|
|
120
|
+
- Draw calls: 500-2,000 (still much lower than flat-screen games due to frame rate target)
|
|
121
|
+
- Triangles: 1-3 million per frame
|
|
122
|
+
- Real-time shadows: one cascade, limited distance
|
|
123
|
+
- Post-processing: use sparingly; temporal anti-aliasing is recommended but must be tuned to avoid ghosting at high head rotation speeds
|
|
124
|
+
|
|
125
|
+
### Spatial UI Design
|
|
126
|
+
|
|
127
|
+
VR UI cannot follow flat-screen conventions. Flat HUDs locked to the camera (head-locked UI) cause eye strain and nausea. VR UI must exist in 3D space.
|
|
128
|
+
|
|
129
|
+
**UI placement guidelines:**
|
|
130
|
+
|
|
131
|
+
- **Comfortable viewing distance**: 1.5-3.0 meters from the player. Closer than 1.0 m forces uncomfortable eye convergence. Farther than 5.0 m loses readability.
|
|
132
|
+
- **Comfortable viewing angle**: Within 30 degrees of center gaze (horizontally and vertically). UI at extreme angles requires neck rotation, which fatigues players.
|
|
133
|
+
- **Text size**: Minimum 1.0 degree of visual arc per line height. At 2 meters distance, this is approximately 3.5 cm tall text. For Quest 3 resolution, aim for 1.5+ degrees per line to remain crisp.
|
|
134
|
+
- **Panel curvature**: Curve large UI panels to maintain consistent distance from the player's eyes across the panel's width. A flat 2-meter-wide panel has edges 15-20% farther from the player than the center, causing focus mismatch.
|
|
135
|
+
|
|
136
|
+
**UI anchoring strategies:**
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
World-locked UI:
|
|
140
|
+
- Attached to a fixed position in the game world
|
|
141
|
+
- Example: A scoreboard on a virtual wall, a label above an NPC
|
|
142
|
+
- Feels most natural and immersive
|
|
143
|
+
- Disappears when the player turns away (can be disorienting if critical)
|
|
144
|
+
|
|
145
|
+
Body-locked UI:
|
|
146
|
+
- Follows the player's body position but not head rotation
|
|
147
|
+
- Example: A wrist-mounted menu (look at your virtual wrist to open)
|
|
148
|
+
- Good for persistent info (health, ammo) without head-lock nausea
|
|
149
|
+
- Requires the player to consciously look at it
|
|
150
|
+
|
|
151
|
+
Tag-along UI:
|
|
152
|
+
- Lazily follows head gaze with damping and deadzone
|
|
153
|
+
- Stays roughly in front of the player but does not track head 1:1
|
|
154
|
+
- Soft spring behavior: UI drifts into view when the player looks away for a few seconds
|
|
155
|
+
- Good for notifications, subtitles, and non-critical persistent info
|
|
156
|
+
- NEVER lock UI rigidly to the head — this is the most common VR UI mistake
|
|
157
|
+
|
|
158
|
+
Hand-attached UI:
|
|
159
|
+
- Anchored to the player's tracked hand or controller
|
|
160
|
+
- Example: Inventory panel that appears when the player flips their hand palm-up
|
|
161
|
+
- Natural interaction metaphor but can be jittery on hand tracking (vs controllers)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Hand Tracking and Gaze Interaction
|
|
165
|
+
|
|
166
|
+
Hand tracking (Quest, Vision Pro) eliminates controllers but introduces new design constraints:
|
|
167
|
+
|
|
168
|
+
**Hand tracking limitations:**
|
|
169
|
+
- Accuracy: ±5-10 mm positional, ±5-10 degree rotational (much worse than controller tracking)
|
|
170
|
+
- Occlusion: Hands behind the back, behind the head, or overlapping each other lose tracking
|
|
171
|
+
- Latency: 20-40 ms higher than controller input
|
|
172
|
+
- False positives: Casual hand movements may trigger unintended interactions
|
|
173
|
+
- Fatigue: Sustained arm-raised interactions cause "gorilla arm" fatigue within 2-3 minutes
|
|
174
|
+
|
|
175
|
+
**Design rules for hand tracking:**
|
|
176
|
+
- Use large interaction targets (minimum 6 cm diameter at arm's length)
|
|
177
|
+
- Provide visual and audio feedback for hover, select, and release states
|
|
178
|
+
- Rest position for hands should be below chest height — do not require raised arms for extended interactions
|
|
179
|
+
- Avoid precision tasks (small buttons, fine sliders) — hand tracking does not have the precision
|
|
180
|
+
- Always provide a controller fallback for accessibility
|
|
181
|
+
|
|
182
|
+
**Gaze interaction (eye tracking):**
|
|
183
|
+
- Eye tracking (PSVR2, Vision Pro, Pimax Crystal) allows gaze to act as a pointer
|
|
184
|
+
- Gaze + pinch (Vision Pro model): Look at a target, pinch thumb-and-finger to select
|
|
185
|
+
- Gaze + dwell: Look at a target for a threshold duration (1.0-1.5 seconds) to select
|
|
186
|
+
- Dwell timers need visual feedback (radial progress indicator on the target)
|
|
187
|
+
- Midas touch problem: Players look at things they do not intend to interact with; require explicit confirmation (pinch, button press, or dwell) rather than gaze-alone activation
|
|
188
|
+
|
|
189
|
+
### Motion Sickness Mitigation
|
|
190
|
+
|
|
191
|
+
Motion sickness in VR (technically "cybersickness") is caused by conflict between vestibular (inner ear) and visual signals. The inner ear reports "not moving" while the eyes report "moving." The brain interprets this conflict as potential poisoning and triggers nausea.
|
|
192
|
+
|
|
193
|
+
**Proven mitigation techniques:**
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
Technique | Effectiveness | Immersion Cost
|
|
197
|
+
────────────────────────┼───────────────┼───────────────
|
|
198
|
+
Teleportation | High | High (breaks continuity)
|
|
199
|
+
Snap turn | High | Low
|
|
200
|
+
Vignetting during move | Medium-High | Low (reduces FOV temporarily)
|
|
201
|
+
Stationary reference | Medium | Low (cockpit, nose)
|
|
202
|
+
Reduced FOV during move | Medium | Medium
|
|
203
|
+
Comfort cage / grid | Medium | Medium (visible overlay)
|
|
204
|
+
Slower movement speed | Medium | Low
|
|
205
|
+
Head-bob removal | Medium | Low
|
|
206
|
+
Fixed horizon line | Medium | Low
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Vignetting (tunnel vision):**
|
|
210
|
+
- During artificial locomotion, darken or black out the peripheral vision
|
|
211
|
+
- Reduces the visual area that conflicts with vestibular signals
|
|
212
|
+
- Player adjustable: some players want full FOV, others need heavy vignetting
|
|
213
|
+
- Implementation: post-process shader that blends a dark vignette from the edges inward when velocity exceeds a threshold
|
|
214
|
+
|
|
215
|
+
**Stationary reference frame:**
|
|
216
|
+
- Add a fixed visual element that does not move with the virtual world
|
|
217
|
+
- A virtual nose, cockpit dashboard, or helmet rim provides a stable reference that reduces conflict
|
|
218
|
+
- Even a subtle grid overlay on the floor during movement reduces discomfort
|
|
219
|
+
|
|
220
|
+
**Developer testing protocol:**
|
|
221
|
+
- Test with VR-naive users (not just the dev team, who have developed "VR legs")
|
|
222
|
+
- Minimum 20-minute test sessions — sickness often appears after 10-15 minutes of continuous play
|
|
223
|
+
- Include a post-session questionnaire (Simulator Sickness Questionnaire / SSQ)
|
|
224
|
+
- Track drop-off points where testers request to stop
|
|
225
|
+
- Any feature that causes 20%+ of testers to report discomfort must be optional or removed
|
|
226
|
+
|
|
227
|
+
### VR-Specific Certification Requirements
|
|
228
|
+
|
|
229
|
+
Platform holders impose VR-specific certification requirements beyond standard console certification:
|
|
230
|
+
|
|
231
|
+
**Meta Quest Store requirements:**
|
|
232
|
+
- Must maintain 72 Hz or 90 Hz with zero dropped frames during normal gameplay
|
|
233
|
+
- Must not render anything closer than 0.5 m to the camera (causes eye strain)
|
|
234
|
+
- Must include a "recenter" option accessible at any time
|
|
235
|
+
- Must pause when the headset is removed (proximity sensor)
|
|
236
|
+
- Must render a passthrough or guardian boundary when the player approaches play area edges
|
|
237
|
+
- Must include comfort rating metadata in the store listing
|
|
238
|
+
- Must not artificially move the camera without player input (no forced camera animations, no cutscenes that rotate the player)
|
|
239
|
+
|
|
240
|
+
**PlayStation VR2 requirements:**
|
|
241
|
+
- Must support 90 Hz minimum; 120 Hz mode recommended for fast-paced games
|
|
242
|
+
- Must implement reprojection correctly (Sony provides the SDK)
|
|
243
|
+
- Must use eye-tracking-based foveated rendering (PlayStation SDK provides the API)
|
|
244
|
+
- Must support the Sense controller haptics (adaptive triggers, haptic feedback)
|
|
245
|
+
- Must implement the "cinematic mode" fallback for non-VR displays
|
|
246
|
+
- Must display health and safety warnings at first launch
|
|
247
|
+
|
|
248
|
+
**Apple visionOS requirements:**
|
|
249
|
+
- Must use RealityKit or Metal with the Compositor Services API
|
|
250
|
+
- Must support Shared Space (runs alongside other apps) or Full Space (exclusive VR mode)
|
|
251
|
+
- Must implement passthrough correctly — never render over the user's real environment without explicit consent
|
|
252
|
+
- Must support eye-and-pinch interaction as the primary input method
|
|
253
|
+
- Must handle "Digital Crown" press to return to the home view
|
|
254
|
+
- Must not cause the system thermal throttling warning (sustained thermal headroom)
|
|
255
|
+
|
|
256
|
+
### AR-Specific Design Considerations
|
|
257
|
+
|
|
258
|
+
AR overlays virtual content onto the real world, introducing unique constraints:
|
|
259
|
+
|
|
260
|
+
**Spatial anchoring:**
|
|
261
|
+
- Virtual objects must be anchored to real-world surfaces (planes, walls, floors) detected by the device's scene understanding
|
|
262
|
+
- Anchors drift over time (1-5 cm per minute without re-localization)
|
|
263
|
+
- Save and restore anchors across sessions using persistent world maps (ARKit, ARCore, or OpenXR spatial anchors)
|
|
264
|
+
- Test on various surface types: glossy floors, textured carpet, low-light rooms, outdoor grass
|
|
265
|
+
|
|
266
|
+
**Lighting estimation:**
|
|
267
|
+
- AR devices estimate real-world lighting direction and intensity
|
|
268
|
+
- Virtual objects must match the real-world lighting to avoid looking "pasted on"
|
|
269
|
+
- Use the AR framework's light estimation API (ARKit provides ambient intensity + color temperature + directional light probes)
|
|
270
|
+
- Cast virtual shadows onto real-world surfaces for grounding
|
|
271
|
+
|
|
272
|
+
**Occlusion:**
|
|
273
|
+
- Real-world objects should occlude (block) virtual objects that are behind them
|
|
274
|
+
- LiDAR-equipped devices (iPhone Pro, iPad Pro, Vision Pro) provide depth maps for real-time occlusion
|
|
275
|
+
- Non-LiDAR devices can approximate with plane-based occlusion (objects behind detected floor/wall planes are hidden)
|
|
276
|
+
- Imperfect occlusion is more distracting than no occlusion — if the device cannot produce clean occlusion, consider disabling it
|
|
277
|
+
|
|
278
|
+
**Interaction distance:**
|
|
279
|
+
- AR content at arm's length (0.3-1.0 m) works for tabletop experiences and close-up inspection
|
|
280
|
+
- AR content at room scale (1-5 m) works for furniture placement, navigation overlays
|
|
281
|
+
- AR content beyond 5 m has significant tracking drift and parallax issues on phone-based AR
|
|
282
|
+
- Head-mounted AR (Vision Pro, HoloLens) handles distance better due to stereoscopic depth
|
|
283
|
+
|
|
284
|
+
### Performance Profiling for VR
|
|
285
|
+
|
|
286
|
+
Standard profiling tools miss VR-specific issues. Use platform-specific VR profilers:
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
Platform | Profiling Tool | Key Metrics
|
|
290
|
+
────────────────┼─────────────────────────────┼─────────────────────────────
|
|
291
|
+
Quest 3 | Meta Quest Developer Hub | FPS, GPU utilization %,
|
|
292
|
+
| (MQDH) + OVR Metrics Tool | CPU/GPU frame time,
|
|
293
|
+
| | thermal state, foveation level
|
|
294
|
+
────────────────┼─────────────────────────────┼─────────────────────────────
|
|
295
|
+
PC VR | SteamVR Frame Timing | Frame time, reprojection %,
|
|
296
|
+
| + fpsVR + GPU vendor tools | GPU/CPU bound indicator,
|
|
297
|
+
| (Nsight, RenderDoc) | motion-to-photon latency
|
|
298
|
+
────────────────┼─────────────────────────────┼─────────────────────────────
|
|
299
|
+
PSVR2 | PlayStation Performance | Frame time per eye,
|
|
300
|
+
| Analyzer (Razor) | foveated rendering savings,
|
|
301
|
+
| | Sense controller haptic load
|
|
302
|
+
────────────────┼─────────────────────────────┼─────────────────────────────
|
|
303
|
+
Vision Pro | Xcode Instruments + | Render pipeline timeline,
|
|
304
|
+
| RealityKit Trace | thermal headroom %,
|
|
305
|
+
| | compositor latency
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**Key VR profiling metrics:**
|
|
309
|
+
- **Frame time (per eye)**: Must stay under the frame budget (11.1 ms at 90 Hz)
|
|
310
|
+
- **Reprojection/timewarp ratio**: Percentage of frames that required reprojection. Above 5% indicates consistent performance problems. Above 20% causes visible artifacts.
|
|
311
|
+
- **Thermal state**: Mobile VR (Quest) throttles GPU/CPU when overheating. Monitor thermal headroom and reduce quality settings proactively before thermal throttling kicks in.
|
|
312
|
+
- **Draw call count**: VR amplifies draw call overhead because each call may be issued twice (once per eye, unless using single-pass stereo). Batch aggressively.
|
|
313
|
+
- **Shader complexity**: Profile per-pixel shader cost. In VR, the pixel count is 2-3x a 1080p flat-screen game, so expensive fragment shaders hit much harder.
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-art-bible
|
|
3
|
+
description: Failure modes and review passes specific to Art Bible documents — budget consistency, naming conventions, LOD coverage, and pipeline validation
|
|
4
|
+
topics: [game-dev, review, art, assets, lod, naming]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review: Art Bible
|
|
8
|
+
|
|
9
|
+
The Art Bible defines visual standards, asset specifications, and production pipelines for every art asset in the game. It must be consistent with performance budgets, complete in naming conventions and LOD tier definitions, and actionable for artists working in DCC tools. This review uses 7 passes targeting the specific ways Art Bibles fail.
|
|
10
|
+
|
|
11
|
+
Follows the review process defined in `review-methodology.md`.
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
|
|
15
|
+
- **Pass 1 — Budget Consistency**: Polygon counts, texture sizes, and draw call limits align with performance budgets defined elsewhere; no asset exceeds its tier's budget.
|
|
16
|
+
- **Pass 2 — Naming Convention Completeness**: Every asset type (mesh, texture, material, animation, audio, VFX) has a naming convention; no gaps force artists to invent names.
|
|
17
|
+
- **Pass 3 — LOD Tier Coverage**: LOD tiers are defined for every asset category with specific poly reduction targets, transition distances, and quality fallback rules.
|
|
18
|
+
- **Pass 4 — Pipeline Validation Steps**: Every stage from DCC export to engine import has a validation step; no "hope it works" gaps in the pipeline.
|
|
19
|
+
- **Pass 5 — Platform-Specific Compression**: Texture compression formats, audio codecs, and mesh optimization targets are specified per target platform.
|
|
20
|
+
- **Pass 6 — DCC-to-Engine Import Validation**: Export settings, coordinate systems, scale factors, and material mappings are documented for every DCC-to-engine path.
|
|
21
|
+
- **Pass 7 — Style Guide Enforceability**: Visual style rules are objectively verifiable, not subjective; an artist can determine compliance without asking the art director.
|
|
22
|
+
|
|
23
|
+
## Deep Guidance
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Pass 1: Budget Consistency
|
|
28
|
+
|
|
29
|
+
### What to Check
|
|
30
|
+
|
|
31
|
+
Polygon counts, texture memory budgets, draw call targets, and shader complexity limits in the Art Bible align with performance budgets defined in the technical design or performance-budgets document. No individual asset spec exceeds what the performance budget allocates for its category.
|
|
32
|
+
|
|
33
|
+
### Why This Matters
|
|
34
|
+
|
|
35
|
+
An Art Bible that specifies 50K polygons per character while the performance budget allocates 200K polygons for 10 on-screen characters has a math problem — 10 × 50K = 500K, which is 2.5x over budget. This disconnect is invisible until the game runs at 15 FPS on target hardware. Budget consistency between the Art Bible and performance constraints is the single most impactful review pass.
|
|
36
|
+
|
|
37
|
+
### How to Check
|
|
38
|
+
|
|
39
|
+
1. Extract per-asset-type budgets from the Art Bible: characters, props, environment tiles, VFX, UI elements
|
|
40
|
+
2. Extract scene composition limits from the performance budget: max simultaneous characters, max props in view, max active VFX
|
|
41
|
+
3. Multiply: (per-asset budget) × (max simultaneous count) = total budget consumption per category
|
|
42
|
+
4. Sum all categories — does the total exceed the frame budget for the target platform?
|
|
43
|
+
5. Check texture memory: total unique textures × resolution × format size vs. available VRAM on minimum spec hardware
|
|
44
|
+
6. Verify draw call budget: each material instance is typically one draw call — count materials × max instances
|
|
45
|
+
7. Check shader complexity: are there real-time shadowing, SSR, volumetric, or post-process budgets that conflict with art specifications?
|
|
46
|
+
|
|
47
|
+
### What a Finding Looks Like
|
|
48
|
+
|
|
49
|
+
- P0: "Art Bible specifies 4K textures for hero characters (4 × 4096×4096 RGBA = 256MB). With 4 characters on screen, texture memory alone is 1GB — exceeding the 2GB VRAM target when environment textures are included."
|
|
50
|
+
- P1: "Character polygon budget is 30K but no LOD specification exists. At 200m distance, 30K characters consume the same budget as at 5m distance."
|
|
51
|
+
- P2: "VFX particle budget says 'up to 10,000 particles per effect' but does not specify max simultaneous effects. 3 effects × 10K = 30K particles may exceed the GPU particle budget."
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Pass 2: Naming Convention Completeness
|
|
56
|
+
|
|
57
|
+
### What to Check
|
|
58
|
+
|
|
59
|
+
Every asset type in the production pipeline has an explicit naming convention. Naming covers prefixes/suffixes for type identification, platform/LOD/variant tagging, and version control disambiguation. No asset type requires an artist to invent a naming scheme.
|
|
60
|
+
|
|
61
|
+
### Why This Matters
|
|
62
|
+
|
|
63
|
+
Inconsistent naming breaks automated pipelines. When the build system expects `T_CharacterName_D.png` for diffuse textures and an artist names it `CharacterName_diffuse.tga`, the import pipeline either fails silently or imports the asset incorrectly. At scale, naming inconsistency makes asset search, batch processing, and automated validation impossible. Every hour spent fixing naming retroactively costs 10x the effort of defining conventions upfront.
|
|
64
|
+
|
|
65
|
+
### How to Check
|
|
66
|
+
|
|
67
|
+
Use this checklist to verify every asset type is covered:
|
|
68
|
+
|
|
69
|
+
```markdown
|
|
70
|
+
## Naming Convention Coverage Checklist
|
|
71
|
+
|
|
72
|
+
### Meshes
|
|
73
|
+
- [ ] Static meshes: prefix, category, variant, LOD suffix
|
|
74
|
+
- [ ] Skeletal meshes: prefix, character/creature name, variant
|
|
75
|
+
- [ ] Collision meshes: prefix convention (UCX_, UBX_, USP_ or equivalent)
|
|
76
|
+
- [ ] LOD suffix convention: _LOD0, _LOD1, _LOD2, etc.
|
|
77
|
+
|
|
78
|
+
### Textures
|
|
79
|
+
- [ ] Diffuse/Albedo: suffix convention (_D, _Albedo, _BaseColor)
|
|
80
|
+
- [ ] Normal map: suffix convention (_N, _Normal)
|
|
81
|
+
- [ ] Roughness/Metallic/AO: suffix conventions for each channel
|
|
82
|
+
- [ ] Packed channel maps: channel order documented (e.g., RGBA = R:Metallic, G:Roughness, B:AO, A:Height)
|
|
83
|
+
- [ ] Emissive: suffix convention (_E, _Emissive)
|
|
84
|
+
- [ ] Resolution suffix if multiple resolutions exist (_2K, _4K)
|
|
85
|
+
|
|
86
|
+
### Materials
|
|
87
|
+
- [ ] Master material naming
|
|
88
|
+
- [ ] Material instance naming: parent reference in name
|
|
89
|
+
- [ ] Material function naming
|
|
90
|
+
|
|
91
|
+
### Animations
|
|
92
|
+
- [ ] Animation clip naming: character_action_variant format
|
|
93
|
+
- [ ] Animation blend space naming
|
|
94
|
+
- [ ] Animation montage naming
|
|
95
|
+
- [ ] Additive vs. override distinction in name
|
|
96
|
+
|
|
97
|
+
### Audio
|
|
98
|
+
- [ ] Sound cue naming
|
|
99
|
+
- [ ] Waveform file naming
|
|
100
|
+
- [ ] Music track naming
|
|
101
|
+
- [ ] Attenuation preset naming
|
|
102
|
+
|
|
103
|
+
### VFX
|
|
104
|
+
- [ ] Particle system naming
|
|
105
|
+
- [ ] VFX texture naming (flipbook, noise, gradient)
|
|
106
|
+
- [ ] VFX material naming
|
|
107
|
+
|
|
108
|
+
### UI
|
|
109
|
+
- [ ] Widget/component naming
|
|
110
|
+
- [ ] Icon naming: category_name_state format
|
|
111
|
+
- [ ] Font asset naming
|
|
112
|
+
|
|
113
|
+
### Folders
|
|
114
|
+
- [ ] Folder hierarchy convention documented
|
|
115
|
+
- [ ] Per-asset-type folder location specified
|
|
116
|
+
- [ ] Shared vs. unique asset folder rules
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### What a Finding Looks Like
|
|
120
|
+
|
|
121
|
+
- P0: "Texture naming convention exists for diffuse and normal maps but packed channel maps (ORM, MRAO) have no convention. Artists will invent inconsistent suffixes and channel orders."
|
|
122
|
+
- P1: "Animation naming convention uses character_action format but does not address variants. 'Hero_Run' and 'Hero_Run_Injured' need a variant convention or the library becomes unsearchable."
|
|
123
|
+
- P2: "VFX textures have no naming convention distinct from material textures. A search for 'Smoke' returns both VFX flipbooks and environment material textures."
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Pass 3: LOD Tier Coverage
|
|
128
|
+
|
|
129
|
+
### What to Check
|
|
130
|
+
|
|
131
|
+
LOD (Level of Detail) tiers are defined for every asset category that appears at varying distances. Each tier specifies polygon reduction targets, texture downscale ratios, transition distances, and quality fallback rules for when LOD transitions are visible.
|
|
132
|
+
|
|
133
|
+
### Why This Matters
|
|
134
|
+
|
|
135
|
+
Without LOD specifications, every asset renders at maximum quality regardless of screen size. A 50K polygon character at 500m distance occupies 3 pixels but consumes the same GPU budget as at 5m. LOD is the primary tool for maintaining frame rate in open environments. Missing LOD specs mean either every asset is over-budgeted for distance viewing (wasting GPU) or under-budgeted for close-up viewing (visible quality loss).
|
|
136
|
+
|
|
137
|
+
### How to Check
|
|
138
|
+
|
|
139
|
+
1. Verify LOD tiers exist for: characters, props, environment assets, foliage, vehicles, weapons
|
|
140
|
+
2. For each asset category, check that each LOD tier specifies: polygon count or percentage reduction, texture resolution, transition distance
|
|
141
|
+
3. Verify transition method: distance-based, screen-size-based, or manual — is it consistent across categories?
|
|
142
|
+
4. Check for LOD transition artifacts: does the Art Bible specify dithering, cross-fade, or hard-cut transitions?
|
|
143
|
+
5. Verify that LOD0 (highest quality) budget matches the performance budget from Pass 1
|
|
144
|
+
6. Check for imposter/billboard LODs for distant foliage and crowd characters
|
|
145
|
+
7. Verify that skeletal meshes have LOD-appropriate bone reduction (fewer bones at lower LODs to reduce skinning cost)
|
|
146
|
+
|
|
147
|
+
### What a Finding Looks Like
|
|
148
|
+
|
|
149
|
+
- P0: "No LOD specification exists for any asset type. The game has open-world environments where assets are visible at 50m-2000m distances."
|
|
150
|
+
- P1: "Character LODs are defined (LOD0-LOD3) but environment props have no LOD specification. Dense environments with hundreds of props will exceed frame budget."
|
|
151
|
+
- P1: "LOD transition distance is specified as 'appropriate for the asset size' — this is not a specification. Each asset category needs concrete distance thresholds."
|
|
152
|
+
- P2: "Foliage LODs exist but no imposter/billboard LOD is specified for distances beyond 200m. Dense forests will render full 3D meshes at any distance."
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Pass 4: Pipeline Validation Steps
|
|
157
|
+
|
|
158
|
+
### What to Check
|
|
159
|
+
|
|
160
|
+
The Art Bible defines validation checkpoints at every stage of the asset pipeline: DCC authoring constraints, export settings verification, automated import validation, in-engine quality checks, and integration testing. No stage relies on "the artist will check it looks right."
|
|
161
|
+
|
|
162
|
+
### Why This Matters
|
|
163
|
+
|
|
164
|
+
Art pipelines without validation gates produce assets that are technically correct in the DCC tool but broken in-engine. Typical failures: non-manifold geometry that renders in Maya but creates lighting artifacts in-engine, textures with wrong color space (sRGB vs. linear) that look correct in Photoshop but are washed out in-engine, animations with baked scale that cause character size to change. Each failure is discovered late and costs exponentially more to fix.
|
|
165
|
+
|
|
166
|
+
### How to Check
|
|
167
|
+
|
|
168
|
+
1. Map the pipeline stages: concept → modeling → texturing → rigging → animation → export → import → integration
|
|
169
|
+
2. For each stage, verify a validation step exists with specific pass/fail criteria
|
|
170
|
+
3. Check that validation criteria are automatable where possible (polygon count check, texture size check, naming convention check)
|
|
171
|
+
4. Verify that DCC-side validation exists: artists should catch problems before export, not after import
|
|
172
|
+
5. Check for batch validation tooling: can the entire asset library be validated in one pass?
|
|
173
|
+
6. Verify that validation failures have a documented remediation path (not just "fix it")
|
|
174
|
+
7. Check that the validation pipeline handles asset updates (re-imported assets) not just new assets
|
|
175
|
+
|
|
176
|
+
### What a Finding Looks Like
|
|
177
|
+
|
|
178
|
+
- P0: "No automated validation steps exist in the pipeline. Asset quality is verified manually by the art lead reviewing each asset in-engine."
|
|
179
|
+
- P1: "Export validation checks polygon count but not UV layout. Overlapping UVs cause lightmap artifacts that are only discovered during level lighting builds."
|
|
180
|
+
- P2: "Validation exists for new assets but re-imported assets (updates) bypass validation. An artist updating a texture could introduce a color space error that goes undetected."
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Pass 5: Platform-Specific Compression
|
|
185
|
+
|
|
186
|
+
### What to Check
|
|
187
|
+
|
|
188
|
+
Texture compression formats, audio codecs, mesh optimization targets, and shader feature levels are specified per target platform. The Art Bible does not assume a single platform — it documents the differences and provides per-platform asset specifications.
|
|
189
|
+
|
|
190
|
+
### Why This Matters
|
|
191
|
+
|
|
192
|
+
Each platform has different compression format requirements (ASTC for mobile, BC7 for PC/console, ETC2 for older Android), memory constraints, and GPU capabilities. An Art Bible that specifies "use DXT5 compression" without acknowledging mobile targets will produce assets that either cannot be loaded on mobile or are decompressed at runtime (doubling memory usage). Platform-specific compression is not optional — it is a correctness requirement.
|
|
193
|
+
|
|
194
|
+
### How to Check
|
|
195
|
+
|
|
196
|
+
1. List all target platforms from the GDD or technical design
|
|
197
|
+
2. For each platform, verify texture compression formats are specified: PC (BC1-BC7), Console (BC1-BC7, platform-specific), Mobile (ASTC, ETC2), Web (basis/KTX2)
|
|
198
|
+
3. Verify audio codec specifications per platform: Vorbis, Opus, ADPCM, platform-native
|
|
199
|
+
4. Check that mesh complexity targets differ per platform where hardware diverges (mobile vs. PC)
|
|
200
|
+
5. Verify that shader feature level targets per platform are documented
|
|
201
|
+
6. Check for a fallback chain: if the preferred format is unsupported, what is the fallback?
|
|
202
|
+
7. Verify that platform-specific build configurations are documented for the asset pipeline
|
|
203
|
+
|
|
204
|
+
```markdown
|
|
205
|
+
## Platform Compression Matrix
|
|
206
|
+
|
|
207
|
+
| Asset Type | PC (DX12/Vulkan) | Console (PS5/XSX) | Mobile (iOS/Android) | Switch |
|
|
208
|
+
|---------------|-------------------|--------------------|----------------------|------------|
|
|
209
|
+
| Diffuse | BC7 | BC7 | ASTC 4x4 | ASTC 4x4 |
|
|
210
|
+
| Normal | BC5 | BC5 | ASTC 6x6 | ASTC 6x6 |
|
|
211
|
+
| ORM Pack | BC7 | BC7 | ASTC 4x4 | ASTC 4x4 |
|
|
212
|
+
| UI | BC7 (sRGB) | BC7 (sRGB) | ASTC 4x4 (sRGB) | ASTC 4x4 |
|
|
213
|
+
| Audio (SFX) | Vorbis Q6 | Platform native | Opus 96kbps | ADPCM |
|
|
214
|
+
| Audio (Music) | Vorbis Q8 | Platform native | Opus 128kbps | Vorbis Q6 |
|
|
215
|
+
| Mesh LOD0 | 100% | 100% | 50% | 60% |
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### What a Finding Looks Like
|
|
219
|
+
|
|
220
|
+
- P0: "Art Bible specifies BC7 texture compression with no mobile platform section. The game targets iOS and Android where BC7 is not natively supported."
|
|
221
|
+
- P1: "Audio is specified as 'WAV in production, compressed for shipping' without specifying the target codec or quality per platform."
|
|
222
|
+
- P2: "Switch platform is listed as a target but has no platform-specific compression or budget section. Switch has significantly lower GPU and memory budgets than PS5/XSX."
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Pass 6: DCC-to-Engine Import Validation
|
|
227
|
+
|
|
228
|
+
### What to Check
|
|
229
|
+
|
|
230
|
+
Export settings from every DCC tool (Maya, Blender, 3ds Max, Substance, ZBrush, Houdini) to the target engine are documented. Coordinate system handedness, scale factors, axis orientation, FBX settings, material channel mappings, and animation export options are all specified.
|
|
231
|
+
|
|
232
|
+
### Why This Matters
|
|
233
|
+
|
|
234
|
+
Every DCC tool uses different conventions. Blender is Z-up right-handed, Unreal is Z-up left-handed, Unity is Y-up left-handed. A model exported from Blender without the correct axis conversion will appear rotated 90 degrees in Unreal. Scale factor mismatches (1 unit = 1cm vs. 1 unit = 1m) produce assets that are 100x too large or too small. Material channel mappings differ between Substance Painter's export presets and engine material inputs. Each mismatch is a bug that wastes time to diagnose.
|
|
235
|
+
|
|
236
|
+
### How to Check
|
|
237
|
+
|
|
238
|
+
1. List all DCC tools used in the pipeline
|
|
239
|
+
2. For each DCC-to-engine path, verify these are documented:
|
|
240
|
+
- Coordinate system and axis orientation
|
|
241
|
+
- Scale factor (units per meter)
|
|
242
|
+
- FBX export version and settings (if FBX is the interchange format)
|
|
243
|
+
- Material/texture channel mapping (Substance channels to engine material inputs)
|
|
244
|
+
- Animation export settings (bake vs. curves, frame rate, root motion handling)
|
|
245
|
+
- Skeletal mesh: bone naming convention, required root bone, max bone count
|
|
246
|
+
3. Verify that import settings in the engine are documented (not just export settings)
|
|
247
|
+
4. Check for automated import rules (engine import settings presets per asset type)
|
|
248
|
+
5. Verify that round-trip workflows are documented (export → import → modify in engine → re-export to DCC if needed)
|
|
249
|
+
|
|
250
|
+
### What a Finding Looks Like
|
|
251
|
+
|
|
252
|
+
- P0: "No DCC-to-engine export documentation exists. Artists must discover correct export settings by trial and error."
|
|
253
|
+
- P1: "Blender export settings are documented but Substance Painter texture channel mappings are not. Artists exporting from Substance must guess which channel maps to which engine input."
|
|
254
|
+
- P1: "Animation export settings do not address root motion. Locomotion animations may have root motion baked in or extracted — the convention is undocumented."
|
|
255
|
+
- P2: "FBX export version is not specified. FBX 2020 and FBX 2014 handle blend shapes differently — inconsistent versions across the team will produce different results."
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Pass 7: Style Guide Enforceability
|
|
260
|
+
|
|
261
|
+
### What to Check
|
|
262
|
+
|
|
263
|
+
Visual style rules are defined in objectively verifiable terms. An artist can determine whether their work complies without subjective judgment. Color palettes have specific hex/RGB values, proportions have ratios, and stylization rules reference concrete visual examples rather than mood descriptions.
|
|
264
|
+
|
|
265
|
+
### Why This Matters
|
|
266
|
+
|
|
267
|
+
A style guide that says "warm, inviting color palette" is not enforceable. Five artists will produce five different interpretations of "warm and inviting." When the art lead must manually review every asset for style compliance, the art lead becomes a bottleneck and a single point of failure. Objectively verifiable style rules enable self-review and automated validation (hue range checks, proportion ratio checks), scaling art production without scaling art direction overhead.
|
|
268
|
+
|
|
269
|
+
### How to Check
|
|
270
|
+
|
|
271
|
+
1. Check color specifications: are palettes defined with specific values (hex, RGB, HSV ranges) or subjective descriptions ("warm tones")?
|
|
272
|
+
2. Verify proportion rules: character head-to-body ratios, prop scale references, environment module dimensions — are they numeric?
|
|
273
|
+
3. Check stylization rules: if the style is "stylized," what are the specific deviations from realism? (Edge softness, saturation boost, proportion exaggeration percentages)
|
|
274
|
+
4. Verify material property ranges: roughness 0.3-0.7, metallic 0 or 1 only (no partial metallic), emissive intensity ranges
|
|
275
|
+
5. Check for visual reference sheets per asset category: characters, props, environments, UI — do they exist?
|
|
276
|
+
6. Verify that "do" and "don't" examples exist for common style violations
|
|
277
|
+
7. Check that the style guide addresses edge cases: what happens when gameplay clarity conflicts with style? (Enemy readability vs. environmental cohesion)
|
|
278
|
+
|
|
279
|
+
### What a Finding Looks Like
|
|
280
|
+
|
|
281
|
+
- P0: "Color palette is described as 'earthy tones with vibrant accents' with no specific values. This is a mood description, not a specification."
|
|
282
|
+
- P1: "Character proportion guide shows a reference image but no numeric ratios. Subtle proportion differences between artists will accumulate into an inconsistent character roster."
|
|
283
|
+
- P2: "Roughness values for wood materials are described as 'fairly rough' — specify a range (0.6-0.8) so artists and material validation tools have a concrete target."
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Common Review Anti-Patterns
|
|
288
|
+
|
|
289
|
+
### 1. Art Bible Without Performance Budget Cross-Reference
|
|
290
|
+
|
|
291
|
+
The Art Bible defines beautiful, detailed asset specifications that were never compared against the game's performance budget. The specs are aspirational quality targets that will produce a game running at 15 FPS. The review must catch this disconnect before production begins.
|
|
292
|
+
|
|
293
|
+
**How to spot it:** The Art Bible contains no references to frame budget, VRAM budget, or draw call limits. Asset specifications are described in terms of quality ("high-quality PBR materials") rather than budgets ("2048×2048 textures, 3 texture sets per character").
|
|
294
|
+
|
|
295
|
+
### 2. Naming Convention for Meshes Only
|
|
296
|
+
|
|
297
|
+
The naming convention section thoroughly covers mesh naming but skips textures, materials, animations, audio, or VFX. In practice, texture naming inconsistency causes more pipeline failures than mesh naming because textures have more variants (diffuse, normal, ORM, emissive, mask) and more naming ambiguity.
|
|
298
|
+
|
|
299
|
+
**How to spot it:** Count the asset types covered by the naming convention. If fewer than 6 categories are covered, significant gaps exist.
|
|
300
|
+
|
|
301
|
+
### 3. Single-Platform Art Bible for Multi-Platform Game
|
|
302
|
+
|
|
303
|
+
The Art Bible specifies one set of asset standards (typically the highest-end target platform) and assumes other platforms will be "optimized later." Platform-specific compression, budget, and quality targets are absent. In practice, "optimize later" means a 6-month crunch to make assets work on lower-end platforms.
|
|
304
|
+
|
|
305
|
+
**How to spot it:** The Art Bible has no platform-specific sections. Texture formats, poly budgets, and shader targets reference only one platform. Words like "we will optimize for mobile later" appear.
|