我有一个fbx模型,我在引擎中加载,但是当我尝试在这个模型上以编程方式应用纹理时,它不起作用,但它适用于像cube这样的原始对象。
这就是我的工作
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);
});
但是没有在模型上应用任何纹理。如何让它正常工作?
答案 0 :(得分: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);
});
答案 1 :(得分:0)
感谢您的帮助https://stackoverflow.com/a/35874003/3278271
我弄清楚为什么在这种情况下,即使使用surfaceNode-&gt; component() - &gt; material(),纹理仍然不起作用。 原因是我的fbx模型不包含UV映射。
现在问题是如何以编程方式定义UV?
在Unity中你可以做这样的事情http://forum.unity3d.com/threads/programmatically-generate-uv-map.26095/
但是如何在Minko中做到这一点?