Personalize dados e visuais na Dice View v3
Crie atlas e um tema 3D, aplique skin e partículas e salve um visual reutilizável na v3 física.
Este artigo descreve a prévia V3 alpha, que usa apenas física e ainda não está publicada no npm. V2 ↗ Licenças ↗
Este guia cria um tema obsidian para os dados físicos da Dice View 3.0.0-alpha.0. Você vai alterar os mapas de face, publicar um theme.config.json, conferir os resultados no d20 e no d2 e, depois, aplicar uma skin e efeitos sem modificar os atlas. A v3 usa somente física; comece pela instalação desta revisão se ainda não tiver o viewer funcionando. Confira os termos da v3 antes de distribuir sua integração.
1. Publique os arquivos e copie os atlas
Copie node_modules/@erpg/dice3dview/dist/assets/dice-box/ para public/assets/dice-box/. Preserve themes/default/: ele contém o modelo, as texturas e a moeda usados como base. A v3 não precisa da pasta havok/ da v2. Crie themes/obsidian/ e copie para lá diffuse-light.webp, diffuse-dark.webp e normal.webp do tema padrão:
public/assets/dice-box/themes/
├── default/
│ ├── default.json
│ ├── diffuse-light.webp
│ ├── diffuse-dark.webp
│ ├── normal.webp
│ └── glyph-orientation.json
└── obsidian/
├── theme.config.json
├── diffuse-light.webp
├── diffuse-dark.webp
└── normal.webp
Abra /assets/dice-box/themes/default/theme.config.json no navegador. Se a URL falhar, corrija a publicação dos assets antes de editar o tema. O assetPath padrão é /assets/dice-box/; você pode alterá-lo no construtor. A galeria de texturas mostra os atlas originais da V3 lado a lado e oferece a amostra especular histórica da V2.
2. Edite os mapas sem trocar as faces
Os atlas do modelo padrão usam uma tela de 1024 × 1024 pixels. Redesenhe os números em cada ilha UV, preservando posição, escala e transparência. diffuse-light.webp contém glifos claros para corpos escuros; diffuse-dark.webp, glifos escuros para corpos claros. O viewer escolhe a variante conforme o brilho de themeColor ou da skin. A imagem não é uma grade ordenada por resultado: mover o número para outra ilha pode exibir uma face diferente do value recebido.
| Mapa | Função | Quando incluir |
|---|---|---|
diffuse-light.webp e diffuse-dark.webp |
Arte das faces para cores de corpo diferentes | Ao trocar números ou símbolos |
normal.webp |
Relevo no mesmo layout UV | Se o novo desenho precisar de relevo; atualize-o junto dos glifos |
specularTexture |
Mapa opcional que modula o reflexo | Se criar uma imagem especular própria; o tema padrão da v3 não a fornece |
Use material.type: "color" para manter o corpo recolorível por themeColor e permitir a skin da v3. "standard" usa a arte de cor do próprio atlas e não recebe skin. Veja o contrato completo de materiais e caminhos.
3. Escreva o manifesto
Salve este JSON como themes/obsidian/theme.config.json. Sem meshFile, a v3 usa themes/default/default.json; por isso os mapas precisam manter as mesmas ilhas UV. Os caminhos das texturas partem da pasta obsidian/.
{
"name": "Obsidian",
"systemName": "obsidian",
"material": {
"type": "color",
"diffuseTexture": {
"light": "diffuse-light.webp",
"dark": "diffuse-dark.webp"
},
"diffuseLevel": 1,
"bumpTexture": "normal.webp",
"bumpLevel": 0.5
},
"diceAvailable": ["d2", "d4", "d6", "d8", "d10", "d12", "d20", "d100"],
"coin": {
"front": { "value": 1, "texture": "../default/coin-1.svg" },
"back": { "value": 2, "texture": "../default/coin-2.svg" },
"colorize": true,
"diameter": 1,
"thickness": 0.12
}
}
material e diceAvailable são obrigatórios. A moeda d2 é procedural: frente vale 1, verso vale 2, e a arte não muda esses valores. Se criar uma moeda colorida própria, troque os SVGs e use colorize: false; edgeColor define a borda. Para glifos cuja orientação precisa ser controlada, a v3 aceita faceAtlas.orientation apontando para um JSON de direções por face. O arquivo do tema padrão só pode ser reutilizado se você mantiver seu layout e a orientação da arte. Veja a estrutura de temas e a orientação.
Confira por HTTP o manifesto e cada imagem referenciada. Se criar seu próprio modelo, forneça malha visual dN, collider dN_collider e colliderFaceMap.dN coerentes para cada poliedro. Na v3, o collider também determina o corpo simulado; teste todas as faces antes de publicar.
4. Confira o tema em uma rolagem física
import { DiceResultViewer } from '@erpg/dice3dview'
import '@erpg/dice3dview/style.css'
const viewer = new DiceResultViewer({
container: '#dice-stage',
assetPath: '/assets/dice-box/',
theme: 'obsidian',
themeColor: '#251c34'
})
await viewer.display({
id: 'teste-obsidian',
dice: [
{ id: 'd20', sides: 20, value: 18 },
{ id: 'moeda', sides: 2, value: 1 }
]
})
O viewer apresenta os valores já definidos pela aplicação. Repita o teste para os formatos declarados em diceAvailable, compare a face visível com value e experimente uma cor clara para conferir o atlas dark. Se mudar um manifesto já carregado com o mesmo nome, descarte a instância com viewer.dispose() e crie outra para renovar caches de materiais e modelo.
5. Aplique uma skin sobre a cor
A skin da v3 é uma imagem projetada no corpo por mapeamento triplanar. Ela independe das ilhas UV; os números do atlas color permanecem sobre a imagem. A alteração passa a valer na próxima apresentação:
await viewer.updateOptions({
themeColor: '#284b9b',
skin: {
texture: '/textures/marble.webp',
blend: 'multiply',
opacity: 0.85,
scale: 1.3,
labels: 'auto'
}
})
await viewer.display({
id: 'teste-marmore',
dice: [{ id: 'd6', sides: 6, value: 4 }]
})
blend aceita normal, multiply, screen e overlay; opacity vai de 0 a 1, scale de 0.05 a 20, e labels aceita auto, light ou dark. A textura aceita URL HTTP(S), data: e blob:. Em outra origem, habilite CORS. Para voltar à superfície do tema, chame await viewer.updateOptions({ skin: null }). Consulte a API de skin.
6. Adicione partículas e brilho
Partículas e brilho podem mudar imediatamente, inclusive com dados já visíveis. Comece com um preset e ajuste os momentos da rolagem:
await viewer.updateOptions({
particles: {
preset: 'sparkle',
intensity: 1.2,
color: '#ea5b93',
moments: { ground: false }
},
glow: { color: '#ea5b93', intensity: 0.8, light: true, pulse: false }
})
Também é possível criar um emissor próprio, sem preset. Este exemplo limita o impacto a d20 cujo resultado seja o maior valor:
await viewer.updateOptions({
particles: {
effect: {
impact: {
amount: 24,
life: [0.2, 0.6],
size: [0.08, 0.2],
speed: [1, 3],
colors: ['#ffffff', '#ea5b93aa', '#ea5b9300'],
when: { sides: [20], faces: 'max' }
}
}
}
})
particles: null e glow: null desligam os respectivos efeitos. Veja presets, momentos, condições e limites na API v3.
7. Salve o visual separadamente do tema
O estúdio de skins e temas oferece as 18 superfícies do workshop original (mármore, madeira, pedra e outras), 15 visuais prontos e edição de cada emissor de partículas. Você pode ajustar rastro, impacto, colisão, repouso, aura, explosão e crítico, inclusive força, velocidade, faces, lados, chance e intervalo de ativação. A prévia usa a V3 real; exporte e importe o dice-look.json para continuar o trabalho.
Um arquivo .dice-look.json reúne cor, skin, partículas e brilho. Ele não inclui o theme.config.json, o modelo nem os atlas: continue distribuindo a pasta obsidian/ e escolhendo theme: 'obsidian' no viewer.
import { createDiceLook } from '@erpg/dice3dview'
const look = createDiceLook({
name: 'Obsidian Marble',
themeColor: '#284b9b',
skin: { texture: '/textures/marble.webp', blend: 'multiply', opacity: 0.85 },
particles: { preset: 'sparkle', intensity: 1.2 },
glow: { color: '#ea5b93', intensity: 0.8 }
})
const json = JSON.stringify(look, null, 2) // salve como obsidian-marble.dice-look.json
await viewer.applyLook(look)
createDiceLook() acrescenta format: "dice3dview-look" e version: 1 e valida os campos. applyLook() valida o arquivo antes de aplicá-lo. Uma URL de skin ainda precisa estar disponível quando você abrir o visual em outro lugar; use uma URL pública ou data: para um arquivo independente. Veja o contrato do visual.
Compatibilidade com a v2
Os manifests, modelos e mapas da v2 mantêm seu formato na v3. Faça uma rolagem física de cada formato ao migrar, sobretudo se o tema traz um collider próprio. faceAtlas.orientation é um recurso opcional da v3; skins, partículas, brilho e arquivos de visual são recursos desta integração v3 e devem ser configurados no código que carrega a v3. A v2 publicada no npm continua documentada separadamente, assim como a migração v2 → v3. As versões acompanham licenças diferentes.