Les images rendues de dessus et de dessous à l'aide d'une caméra orthographique ne correspondent pas

8

J'utilise une caméra orthographique pour rendre des tranches d'un modèle (afin de le voxéliser). Je rend chaque tranche à la fois par le haut et par le bas afin de déterminer ce qui se trouve à l'intérieur de chaque tranche.

Le modèle que je rend est une simple forme de «T» construite à partir de deux cubes. Les cubes ont les mêmes dimensions et ont la même coordonnée Y (hauteur). Voici un rendu de celui-ci dans Blender:

Le modèle T

Je rend ce modèle une fois directement d'en haut et une fois directement d'en bas. Je m'attendais à ce que j'obtienne exactement la même image (sauf pour la mise en miroir sur l'axe des y). Cependant, lorsque je effectue un rendu à l'aide d'une cible de rendu à très basse résolution (25x25), la position (en pixels) du «T» est différente lorsqu'elle est rendue par le dessus et non par le dessous. Voir les figures 2 et 3. Les blocs roses ne font pas partie du rendu d'origine mais je les ai ajoutés pour que vous puissiez facilement compter / voir les différences.

Rendu d'en haut D'en haut

Rendu par le bas Par le bas

Cela est probablement dû à ce que j'ai lu sur les coordonnées de pixels et de texels qui pourraient être biaisées en haut à gauche comme vu de la caméra. Étant donné que j'utilise le même vecteur `` haut '' pour les deux caméras, mon biais ne s'affiche que sur l'axe des x. J'ai essayé de changer la position de la caméra et sa vue, ce que je pensais, devrait être d'un demi-pixel. J'ai essayé à la fois de déplacer une seule caméra et de déplacer les deux caméras et, même si je vois un effet, je ne suis pas en mesure d'obtenir une copie parfaite pixel par pixel des deux caméras.

Ici, j'initialise la caméra et calcule ce que je crois être un demi-pixel. boundsDimX et boundsDimZ est un cadre de délimitation légèrement agrandi autour du modèle que j'utilise également comme largeur et hauteur du volume de vue de la caméra orthographique.

Matrix projection = Matrix.CreateOrthographic(boundsDimX, boundsDimZ, 0.5f, sliceHeight + 0.5f);
Vector3 halfPixel = new Vector3(boundsDimX / (float)renderTarget.Width, 0, 
    boundsDimY / (float)renderTarget.Height) * 0.5f;

C'est le code où je règle la position et l'apparence de la caméra

  // Position camera                      
                if (downwards)
                {
                    float cameraHeight = bounds.Max.Y + 0.501f - (sliceHeight * i);
                    Vector3 cameraPosition = new Vector3
                    (
                        boundsCentre.X, // possibly adjust by half a pixel?
                        cameraHeight,
                        boundsCentre.Z
                    );
                    camera.Position = cameraPosition;
                    camera.LookAt = new Vector3(cameraPosition.X, cameraHeight - 1.0f, cameraPosition.Z);

                }
                else
                {
                    float cameraHeight = bounds.Max.Y - 0.501f - (sliceHeight * i);
                    Vector3 cameraPosition = new Vector3
                    (
                        boundsCentre.X,
                        cameraHeight,
                        boundsCentre.Z
                    );
                    camera.Position = cameraPosition;
                    camera.LookAt = new Vector3(cameraPosition.X, cameraHeight + 1.0f, cameraPosition.Z);
                }

Question principale Maintenant que vous avez vu tous les problèmes et le code, vous pouvez le deviner. Ma principale question est. Comment aligner les deux caméras pour qu'elles rendent chacune exactement la même image (en miroir le long de l'axe Y)?

Roy T.
la source
Jusqu'à présent, la solution semble être de déplacer l'appareil photo qui prend une photo d'en bas exactement d'un pixel vers la gauche (-x). Cependant, je ne peux pas expliquer pourquoi et ne peux donc pas garantir que cela fonctionnera pour tout ce que je lui lance. Des idées?
Roy T.
Avez-vous pensé à tout garder en place, mais à mettre à l'échelle le Y du modèle (cubes) par -1? Ensuite, vous auriez tout de même, sauf pour les objets retournés. PS Bien sûr, vous devrez également -1 les faces normales et polygones.
Kromster
C'est en fait une idée plutôt cool
Roy T.
Depuis que vous approuvez, je l'ai posté comme réponse. Dites-moi si cela fonctionne pour vous!
Kromster

Réponses:

2

Il s'agit d'un point de vue différent sur le problème présenté, ce qui pourrait aider à éviter complètement les problèmes de différences de tramage

Avez-vous envisagé de tout garder en place, mais de mettre à l'échelle le Y du modèle (cubes) de «-1» le long du plan de coupe? Ensuite, vous aurez tout exactement la même chose, sauf pour les objets retournés à l'envers - ce qui signifie que vous obtiendrez leurs côtés vers le bas pour votre objectif. Bien sûr, vous devrez également «-1» les normales et les polygones face à des directions.

Kromster
la source
Bien que votre réponse n'explique pas pourquoi ma méthode n'a pas fonctionné. (Et c'est là que la prime était destinée) Je n'accorderai pas la prime pour le moment. Mais parce que c'est une bonne suggestion, la prime automatique de 50% devrait vous être accordée en une journée, et je pense que vous le méritez :).
Roy T.
@RoyT .: Cela semble juste. Cependant, vous devez toujours nous dire si la solution suggérée a résolu votre problème - afin que les autres personnes confrontées au même problème sachent comment le gérer.
Kromster