使用正交相机从上方和下方呈现的图片不匹配

我正在使用正交相机来渲染模型的切片(为了体素化)。 我从上面和下面渲染每个切片,以确定每个切片内部是什么。

我渲染的模型是由两个立方体构成的简单“T”形状。 立方体具有相同的尺寸并具有相同的Y(高度)坐标。 这是在Blender中的一个渲染:

T型号

我直接从上面和从下面直接渲染一次这个模型。 我的期望是,我会得到完全相同的图像(除了镜像Y轴)。 然而,当我使用非常低分辨率渲染目标(25×25)渲染时,“T”的位置(以像素为单位)在从上方渲染时是不同的,而不是从下方渲染。 请参阅图2和3.粉红色块不是原始渲染的一部分,但是我已经添加了它们,以便您可以轻松计数/查看差异。

从上面呈现 从上面

从下面呈现 从下面

这可能是由于我读到的像素和纹理坐标可能偏向左上角,从相机看。 由于我使用相同的“向上”向量为我的相机,我的偏见只显示在X轴上。 我试图改变摄像头的位置,我认为它应该是半像素。 我已经尝试过移动一台摄像机,同时移动两台摄像机,而当我看到一些效果时,我无法从两台摄像机获得逐像素的完美副本。

在这里,我初始化相机,并计算,我相信是半像素。 boundsDimX和boundsDimZ是模型周围稍微放大的边界框,我也用它作为正交相机的视图体积的宽度和高度。

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; 

这是我设置相机位置和相机的代码

  // 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); } 

主要问题现在你已经看到了所有可以猜到的问题和代码。 我的主要问题是。 我如何alignment两个相机,使它们都呈现完全相同的图像 (沿着Y轴镜像)?

对于所提出的问题,这是一个不同的观点,这可能有助于完全避免光栅化差异问题

你是否考虑把所有东西都保留在原位,但是在剖面上将模型的Y(立方体)按比例缩放“-1”? 那么除了倒置的物体之外,你将拥有完全一样的东西 – 这意味着你会为了你的目标而陷入低谷。 当然,你也需要“-1”法线和面向方向的多边形。