Création d'un maillage incurvé à l'intérieur de la sphère en fonction des coordonnées de l'image de texture


8

Dans Blender, j'ai créé une sphère avec une texture panoramique à l'intérieur. J'ai également créé manuellement un maillage plan (incurvé pour correspondre à la taille de la sphère) qui se trouve sur le mur intérieur où je peux dessiner une texture différente.

C'est génial, mais je veux vraiment réduire le travail manuel et faire une partie de ce travail dans un script - comme avoir une variable pour l'image panoramique et les coordonnées de la zone de la photo que je veux remplacer par une nouvelle engrener.

La partie la plus difficile à faire sera de créer un maillage incurvé dans le code qui peut s'asseoir sur la paroi intérieure d'une sphère.

Est-ce que quelqu'un peut-il me montrer la bonne direction?


Pouvez-vous expliquer ce que vous aimeriez faire avec moins d'efforts? Expliquez votre méthode actuelle et votre résultat final plus en détail?
Seth Battin

Aussi, pourquoi ces deux mailles doivent-elles interagir? Pourriez-vous simplement spécifier la taille et les coordonnées du maillage interne et le dessiner là où il doit être? Pourquoi doit-il être spécifié en termes de sphère externe?
Seth Battin

J'aimerais pouvoir cartographier une image équirectangulaire à l'intérieur d'une sphère et faire en sorte que les cadres rectangulaires (dans l'image) contiennent des images dynamiques. Cependant, je ne veux pas tout recréer à partir de zéro à chaque fois que je veux introduire une nouvelle image équirectangulaire .... Pour simplifier, je voudrais prendre l'image aplatie et utiliser quelque chose comme Photoshop pour trouver le coordonnées xy d'un cadre d'image, et ont un nouveau maillage qui rétrécit enveloppé à la sphère qui correspond à ces coordonnées 2D.
user5025

Vous savez que Unity prend en charge les skyboxes? Il semble que c'est ce que vous essayez d'atteindre.
MichaelHouse

Je connais les skyboxes, mais cela ne résout malheureusement pas mon problème. J'ai besoin d'un moyen de créer un maillage incurvé (qui reposera parfaitement à l'intérieur d'une sphère), basé sur les coordonnées d'un cadre photo dans une image équirectangulaire.
user5025

Réponses:


0

Ce que vous essayez de réaliser semble très lié à cela:

Analogique des coordonnées sphériques en n dimensions

dans votre cas en 2 dimensions, alors vous utilisez simplement cette formule pour cartographier les sommets du rectangle que vous avez (espérons qu'il est subdivisé) sur votre sphère (n'oubliez pas de multiplier par le demi-diamètre quelque part. Seuls les mathématiciens vivent sur une sphère unitaire tous les autres les gens décents utilisent des diamètres ...)

EDIT: Comme tout cela est un peu vague, je donne quelques informations supplémentaires Ce dont vous avez besoin pour utiliser cette formule:

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

θ et φ étant les coordonnées sphériques que vous recherchez (Latitude et Longitude) pour l'obtenir, vous prenez les coordonnées x / y des points sur une partie de l'image panoramique en tant que telle:

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

vous obtiendrez alors votre quad sur une sphère basée sur sa position xy sur un système de coordonnées 2D traduite en position 3D sur l'espace selon la cartographie de la sphère.

EDIT: Je viens de vous faire une idée, pour aller plus loin, vous pouvez encapsuler les coordonnées du plan sur la sphère en utilisant les valeurs UV comme telles:

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

Là, vous pouvez gérer la position du quad sur votre logiciel 3D préféré (ou même par code à travers l'unité) simplement en attribuant des valeurs UV (si de 0 à 1 sur les deux axes, le quad sera enroulé tout autour de la sphère)

AVERTISSEMENT: Pour utiliser des UV, vous devrez effectuer une conversion de radians en degrés. (comme UV est de 0 à 1)


0

La réponse de Géry Arduino ci-dessus m'a orienté dans la bonne direction, mais je voudrais ajouter quelques choses ici.

1) Le suivi ne fonctionnera pas dans l'unité en raison des différences du système de coordonnées

    return new Vector3(x,y,z); 

changer cela en

    return new Vector3(x,z,y);

2) Je n'étais pas clair sur la plage d'entrée des valeurs longues et latentes définies dans la signature de la méthode

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

Les valeurs de longitude et de latitude doivent être exprimées en radians. Leur gamme est la suivante

     Longitude: 0°-180° (0 - π)
     Latitude: 0°-360° (0 - 2π)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.