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:
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
Rendu 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)?
Réponses:
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.
la source