我对Irrlicht相当新,但我不是C ++的新手。在过去的几周里,我做了很多谷歌搜索,阅读Irrlicht API文档等。出于某种原因,我似乎无法创建一个3D平面网格。
这是我到目前为止所得到的。
CONCAT
我也尝试使用此方法创建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);
出于某种原因,屏幕保持黑色,没有任何渲染。似乎没什么用。有什么建议吗?
答案 0 :(得分:3)
您的问题是相机和平面都具有相同的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();
}