Irrlicht - 创建 3D plane/cube 网格

Irrlicht - Creating 3D plane/cube mesh

我对 Irrlicht 很陌生,但对 C++ 并不陌生。在过去的几周里,我做了很多谷歌搜索,阅读 Irrlicht API 文档等。出于某种原因,我似乎无法创建 3D 平面网格。

这是我到目前为止得到的。

irr::scene::ISceneNode* ground = sceneManager->addMeshSceneNode(plane);
ground->setPosition(irr::core::vector3df(0, 0, 10));

irr::scene::ICameraSceneNode* cam = sceneManager->addCameraSceneNode();
cam->setTarget(ground->getPosition());
sceneManager->addMeshSceneNode(plane);

我也尝试使用这种方法创建 3D 立方体网格

irr::scene::IMesh* plane = geomentryCreator->createPlaneMesh(irr::core::dimension2d<irr::f32>(100, 100), irr::core::dimension2d<irr::u32>(100, 100));
irr::scene::ISceneNode* cube = sceneManager->addCubeSceneNode(20);
cube->render();

由于某种原因,屏幕保持黑色,没有任何渲染。似乎没有任何效果。有什么建议吗?

你的问题是相机和平面的Y坐标相同。你没有给相机指定任何位置,所以它在点 (0, 0, 0),所以它的 Y 坐标是 0。你还指定了平面的坐标是 (0, 0, 10),所以它的Y 坐标也为 0。由于 Y 坐标在 Irrlicht 中向上,这意味着您正在从切片中查看平面,如下图所示:

这就是您什么都没看到的原因。要看到某些东西,您必须将相机放在更高的位置。点 (0, 50, 0) 将起作用。

此外,如果场景中没有任何灯光,飞机将像背景一样是黑色的,因为默认情况下它对光线敏感。要更改此设置,您需要使用以下代码使平面对光照不敏感:

plane->setMaterialFlag(irr::video::EMF_LIGHTING, false);

如果飞机的颜色是黑色(默认情况下),您将在黑色背景上看到一个黑色飞机,因此您将看不到任何东西。因此,我建议您将背景设为白色,而不是将其用作主循环中的 beginScene 方法:

driver->beginScene(true, true, irr::video::SColor(255, 255, 255, 255));

正常使用这段代码,你应该可以看到如下截图:

irr::IrrlichtDevice *device = irr::createDevice(irr::video::EDT_OPENGL);
irr::video::IVideoDriver *driver = device->getVideoDriver();
irr::scene::ISceneManager *sceneManager = device->getSceneManager();
const irr::scene::IGeometryCreator *geomentryCreator = sceneManager->getGeometryCreator();

irr::scene::IMesh* plane = geomentryCreator->createPlaneMesh(irr::core::dimension2d<irr::f32>(100, 100), irr::core::dimension2d<irr::u32>(100, 100));
irr::scene::ISceneNode* cube = sceneManager->addCubeSceneNode(20);
cube->render();

irr::scene::ISceneNode* ground = sceneManager->addMeshSceneNode(plane);
ground->setPosition(irr::core::vector3df(0, 0, 10));
plane->setMaterialFlag(irr::video::EMF_LIGHTING, false);    //This is important

irr::scene::ICameraSceneNode* cam = sceneManager->addCameraSceneNode();
cam->setPosition(irr::core::vector3df(0, 50, 0));    //This is also important
cam->setTarget(ground->getPosition());
sceneManager->addMeshSceneNode(plane);

while(device->run()){
    driver->beginScene(true, true, irr::video::SColor(255, 255, 255, 255));    //Important for the background to be white
    sceneManager->drawAll();
    driver->endScene();
}