我有一个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);
}); 但是没有任何纹理应用到模型上。如何让它正常工作?
发布于 2016-03-09 01:27:51
我不知道您真正想要实现的是什么,但是这段代码向您的椅子模型的根节点添加了一个带有纹理的四边形。如果启用了三角形剔除,并且你的相机没有面对这个四边形,你看不到任何变化是正常的。
您需要做的是检索包含要设置纹理的曲面的节点并更新其材质。
它应该看起来像这样:
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-12 11:32:19
感谢你的帮助https://stackoverflow.com/a/35874003/3278271
我弄明白了为什么在这种情况下,即使使用surfaceNode>component()->material(),纹理仍然不起作用。原因是我的fbx模型不包含UV贴图。
所以现在的问题是如何以编程方式定义UV?
在Unity中,你可以像这样做http://forum.unity3d.com/threads/programmatically-generate-uv-map.26095/
但是如何在Minko中做到这一点?
https://stackoverflow.com/questions/35872481
复制相似问题