c++ - Irrlicht - 创建 3D 平面/立方体网格

标签 c++ 3d irrlicht

我对 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 中向上,这意味着您正在从切片中查看平面,如下图所示:

enter image description here

这就是为什么您什么都看不到的原因。要看到某些东西,您必须将相机放在更高的位置。点 (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();
}

enter image description here

关于c++ - Irrlicht - 创建 3D 平面/立方体网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40939785/

相关文章:

java - 如何在应用程序项目中使用 android native 代码

javascript - Three.js - 设置相机以便整个场景显示的算法?

c++ - 为什么将 sceneManager 设置为 sceneNode 的父级会在 Irrlicht 中抛出错误?

c++ - OpenGL 透明效果在 Meego 上显示的很糟糕

c++ - 使用Irrlicht为CMake项目生成错误LNK1104

c++ - 如何为UUID定义排序?

c++ - 使用定义相互依赖

c++ - 线程安全持有人

python - 在图像上投影 3x4 矩阵点

c++ - 如何将欧拉角转换为前、上、右 vector