0

エンジンにロードする fbx モデルがありますが、このモデルにプログラムでテクスチャを適用しようとすると機能しませんが、キューブのようなプリミティブ オブジェクトでは機能します。

これが私がすることです

 auto fileLoaderComplete = sceneManager->assets()->loader()->complete()->connect([&](file::Loader::Ptr loader)

{


            auto chair = sceneManager->assets()->symbol(FBX_MODEL_FILENAME);


            //chair->addComponent(Transform::create());

            auto chairMaterial = material::BasicMaterial::create();

            chairMaterial->diffuseMap(sceneManager->assets()->texture(TEXTURE_FILENAME));


            chair->addComponent(Surface::create(

                 geometry::QuadGeometry::create(sceneManager->assets()->context()),                                                                                                                      
                 chairMaterial,                                                                                                                      
                 sceneManager->assets()->effect("effect/Basic.effect")

            ));



            chair->component<Transform>()->matrix(chair->component<Transform>()->matrix() * math::scale(math::vec3(0.005f)));

            // Add the symbol to the scene

            root->addChild(chair);

            }); 

ただし、モデルにはテクスチャが適用されていません。適切に機能させるにはどうすればよいですか?

4

2 に答える 2

0

あなたが実際に何を達成しようとしているのかはわかりませんが、このコードは椅子モデルのルート ノードにクワッドを追加し、テクスチャを適用します。三角形のカリングが有効になっていて、カメラがこのクワッドに向いていない場合、変化が見られないのは正常です。

必要なことは、テクスチャリングするサーフェスを含むノードを取得し、そのマテリアルを更新することです。

次のようになります。

auto fileLoaderComplete = sceneManager->assets()->loader()->complete()->connect([&](file::Loader::Ptr loader)
{
    auto chair = sceneManager->assets()->symbol(FBX_MODEL_FILENAME);
    auto texture = sceneManager->assets()->texture(TEXTURE_FILENAME);

    auto surfaceNodeSet = scene::NodeSet::create(chair)
        ->descendants(true)
        ->where([](scene::Node::Ptr n)
    {
        return n->hasComponent<Surface>();
    });

    for (auto surfaceNode : surfaceNodeSet->nodes())
    {
        auto surface = surfaceNode->component<Surface>();
        surface->material()->data()->set("diffuseMap", texture->sampler());
    }

    chair->component<Transform>()->matrix(chair->component<Transform>()->matrix() * math::scale(math::vec3(0.005f)));

    // Add the symbol to the scene
    root->addChild(chair);
});
于 2016-03-08T17:27:51.153 に答える
0

このヘルプをありがとうhttps://stackoverflow.com/a/35874003/3278271

この場合、surfaceNode->component()->material() を使用してもテクスチャリングが機能しない理由がわかりました。その理由は、私の fbx モデルに UV マッピングが含まれていないためです。

では、問題はプログラムで UV を定義する方法です。

Unity では、次のようなことができますhttp://forum.unity3d.com/threads/programmatically-generate-uv-map.26095/

しかし、ミンコでそれを行う方法は?

于 2016-03-12T03:32:19.127 に答える