texture Pictures can't be displayed

classic Classic list List threaded Threaded
1 message Options
luke luke
Reply | Threaded
Open this post in threaded view
|

texture Pictures can't be displayed

hi,
I have a problem with adding texture images to the earth. Pictures can't be displayed, but texture colors are added to the earth, and colors can be displayed normally . Why can't texture pictures be displayed? any one can help me ?  The picture loading is normal.

My main code is as follows:
osg::ref_ptr<osg::Vec3Array> pickPointCoordinate()
{
        osg::ref_ptr<osg::Vec3Array> modeCoords = new osg::Vec3Array;
        modeCoords->push_back(osg::Vec3d(124.89223870702052, -66.958854459143936, 72800.09906080551445));
        modeCoords->push_back(osg::Vec3d(107.64642858705838, -67.396834666528221, 72080.8033266989514));
        modeCoords->push_back(osg::Vec3d(158.59642821367058, -76.550085591564411, 78370.7914131917059));
        modeCoords->push_back(osg::Vec3d(157.67276118755024, -72.140850232353813, 230862.65849204641));
        return modeCoords.get();
}

osg::ref_ptr<osg::StateSet> createTexture2DState()
{
        osg::ref_ptr<osg::Image> image = osgDB::readImageFile("C:\\Users\\Public\\Pictures\\Sample Pictures\\dog_left_eye.jpg");
        //创建状态集对象
        osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();
        osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D();
        texture->setDataVariance(osg::Object::DYNAMIC);
        texture->setImage(image.get());
        stateset->setTextureAttributeAndModes(0, texture.get(), osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);

        return stateset.get();
}

void getLocationCoordinator(osg::Vec3d originalPoint, osg::Matrixd& matrix)
{
        osg::Vec3d vec3Z;
        ToolFunction::ConvertLongLatHeightToXYZ(originalPoint.x(), originalPoint.y(), originalPoint.z(), vec3Z);
        osg::Vec3d zUnitVector = vec3Z;
        zUnitVector.normalize();
        double dVariable = -(zUnitVector.x()*vec3Z.x() + zUnitVector.y()*vec3Z.y() + zUnitVector.z()*vec3Z.z());
        double zValue = -dVariable / zUnitVector.z();
        osg::Vec3d vec3Y(-vec3Z.x(), -vec3Z.y(), zValue - vec3Z.z());
        vec3Y.normalize();
        osg::Vec3d vec3X = vec3Y ^ zUnitVector;
        vec3X.normalize();
        matrix(0, 0) = vec3X.x();
        matrix(0, 1) = vec3X.y();
        matrix(0, 2) = vec3X.z();
        matrix(0, 3) = 0;
        matrix(1, 0) = vec3Y.x();
        matrix(1, 1) = vec3Y.y();
        matrix(1, 2) = vec3Y.z();
        matrix(1, 3) = 0;
        matrix(2, 0) = zUnitVector.x();
        matrix(2, 1) = zUnitVector.y();
        matrix(2, 2) = zUnitVector.z();
        matrix(2, 3) = 0;
        matrix(3, 0) = vec3Z.x();
        matrix(3, 1) = vec3Z.y();
        matrix(3, 2) = vec3Z.z();
        matrix(3, 3) = 1;
}

osg::ref_ptr<osg::Vec3Array> getLocalPointCoordinate(std::vector<osg::Vec3d>& vertex, osg::Matrixd& matrix)
{
        osg::ref_ptr<osg::Vec3Array> localCoords = new osg::Vec3Array;
        osg::Matrixd worldToLocal = osg::Matrixd::inverse(matrix);
        osg::Vec3d vec3d;
        for (int i = 0; i < vertex.size(); i++)
        {
                ToolFunction::ConvertLongLatHeightToXYZ(vertex.at(i).x(), vertex.at(i).y(), vertex.at(i).z(), vec3d);
                localCoords->push_back(vec3d * worldToLocal);
        }
        return localCoords.get();
}

