2016-07-31 13 views
0

三角形の集合のテクスチャ座標を計算するのに助けが必要です。シェーダーのない頂点座標に従ってそれらを計算する関数はありますか?または、頂点法線を使って手動でそれらを計算する方法は? 私はポイントクラウドから計算された小さな三角形を大量に持っており、それらに影響を及ぼす可能性はありません。私の簡略化されたテストプログラムは、次のようになります。OpenSceneGraph:三角形セットのテクスチャ座標

//read texture 
    text = new_message->text; 
    osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; 
    texture->setDataVariance(osg::Object::DYNAMIC); 
    osg::ref_ptr<osg::Image> image = osgDB::readImageFile("Images/" +text); 

    if (!image) 
    { 
    std::cout << "Couldn't load texture." << std::endl; 
    } 
    texture->setImage(image.get()); 
    ... 
    //create and fill an array of vertices 
    osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; 
    vertices->push_back(osg::Vec3(...)); 
    ... 
    osg::ref_ptr<osg::Geometry> quad = new osg::Geometry; 
    quad->setVertexArray(vertices.get()); 
    quad->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLES, 0, 12)); 
    //calculate normals 
    osgUtil::SmoothingVisitor::smooth(*quad); 
    geode = new osg::Geode; 
    geode->addDrawable(quad.get()); 
    //calculate texture coordinates 
    osg::StateSet *state = geode->getOrCreateStateSet(); 
    state->setTextureAttributeAndModes(1, texture.get(), osg::StateAttribute::ON); 
    state->setTextureMode(1, GL_TEXTURE_GEN_S, osg::StateAttribute::ON); 
    state->setTextureMode(1, GL_TEXTURE_GEN_T, osg::StateAttribute::ON); 
    state->setTextureMode(1, GL_TEXTURE_GEN_R, osg::StateAttribute::ON); 
    state->setTextureMode(1, GL_TEXTURE_GEN_Q, osg::StateAttribute::ON); 
    geode->setStateSet(state); 

計算法線はテクスチャ座標がまったく機能していない、完璧に動作 - 私は黒の三角形を取得します。 GL_TEXTURE_GEN_Sの使い方に関する情報はあまりないので、どんな助けでも本当に感謝しています。 UPD:私は計算されたテクスチャは、手動で以下の式http://paulyg.f2s.com/uv.htm

答えて

0

GL_TEXTURE_GEN_* generates texture coordinates according to some parametric function (e.g. mapping world or model coordinates, reflection vectors etc.)

あなたは、あなたが実際に達成しようとしているもの述べるませんが、任意のテクスチャ座標を取得するために を使用して座標、GL_TEXTURE_GEN_*は仕事ができます。それ以外の場合は、ポイントクラウドの頂点と法線を反復して、osg::Geometry内のCPU側でテクスチャ座標を生成することができます。これは、ジオメトリに頂点を割り当てたのと同じ方法で動作しますが、必要に応じて実際の座標を計算する別の関数を使用します。

+0

返信いただきありがとうございます! – Etimr

関連する問題