我是gameplay3d的新手并经历了所有教程,但是我无法显示我从Fbx编码的这个简单(不多的多边形和材质)模型。我用unity3D检查了模型,并使用了gameplay3d的闭源软件,一切似乎都很好。我想我错过了加载场景的一些细节 这是模型文件,也包括原始fbx文件。我怀疑它是否与光有关 here 这是加载场景的类。
St Bedes Sports Fields, Manchester. M21 0TT
答案 0 :(得分:0)
我无法下载您的Dropbox .fbx文件。你在场景中有多少个型号?这是一种做你想做的事情的简单方法 - 不是最优的,但它会让你开始......
首先,我无法看到代码中的哪个位置实际上指定了一个与材质一起使用的着色器。我使用这样的东西:
material = model->setMaterial("Shaders/Animation/ADSVertexViewAnim.vsh", "Shaders/Animation/ADSVertexViewAnim.fsh");
您需要指定一个着色器,上面的代码将采用顶点和片段着色器,并在需要绘制对象时使用它。
我通过不自动加载场景文件,但创建一个空场景,然后从包中提取我的模型并手动将其添加到场景,我采用了稍微不同的方式。这样,我可以确切地看到发生了什么,我控制着每一步。 GamePlay3D有一些花哨的属性文件,但只有在你知道这个过程如何手动工作时才使用它们。
最初,我在场景中创建了一个简单的立方体,并手动创建了一个场景,并将猴子添加到节点图中,如下所示:
void GameMain::ExtractFromBundle()
{
/// Create a new empty scene.
_scene = Scene::create();
// Create the Model and its Node
Bundle* bundle = Bundle::create("res/monkey.gpb"); // Create the bundle from GPB file
/// Create the Cube
{
Mesh* meshMonkey = bundle->loadMesh("Character_Mesh"); // Load the mesh from the bundle
Model* modelMonkey = Model::create(meshMonkey);
Node* nodeMonkey = _scene->addNode("Monkey");
nodeMonkey->setTranslation(0,0,0);
nodeMonkey->setDrawable(modelMonkey);
}
}
然后我想搜索场景图并仅将材质指定给我想要绘制的对象(猴子)。如果要手动为不同的对象分配不同的材料,请使用此选项...
bool GameMain::initializeScene(Node* node)
{
Material* material;
std::cout << node->getId() << std::endl;
// find the node in the scene
if (strcmp(node->getId(), "Monkey") != 0)
return false;
Model* model = dynamic_cast<Model*>(node->getDrawable());
if( !model )
return false;
material = model->setMaterial("Shaders/Animation/ADSVertexViewAnim.vsh", "Shaders/Animation/ADSVertexViewAnim.fsh");
material->getStateBlock()->setCullFace(true);
material->getStateBlock()->setDepthTest(true);
material->getStateBlock()->setDepthWrite(true);
// The World-View-Projection Matrix is needed to be able to see view the 3D world thru the camera
material->setParameterAutoBinding("u_worldViewProjectionMatrix", "WORLD_VIEW_PROJECTION_MATRIX");
// This matrix is necessary to calculate normals properly, but the WORLD_MATRIX would also work
material->setParameterAutoBinding("u_worldViewMatrix", "WORLD_VIEW_MATRIX");
material->setParameterAutoBinding("u_viewMatrix", "VIEW_MATRIX");
return true;
}
现在可以绘制对象....所以我使用这些函数:
void GameMain::render(float elapsedTime)
{
// Clear the color and depth buffers
clear(CLEAR_COLOR_DEPTH, Vector4(0.0, 0.0, 0.0, 0.0), 1.0f, 0);
// Visit all the nodes in the scene for drawing
_scene->visit(this, &GameMain::drawScene);
}
bool GameMain::drawScene(Node* node)
{
// If the node visited contains a drawable object, draw it
Drawable* drawable = node->getDrawable();
if (drawable)
drawable->draw(_wireframe);
return true;
}
我使用自己的着色器,所以我不必担心Light和DirectionalLight以及所有这些东西。一旦我可以看到对象,那么我将添加动态灯等,但对于初学者来说,开始简单。
问候。