Mouse events work excellent :
Code: Select all
void Terrain3D::mouseMoveEvent(QMouseEvent *event)
{
switch(mousePressedBtn){
case Qt::LeftButton:{
if(mousePressed){
irr::SEvent irrEvent;
irrEvent.EventType = irr::EET_MOUSE_INPUT_EVENT;
if(m_IrrDevice){
irrEvent.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
irrEvent.MouseInput.X = event->x();
irrEvent.MouseInput.Y = event->y();
irrEvent.MouseInput.Wheel = 0.0f;
m_IrrDevice->postEventFromUser(irrEvent);
}
update();
}
}
break;
default: break;
}
}Му class:
Code: Select all
class Terrain3D : public QWidget
{
Q_OBJECT
public:
irr::IrrlichtDevice *m_IrrDevice;
irr::video::E_DRIVER_TYPE m_DriverType;
irr::video::SColor m_ClearColor;
...
...
...
protected:
virtual QPaintEngine * paintEngine() const;
virtual void resizeEvent(QResizeEvent *event);
virtual void paintEvent(QPaintEvent *event);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void wheelEvent(QWheelEvent *);
virtual void keyPressEvent(QKeyEvent *event);
virtual void keyReleaseEvent(QKeyEvent *event);
};
Code: Select all
void Terrain3D::keyPressEvent(QKeyEvent * event)
{
irr::SEvent::SKeyInput evt;
evt.Key = irr::KEY_UP;
irr::SEvent wrapper;
wrapper.KeyInput = evt;
wrapper.EventType = EET_KEY_INPUT_EVENT;
wrapper.KeyInput.PressedDown = true;
qDebug() << m_IrrDevice->postEventFromUser(wrapper);
update();
};Creating terrain and camera:
Code: Select all
if(m_IrrDevice == 0){
QMessageBox::critical(this, "Критическая ошибка", "Irrlicht небыл проинициализирован.");
return;
}
video::IVideoDriver* driver = m_IrrDevice->getVideoDriver();
scene::ISceneManager* smgr = m_IrrDevice->getSceneManager();
gui::IGUIEnvironment* env = m_IrrDevice->getGUIEnvironment();
driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
SKeyMap keyMap[8];
keyMap[0].Action = EKA_MOVE_FORWARD;
keyMap[0].KeyCode = irr::KEY_UP;
keyMap[1].Action = EKA_MOVE_FORWARD;
keyMap[1].KeyCode = KEY_KEY_W;
keyMap[2].Action = EKA_MOVE_BACKWARD;
keyMap[2].KeyCode = irr::KEY_DOWN;
keyMap[3].Action = EKA_MOVE_BACKWARD;
keyMap[3].KeyCode = KEY_KEY_S;
keyMap[4].Action = EKA_STRAFE_LEFT;
keyMap[4].KeyCode = KEY_LEFT;
keyMap[5].Action = EKA_STRAFE_LEFT;
keyMap[5].KeyCode = KEY_KEY_A;
keyMap[6].Action = EKA_STRAFE_RIGHT;
keyMap[6].KeyCode = KEY_RIGHT;
keyMap[7].Action = EKA_STRAFE_RIGHT;
keyMap[7].KeyCode = KEY_KEY_D;
terrain = smgr->addTerrainSceneNode(filename.toAscii().data(),
0, // parent node
-1, // node id
core::vector3df(0.f, 0.f, 0.f), // position
core::vector3df(0.f, 0.f, 0.f), // rotation
core::vector3df(40.f, 10.f, 40.f), // scale
video::SColor ( 255, 255, 255, 255 ), // vertexColor
5, // maxLOD
scene::ETPS_17, // patchSize
4 // smoothFactor
);
terrain->setMaterialFlag(video::EMF_LIGHTING, false);
terrain->setMaterialTexture(0, driver->getTexture("media/k372_texture_full_1.png"));
terrain->setMaterialType(video::EMT_DETAIL_MAP);
terrain->scaleTexture(1.0f, 20.0f);
//
scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 100.f, 100.f, -1, keyMap, 8, false, 0.f, false, true);//, false, 0, false, true);//addCameraSceneNodeFPS(0,100.0f,1.2f);
camera->setInputReceiverEnabled(true);
camera->setPosition(core::vector3df(2700*2, /*255*2*/terrain->getHeight(2700*2, 2600*2) * 2, 2600*2));
camera->setTarget(core::vector3df(2397*2, /*343*2*/terrain->getHeight(2700*2, 2700*2)*2, 2700*2));
camera->setFarValue(42000.0f);
scene::ITriangleSelector * selector = smgr->createTerrainTriangleSelector(terrain, 0);
terrain->setTriangleSelector(selector);
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(selector, camera, core::vector3df(60,100,60), core::vector3df(0,0,0), core::vector3df(0,50,0));
selector->drop();
camera->addAnimator(anim);
anim->drop();
scene::CDynamicMeshBuffer* buffer = new scene::CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT);
terrain->getMeshBufferForLOD(*buffer, 0);
video::S3DVertex2TCoords* data = (video::S3DVertex2TCoords*)buffer->getVertexBuffer().getData();
// Work on data or get the IndexBuffer with a similar call.
buffer->drop(); // When done drop the buffer again.
Code: Select all
Terrain3D::Terrain3D(QWidget *parent, irr::video::E_DRIVER_TYPE driverType) :
QWidget(parent)
{
setAttribute(Qt::WA_PaintOnScreen, true);
setAttribute(Qt::WA_OpaquePaintEvent, true);
setFocus(Qt::ActiveWindowFocusReason);
m_IrrDevice = 0;// По умолчанию 0, для того чтобы при инициализации не произошло создания более одного устройства
m_DriverType = driverType;
translateSpeed = 100.f;
setClearColor(irr::video::SColorf(0.2f, 0.2f, 0.2f));
mousePressedBtn = Qt::NoButton;
mousePressed = false;
// camFOV = 0.f;
// setMouseTracking(true);
}