请问有人会用这个引擎么,我看到论坛里很多大哥写了这个引擎的博文,现在遇到了点问题,希望懂的人帮帮忙。
如何控制摄像机是第三视角,就是前方有一个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;
}