2014-12-05 7 views
11

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:

  1. 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.

  2. Fare tutto in un Object3D con .rotate.x = Math.PI. Questo è più promettente, ma l'asse z non è più coerente con il concetto HTML di z-index. Eppure, questo è quello che sto usando ora.

  3. In HTML, non utilizzare top, utilizzare bottom. 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 il imageHeight deve essere costantemente aggiornato, il che costituisce un ulteriore onere.

Qualcuno ha inventato qualcosa di meglio? Forse una biblioteca per aiutare con questo?

+0

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

+0

@beiller: Non vedo come questo risolva il problema dell'asse y capovolto, che è la mia domanda. :-/ Mi sto perdendo qualcosa? – mhelvens

+0

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

risposta

1

Ti suggerisco di utilizzare l'attributo SVG Global Transform, se pubblichi un esempio del tuo codice, potrei modificare la risposta e pubblicare l'esempio qui, forse un JSfiddle.

Fondamentalmente è necessario aggiungere la trasformazione al tuo SVG, nel tuo caso per cambiare la direzione dell'asse y, puoi fare una "scala (1, -1)".

Vedere la documentazione W3 con esempi nel seguente link: http://www.w3.org/TR/SVG/coords.html#SVGGlobalTransformAttribute

Il primo uso comune di questo attributo:

La maggior parte ProjectedCRS hanno la direzione nord rappresentato da valori positivi del secondo asse e viceversa SVG ha un sistema di coordinate Y-down . Ecco perché, per seguire il solito modo di rappresentare una mappa con il nord nella parte superiore, si consiglia per questo tipo di ProjectedCRS di utilizzare l'attributo globale 'svg: transform' con una scala '(1, - 1) 'valore come nel terzo esempio di seguito.

Anche lì ci sono degli esempi, spero che risolva il tuo problema. :)

+0

Qualsiasi testo sarà capovolto. –

+0

Questa è la cosa n.3.3 Ho provato (vedi domanda originale). Ha un numero di problemi. E @RobertLongson ha ragione: le cose sarebbero capovolte --- non solo testo, ma ogni elemento che ho messo dentro. Tuttavia, temo che questo possa essere il minore dei mali. Forse se esiste un modo per correggere automaticamente questo, cioè ridimensionare localmente ogni elemento figlio? – mhelvens

+0

Ciao, sì infatti ogni cosa sarà capovolta, ho pensato nel tuo numero 3 che non hai provato quello Globale. Ho guardato anche su internet, ma non ho trovato nessun altro modo per fare ciò che vuoi, purtroppo penso che per ora non ci sia una soluzione facile, scusa e buona visione. – Jacobi

Problemi correlati