Снимки, сделанные сверху и снизу с помощью орфографической камеры, не совпадают

8

Я использую ортографическую камеру для рендеринга фрагментов модели (для ее вокселизации). Я визуализирую каждый срез сверху и снизу, чтобы определить, что находится внутри каждого среза.

Модель, которую я представляю, представляет собой простую «Т» форму, построенную из двух кубов. Кубики имеют одинаковые размеры и одинаковую координату 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)?

Рой Т.
источник
Похоже, что решение до сих пор состоит в том, чтобы переместить камеру, которая делает снимок снизу ровно на один пиксель влево (-x). Однако я не могу объяснить, почему, и, следовательно, не могу гарантировать, что это будет работать для всего, что я бросаю в него. Любые идеи?
Рой Т.
Вы думали о том, чтобы сохранить все на месте, но масштабировать Y модели (кубики) на -1? Тогда у вас было бы все то же самое, за исключением переворачиваемых объектов. PS Конечно, вам также понадобится -1 нормали и полигоны.
Кромстер
Это на самом деле довольно крутая идея
Рой Т.
Так как вы одобряете, я опубликовал это как ответ. Скажите, работает ли он у вас!
Кромстер

Ответы:

2

Это другой взгляд на представленную проблему, который может помочь избежать проблем различий при растеризации.

Рассматривали ли вы сохранение всего на месте, но масштабирование Y модели (кубов) на «-1» вдоль плоскости сечения? Тогда у вас будет все точно так же, за исключением объектов, перевернутых вверх дном - это означает, что вы получите их обратные стороны для вашей цели. Конечно, вам нужно будет также указать -1, чтобы нормали и полигоны были направлены в разные стороны.

Kromster
источник
Хотя ваш ответ не объясняет, почему мой метод не сработал. (И для этого и была награда) Я не буду награждать награду прямо сейчас. Но поскольку это хорошее предложение, автоматическая награда в размере 50% должна быть присуждена вам через день, и я думаю, что вы это заслужили :).
Рой Т.
@RoyT .: звучит честно. Однако вы все равно должны сообщить нам, если предлагаемое решение действительно решило вашу проблему, чтобы другие, кто сталкивается с той же проблемой, знали, как ее решить.
Кромстер