Le entità sono occluse dal terreno su cui poggiano: profondità dello sprite presa al piede anziché alla testa #275
Labels
No labels
alpha:wave-0
alpha:wave-1
alpha:wave-2
alpha:wave-3
area:assets
area:combat
area:ecology
area:infra
area:render
area:scripting
area:ui
area:world
enhancement
epic
migration
post-alpha
roadmap
tech-debt
type:bug
type:chore
type:design
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
marco/IsoMmo#275
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Un'entità in piedi sul terreno 3D viene coperta dal terreno stesso su un versante rivolto verso la camera. Segnalato dal proprietario: "ti segnalo un problema sull'altro versante il personaggio finisce sotto il mesh", riprodotto a (7516,4225), quota 227 — del corpo restano due pixel.
Precede il lavoro sulla copertura del terreno: i file che governano la profondità (
WorldRenderer.cs,IsoCamera.cs,TerrainMesh3D.cs,ground_blend.fx) sono invariati rispetto allo stato pre-#274.Causa
La base della camera dà
toward = (0.3233, 0.3233, 0.8892), quindiDepth = −(0.3233·(x+y) + 0.8892·z): la quota pesa 2,75 volte la posizione planare. Il terreno che appare sopra l'entità sullo schermo (x+y minore, quindi più lontano in pianta) può perciò essere più vicino in profondità, se è abbastanza alto.Lo sprite perde perché è un cartellone a profondità costante. Un personaggio in piedi è una colonna verticale e in questa base la testa è più vicina alla camera dei piedi; disegnando l'intera carta alla profondità del piede, la testa viene testata come se fosse a terra.
Correzione
Calcolare il
layerDepthal vertice della carta anziché al piede:z + altezzaPixel / ZScale, con l'altezza presa dallo sprite stesso (AnchorYper i mobili,texture.Heightper le statiche, che hanno origine(w/2, h)). La grandezza è derivata, non tarata — si adatta da sola a un ratto e a una sequoia.Costo accettato: le gambe vengono testate alla quota della testa, quindi un dislivello che dovrebbe nasconderle non le nasconde. Sbagliare in questa direzione è molto meno visibile di un personaggio che sparisce dentro la collina.
Un epsilon tarato è stato scartato: non ha un valore derivabile — troppo piccolo lascia il bug su pendenze più ripide, troppo grande spegne l'occlusione delle rupi.
Invariants Check
Camminata sul
## Design checklist, nessun✗.DisplayZAtresta display-only e la walkability resta sul rawGroundZAt· GM authorization N/A nessun comando · Identity model N/A · Protocol versioned N/A nessuna forma wire toccata,ProtocolVersion.Currentinvariata · String catalog N/A nessun testo · Single-threaded sim N/A client ·World.csHARD GATE N/A server-side ·ScreenHARD GATE ✓ il calcolo sta inIsoCamerae nel call-site diWorldRenderer;GameScreennon riceve nulla · Client engine-independence ✓ la funzione va inClient.Core/IsoCamera.cs, testabile senza MonoGame · Gameplay/Networking N/A · Act on the instance ✓ l'altezza viene dallo sprite, non da una tabella per id · Extend by type ✓ un solo call-site, nessuno switch su tipo · Typed content-def N/A · Server-paced actions N/A · Persistence (GameServer) N/A derivato ogni frame · Persistence (Auth) N/A · Process separation N/A client-only · Typed options ✓ nessun tunable: l'altezza è misurata, non configurata · Broadcasts / AoI N/A · Multi-platform ✓ sola aritmetica float · Assets required ✓ nessun placeholder; rende visibile arte del pack che oggi sparisce · Asset naming N/A · ModernUO ✓ non ha equivalente — il suo client 2-D ordina per foot-Y senza depth buffer, quindi non può occludere col terreno; divergiamo perché il nostro terreno è geometria 3D reale · Docs & DoD ✓docs/architecture.mdaggiornata nella stessa modifica.Piano di verifica
Client.Core, senza GPU: la profondità di testa è sempre ≤ quella di piede; una carta altaHguadagna esattamenteH·0.8892/(2·DepthWorldExtent); aH = 0coincide col comportamento attuale./tp 7516 4225, prima/dopo, più un punto dove una rupe deve ancora occludere.Definition of Done
Oltre alla DoD base (test verdi, soluzione compilante, zero warning) e al requisito multi-piattaforma:
Follow-up
La risposta fisicamente esatta è una rampa di profondità lungo la carta (piede lontano → testa vicina), che
SpriteBatch.layerDepthnon può esprimere: richiede uno shader per il passaggio sprite. Da aprire a parte.