osg::ref_ptr<osg::Vec3Array> getLocalPointCoordinate(osg::ref_ptr<osg::Vec3Array>& modeCoords, osg::Matrixd& matrix)
{
        osg::ref_ptr<osg::Vec3Array> localCoords = new osg::Vec3Array;
        osg::Matrixd worldToLocal = osg::Matrixd::inverse(matrix);
        osg::Vec3d vec3d;
        for (int i = 0; i < modeCoords->size(); i++)
        {
                ToolFunction::ConvertLongLatHeightToXYZ(modeCoords->at(i).x(), modeCoords->at(i).y(), modeCoords->at(i).z(), vec3d);
                localCoords->push_back(vec3d * worldToLocal);
        }
        return localCoords.get();
}

void getModeCoordsMaxMinValue(osg::Vec3d &minValue, osg::Vec3d &maxValue, osg::ref_ptr<osg::Vec3Array> &modeCoords)
{
        minValue = osg::Vec3(FLT_MAX, FLT_MAX, FLT_MAX);
        maxValue = osg::Vec3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
        for (int i = 0; i < modeCoords->size() - 1; i++)
        {
                osg::Vec3d vec = modeCoords->at(i);
                minValue.x() = min(minValue.x(), vec.x());
                minValue.y() = min(minValue.y(), vec.y());
                minValue.z() = min(minValue.z(), vec.z());
                maxValue.x() = max(maxValue.x(), vec.x());
                maxValue.y() = max(maxValue.y(), vec.y());
                maxValue.z() = max(maxValue.z(), vec.z());
        }
}

osg::ref_ptr<osg::Vec2Array> getTextureCoords(osg::ref_ptr<osg::Vec3Array> &modeCoords)
{
        osg::Vec3d minValue;
        osg::Vec3d maxValue;
        getModeCoordsMaxMinValue(minValue, maxValue, modeCoords);
        double xLen = maxValue.x() - minValue.x();
        double yLen = maxValue.y() - minValue.y();
        osg::ref_ptr<osg::Vec2Array> textureCoords = new osg::Vec2Array();
        for (int i = 0; i < modeCoords->size(); i++)
        {
                double xTexture = (modeCoords->at(i).x() - minValue.x()) / xLen;
                double yTexture = (modeCoords->at(i).y() - minValue.y()) / yLen;
                textureCoords->push_back(osg::Vec2(xTexture, yTexture));
        }
        return textureCoords.get();
}


osg::ref_ptr<osg::MatrixTransform> addTextureImage(/*std::vector<osg::Vec3d>& vertex*/)
{
        osg::ref_ptr<osg::Vec3Array> modeCoords = pickPointCoordinate();
        osg::Matrixd matrix;
        getLocationCoordinator(modeCoords->at(2), matrix);
        osg::ref_ptr<osg::Vec3Array> localModeCoords = getLocalPointCoordinate(modeCoords, matrix);;
        osg::ref_ptr<osg::Vec2Array> textureCoords = getTextureCoords(localModeCoords);
        osg::ref_ptr<osg::Geometry> textureGeom = new osg::Geometry;
        textureGeom->setVertexArray(localModeCoords);
        textureGeom->setTexCoordArray(0, textureCoords);

        //添加数据
        osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();
        vc->push_back(osg::Vec4(1, 0, 0, 1));
        vc->push_back(osg::Vec4(0, 1, 0, 1));
        vc->push_back(osg::Vec4(0, 0, 1, 1));
        vc->push_back(osg::Vec4(1, 1, 0, 1));
        //设置颜色数组
        //textureGeom->setColorArray(vc.get());
        //设置颜色的绑定方式为单个顶点
        textureGeom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

        textureGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON, 0, localModeCoords->size()));
        //textureGeom->
        osg::ref_ptr<osg::Geode> Geode = new osg::Geode;
        Geode->setStateSet(createTexture2DState());
        Geode->addDrawable(textureGeom.get());
        osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();
        mt->setMatrix(matrix);
        mt->addChild(Geode.get());
        return mt.get();
}

The texture color result is as follows:


The texture image result is as follows: