【问题标题】:Irrlicht - Creating 3D plane/cube meshIrrlicht - 创建 3D 平面/立方体网格
【发布时间】:2016-12-02 19:43:16
【问题描述】:

我对 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();

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

【问题讨论】:

  • 我的 Irrlicht 有点生锈了,但我有几个问题:你的相机放在哪里?确保它不在平截头体剔除距离之外。另外,你的场景中有灯光吗?
  • 嗯,摄像头放在0,0,0,没有
  • 请提供minimal reproducible example。很难看到您的 main 是什么样子,包括您的渲染循环。

标签: c++ 3d irrlicht


【解决方案1】:

您的问题是相机和飞机都具有相同的 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2015-03-05
    相关资源
    最近更新 更多