irrlicht3D引擎的第三人称摄像机怎么打
请问有人会用这个引擎么,我看到论坛里很多大哥写了这个引擎的博文,现在遇到了点问题,希望懂的人帮帮忙。
如何控制摄像机是第三视角,就是前方有一个model,然后摄像机打在他后方一点,model旋转,摄像机也跟随着转。
// ImportMapOrModul.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdlib.h>#include <irrlicht.h>#include<iostream> #include <math.h>using namespace std;#define PI 3.1415927#ifdef _IRR_WINDOWS_#pragma comment(lib,"Irrlicht.lib")#endifusing namespace irr;using namespace core;using namespace scene;using namespace video;using namespace io;using namespace gui;int IsRun = 0;scene::IAnimatedMeshSceneNode* anms;enum{ // I use this ISceneNode ID to indicate a scene node that is // not pickable by getSceneNodeAndCollisionPointFromRay() ID_IsNotPickable = 0, // I use this flag in ISceneNode IDs to indicate that the // scene node can be picked by ray selection. IDFlag_IsPickable = 1 << 0, // I use this flag in ISceneNode IDs to indicate that the // scene node can be highlighted. In this example, the // homonids can be highlighted, but the level mesh can't. IDFlag_IsHighlightable = 1 << 1};class Myrecv:public IEventReceiver{public: bool key[KEY_KEY_CODES_COUNT]; Myrecv(){ int i; for (i=0;i<KEY_KEY_CODES_COUNT;i++) key[i]=false; } virtual bool OnEvent(const SEvent & ev ){ if (ev.EventType==EET_KEY_INPUT_EVENT) key[ev.KeyInput.Key]=ev.KeyInput.PressedDown; return false; } virtual bool isKeyDown(EKEY_CODE keycode ) const{ return key[keycode]; }};void run(){ if(IsRun != 1) { IsRun = 1; //anms->setMD2Animation("run"); anms->setFrameLoop(200,500); anms->setAnimationSpeed(100); anms->setLoopMode(true); } }void stand(){ if(IsRun != 2) { IsRun = 2; anms->setFrameLoop(1,1); anms->setAnimationSpeed(100); anms->setLoopMode(false); } }int main(){ Myrecv recv ; video::E_DRIVER_TYPE driverType; driverType = video::EDT_OPENGL; IrrlichtDevice *device = createDevice(driverType,dimension2d<u32>(800,680),16, false,false,false,&recv); video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* smgr = device->getSceneManager(); device->getFileSystem()->addZipFileArchive("../MAP/123.zip"); scene::IAnimatedMesh* mesh = smgr->getMesh("123.obj"); scene::IMeshSceneNode* node = 0; if(mesh) node = smgr->addOctreeSceneNode(mesh->getMesh(0),0,IDFlag_IsPickable); if(node) node->setMaterialFlag(video::EMF_LIGHTING,false); scene::ITriangleSelector* selector = 0; if (node) { node->setPosition(core::vector3df(0,0,0)); selector = smgr->createOctreeTriangleSelector( node->getMesh(),node,128); node->setTriangleSelector(selector); } // smgr->addCameraSceneNodeFPS(); device->getCursorControl()->setVisible(false); anms = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../MAP/ren.md2"));//添加人物模型进来 if(anms) { anms->setMaterialFlag(video::EMF_LIGHTING,false); //屏蔽光照 anms->setLoopMode(true); anms->setRotation(core::vector3df(0,0,0)); anms->setMaterialTexture(0,driver->getTexture("../MAP/casual01_m_35.jpg")); //添加纹理 anms->setMaterialFlag(EMF_LIGHTING,false); anms->setScale(core::vector3df(1,1,1)); anms->setPosition(core::vector3df(20,100,-160)); } /*********************************/ SKeyMap keyMap[8]; keyMap[0].Action = EKA_MOVE_FORWARD; keyMap[0].KeyCode = KEY_UP; keyMap[1].Action = EKA_MOVE_FORWARD; keyMap[1].KeyCode = KEY_KEY_W; keyMap[2].Action = EKA_MOVE_BACKWARD; keyMap[2].KeyCode = 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; /*********************************/// scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeMaya(anms,0.0f,0.0f,0.0f,-1,true);// scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(); // smgr->addCameraSceneNodeFPS(0, 100.0f, 0.1f, ID_IsNotPickable, keyMap, 8, true, 3.f); //0.3f代表摄像机移动的速度 true 代表是否让摄像机定在一个固定的z轴上运动// scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 100.0f, .3f, ID_IsNotPickable, keyMap, 8); scene::ICameraSceneNode* camera = smgr->addCameraSceneNode(); camera->bindTargetAndRotation(true); vector3df v = anms->getPosition(); camera->setPosition(core::vector3df(100,220,240));// camera->setTarget(core::vector3df(-70,30,-60)); camera->setTarget(core::vector3df(80,80,0)); //******创建地形碰撞******************************* const core::aabbox3d<f32>& box = anms->getBoundingBox(); core::vector3df radius = box.MaxEdge - box.getCenter(); if(selector) { scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator( selector,anms,radius, core::vector3df(0,-10.0f,0),core::vector3df(0,0,0)); selector->drop(); anms->addAnimator(anim); anim->drop(); } //************************************************* if(device->isWindowActive()) int lastFPS = -1; double speed = 0.8; vector3df rotion = anms->getRotation(); float roZ = rotion.Y; while(device->run()) if(device->isWindowActive()) { vector3df pos = anms->getPosition(); vector3df rotion = anms->getRotation(); vector3df campos = camera->getPosition(); vector3df camro = camera->getRotation(); if (recv.isKeyDown(KEY_KEY_W )){ cout<<"x="<<pos.X<<endl; cout<<"y="<<pos.Y<<endl; cout<<"z="<<pos.Z<<endl; cout<<endl; pos.Z -=speed; camera->setPosition(core::vector3df(pos.X,pos.Y+200,pos.Z+400)); camera->setRotation(core::vector3df(180,0,100)); run(); }else if (recv.isKeyDown(KEY_KEY_S)){ pos.Z+=speed; }else if (recv.isKeyDown(KEY_KEY_A)){ //pos.X+=speed; rotion.Y-=speed; }else if (recv.isKeyDown(KEY_KEY_D)){ rotion.Y+=speed; roZ = rotion.Y; } anms->setPosition(pos); anms->setRotation(rotion); // camera->setRotation(rotion); driver->beginScene(true,true,video::SColor(0,200,200,200)); smgr->drawAll(); driver->endScene(); int fps = driver->getFPS(); } device->drop(); return 0;}