Я использую ортографическую камеру для рендеринга фрагментов модели (для ее вокселизации). Я визуализирую каждый срез сверху и снизу, чтобы определить, что находится внутри каждого среза.
Модель, которую я представляю, представляет собой простую «Т» форму, построенную из двух кубов. Кубики имеют одинаковые размеры и одинаковую координату Y (высота). Вот рендер этого в Blender:
Я рендеринг этой модели один раз прямо сверху и один раз прямо снизу. Я ожидал, что я получу точно такое же изображение (за исключением зеркального отражения по оси Y). Однако, когда я выполняю рендеринг с использованием цели рендеринга с очень низким разрешением (25x25), положение (в пикселях) «Т» отличается при рендеринге сверху и рендеринге снизу. Смотрите рисунки 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);
}
Основной вопрос Теперь вы видели все проблемы и код, который вы можете догадаться. Мой главный вопрос Как настроить обе камеры таким образом, чтобы каждая из них отображала одно и то же изображение (зеркально отображенное вдоль оси Y)?