Текстура растягивается по граням кубоида в Open Inventor
Я пытаюсь написать небольшой скрипт для наложения текстуры на прямоугольные кубоиды. Для этого я пробегаю сценограф и, где бы я ни находил узлы SoIndexedFaceSet, перед этим я вставляю узел SoTexture2. Я поместил свой файл изображения в узел SoTexture2. Проблема, с которой я сталкиваюсь, заключается в том, что текстура правильно применяется к 2 граням (скажем, face1 и face2), в плоскости YZ, но для остальных 4 плоскостей она просто растягивает текстуру на границах двух граней (1 и 2).
Это выглядит примерно так.
Фронт - это то, как он должен выглядеть, но, как вы можете видеть, на двух других гранях он просто экстраполирует значения углов лицевой грани. Есть идеи, почему это происходит, и есть ли способ избежать этого?
1 ответ
Да, предполагая, что вы не указали координаты текстуры для вашего SoIndexedFaceSet, это именно ожидаемое поведение.
Если Open Inventor увидит, что вы применили изображение текстуры к геометрии и не указали координаты текстуры, он автоматически вычислит некоторые координаты текстуры. Конечно, невозможно угадать, как вы хотели применить текстуру. Таким образом, он вычисляет ограничивающую рамку, а затем вычисляет координаты текстуры, которые растягивают текстуру по наибольшему экстенту геометрии (XY, YZ или XZ). Если геометрия является кубоидом, вы можете видеть эффект ясно, как на вашем изображении. Такое поведение может быть полезно, особенно в качестве быстрого приближения.
То, что вам нужно, чтобы заставить эту работу работать так, как вы хотите, - это явное назначение координат текстуры геометрии, чтобы текстура отображалась отдельно для каждой грани. В Open Inventor вы можете по-прежнему делить вершины между гранями, потому что вам разрешено указывать разные индексы вершин и индексы текстурных координат (конечно, это более удобно для приложения, поскольку OpenGL не поддерживает это, и Open Inventor должен повторно перемешать данные внутри). Если вы примените одну и ту же текстуру к узлу SoCube, вы увидите, что текстура отображается отдельно на каждую грань, как и ожидалось. Это потому, что SoCube определяет координаты текстуры для каждого лица.