Sto unendo il contenuto 3D con Three.js con contenuto HTML e SVG. Three.js CSSLoader fa un ottimo lavoro sincronizzando il posizionamento di contenuti HTML e SVG nel mondo 3D.Come sincronizzare i sistemi di coordinate Three.js e HTML/SVG (in particolare con l'asse y)?
Ma i sistemi di coordinate SVG/HTML sono "mancini", mentre il sistema di coordinate Three.js è "destrorso". Ciò significa fondamentalmente che i loro assi y sono invertiti. In SVG/HTML, y
/top
si attiva mentre si scende lo schermo e Three.js utilizza la convenzione matematica più standard di che scende mentre si scende lo schermo.
Devo continuamente convertire da uno all'altro, che è piuttosto incline agli errori. So di non essere il primo a trovarlo (ad esempio, look here). Qualcuno ha trovato una soluzione generale? Ecco quello che ho provato:
fare tutto quanto in un
Object3D
con.scale.y = -1
. Come puoi sospettare, questo risulta essere un disastro. Trasforma tutto dentro e fuori, e non provi nemmeno a mettere la tua macchina lì dentro.Fare tutto in un
Object3D
con.rotate.x = Math.PI
. Questo è più promettente, ma l'assez
non è più coerente con il concetto HTML di z-index. Eppure, questo è quello che sto usando ora.In HTML, non utilizzare
top
, utilizzarebottom
. In SVG, fare tutto all'interno di un<g transform="scale(1, -1)">
all'interno di un<g transform="translate(0, imageHeight)">
. Tuttavia, ritengo che ciò potrebbe creare confusione per gli sviluppatori e ilimageHeight
deve essere costantemente aggiornato, il che costituisce un ulteriore onere.
Qualcuno ha inventato qualcosa di meglio? Forse una biblioteca per aiutare con questo?
Penso che la soluzione sia creare un sistema di coordinate del mondo per il tuo SVG/HTML usando la convenzione THREE.js.Quindi il centro dello schermo (chiamato viewport) è 0,0,0. Gli oggetti in SVG/HTML vengono trasformati da viewport.center (0,0,0) + viewport.halfWidth. – beiller
@beiller: Non vedo come questo risolva il problema dell'asse y capovolto, che è la mia domanda. :-/ Mi sto perdendo qualcosa? – mhelvens
Forse lo sei, o forse non è fattibile dalla tua situazione. Ad esempio: hai uno sprite CSS alle coordinate del mondo (2,0,0). Per disegnare lo sprite, si utilizzerà la seguente formula: pos.x + viewportCenter.x + viewportHalfWidth.x - object.halfWidth.x. Il che significa assumendo (0,0,0) viewport e 10x10 sprite e dimensioni 800x600, si disegna x a 397px a sinistra della finestra. – beiller