회전에 대한 모양이 변경되지 않고 OpenSceneGraph에서 확대/축소되지 않도록 사각형 개체를 표시하려고합니다. 나는 osg::AutoTransform
이 나를 위해 일해야한다는 것을 발견했다.스크린에 자동 회전 된 오브젝트를 픽셀 그리드로 정렬하는 방법은 무엇입니까?
그러나 다음 코드를 사용하면 기본값이 LINEAR
이 아닌 NEAREST
으로 텍스처 필터를 설정해도 깨진 결과가 나타납니다. LINEAR
을 사용하면 결과가 흐릿 해 지지만 NEAREST
으로 텍셀 라인이 부족한 경우가 있습니다.
#include <osg/Node>
#include <osgViewer/Viewer>
#include <osg/Texture2D>
#include <osg/Geode>
#include <osg/AutoTransform>
osg::ref_ptr<osg::Node> createFixedSizeTexture(osg::Image *image,int W,int H)
{
osg::Vec3Array& verts = *new osg::Vec3Array(4);
verts[0] = osg::Vec3(-W/2., -H/2., 0);
verts[1] = osg::Vec3(+W/2., -H/2., 0);
verts[2] = osg::Vec3(+W/2., +H/2., 0);
verts[3] = osg::Vec3(-W/2., +H/2., 0);
osg::Vec2Array& texcoords = *new osg::Vec2Array(4);
texcoords[0].set(0,0);
texcoords[1].set(1,0);
texcoords[2].set(1,1);
texcoords[3].set(0,1);
osg::Geometry*const geometry = new osg::Geometry;
geometry->setVertexArray(&verts);
geometry->setTexCoordArray(0, &texcoords);
geometry->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));
osg::Texture2D*const texture = new osg::Texture2D(image);
texture->setResizeNonPowerOfTwoHint(false);
geometry->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
osg::Geode*const geode = new osg::Geode;
geode->addDrawable(geometry);
return geode;
}
int main()
{
static constexpr int W=21, H=15;
unsigned bits[W*H];
for(int x=0;x<W;++x)
for(int y=0;y<H;++y)
bits[x+W*y] = (x&y&1)*0xffffffff;
osg::Image *formImage = new osg::Image;
formImage->setImage(W, H, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE,
reinterpret_cast<unsigned char*>(bits), osg::Image::NO_DELETE);
osg::AutoTransform *at = new osg::AutoTransform;
at->setAutoScaleToScreen(true);
at->setAutoRotateMode(osg::AutoTransform::ROTATE_TO_SCREEN);
at->addChild(createFixedSizeTexture(formImage,W,H));
osgViewer::Viewer viewer;
viewer.setUpViewInWindow(0, 0, 800, 600);
viewer.setSceneData(at);
return viewer.run();
}
이것은 최종 개체의 비 정수 화면 좌표 때문입니다. 이 문제를 해결하려면 객체를 픽셀 격자에 정렬해야합니다. 이것을 어떻게 할 수 있습니까?