Creazione di una mesh curva all'interno della sfera in base alle coordinate dell'immagine della trama


8

In Blender, ho creato una sfera con una trama panoramica all'interno. Ho anche creato manualmente una mesh piana (curva per adattarsi alle dimensioni della sfera) che si trova sulla parete interna dove posso disegnare una trama diversa.

È fantastico, ma voglio davvero ridurre il lavoro manuale e svolgere un po 'di questo lavoro in uno script - come avere una variabile per l'immagine panoramica e le coordinate dell'area nella fotografia che voglio sostituire con una nuova maglia.

La parte più difficile di fare questo sarà creare una maglia curva nel codice che può stare sulla parete interna di una sfera.

Qualcuno può indicarmi la giusta direzione?


Puoi approfondire cosa vorresti succedere con meno sforzo? Spiega il tuo metodo attuale e il tuo risultato finale in modo più dettagliato?
Seth Battin,

Inoltre, perché queste due mesh devono interagire? Potresti semplicemente specificare le dimensioni e le coordinate per la mesh interna e disegnarla dove mai deve essere? Perché deve essere specificato in termini di sfera esterna?
Seth Battin,

Mi piacerebbe poter mappare un'immagine equirettangolare all'interno di una sfera e creare cornici rettangolari (nell'immagine) contenenti immagini dinamiche. Tuttavia, non voglio ricreare tutto da zero ogni volta che voglio introdurre una nuova immagine equirettangolare .... Per semplificare, vorrei prendere l'immagine appiattita e usare qualcosa come Photoshop per trovare coordinate xy di una cornice e hanno una nuova mesh che si restringe avvolta sulla sfera che corrisponde a quelle coordinate 2d.
user5025

Sei consapevole del fatto che Unity supporta gli skybox? Sembra che sia quello che stai cercando di ottenere.
MichaelHouse

Sono a conoscenza di skybox, ma purtroppo non risolve il mio problema. Ho bisogno di un modo per creare una maglia curva (che si adatterà perfettamente all'interno di una sfera), basata sulle coordinate di una cornice in un'immagine equirettangolare.
user5025

Risposte:


0

Ciò che stai cercando di ottenere sembra molto legato a questo:

Analogico di coordinate sferiche in n-dimensioni

nel tuo caso in 2 dimensioni, basta usare questa formula per mappare i vertici del rettangolo che hai (lascia sperare che sia suddiviso) sulla tua sfera (non dimenticare di moltiplicare per la metà del diametro da qualche parte. Solo i matematici vivono su una sfera unitaria tutti gli altri le persone decenti usano i diametri ...)

EDIT: Dato che tutto ciò è un po 'vago, fornisco alcuni approfondimenti Cosa serve da questa formula per essere usato:

x = r*sinθ*cosφ
y = r*sinθ*sinφ
z = r*cosθ

θ e φ essendo le coordinate sferiche che stai cercando (latitudine e longitudine) per ottenerlo prendi le coordinate x / y dei punti su una parte dell'immagine panoramica in quanto tale:

public Void getPointPosOnSphere(float Longitude,float Latitude,float r) {
    x = r*Mathf.sin(Longitude)*Mathf.cos(Latitude);
    y = r*Mathf.sin(Longitude)*Mathf.sin(Latitude);
    z = r*Mathf.cos(Longitude);
    return new Vector3(x,y,z);
}

//here you could have a for loop iterating through points of your rectangle for each
//point you'd have associated a map coordinate :
Vector3 pointSpacePos = getPointPosOnSphere(pointCoordY,pointCoordX,HalfDiamater);
//End of the for loop

quindi faresti mappare il tuo quad su una sfera basata sulla sua posizione xy su un sistema di coordinate 2D tradotto nella posizione 3D sullo spazio secondo la mappatura delle sfere.

EDIT: Ho appena avuto un'idea, per andare oltre potresti incapsulare le coordinate del piano sulla sfera usando i valori UV come tali:

for(int i = 0;i < vertices.Length; i++) {
    vertices[i] = getPointPosOnSphere(UV[i].y,UV[i].x,HalfDiamater);
}

Lì puoi gestire la posizione del quad sul tuo software 3D preferito (o anche tramite il codice attraverso l'unità) semplicemente assegnando valori UV (se da 0 a 1 su entrambi gli assi, il quad verrà avvolto attorno alla sfera)

ATTENZIONE: L'uso dei raggi UV richiede la conversione da radianti a gradi. (come UV è 0 a 1)


0

La risposta di Géry Arduino sopra mi ha indicato la giusta direzione, ma vorrei aggiungere un paio di cose qui.

1) Il seguito non funzionerà in unità a causa delle differenze del sistema di coordinate

    return new Vector3(x,y,z); 

cambialo in

    return new Vector3(x,z,y);

2) Non ero chiaro sull'intervallo di input dei valori long e lat definiti nella firma del metodo

     public Void getPointPosOnSphere(float Longitude,float Latitude,float r)

Entrambi i valori di Longitudine e Latitudine dovrebbero essere in radianti. La loro gamma è la seguente

     Longitude: 0°-180° (0 - π)
     Latitude: 0°-360° (0 - 2π)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.