irrlicht3D引擎的第三人称摄像机怎么打

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

using 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;
}


...全文
291 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
大师兄慢慢 2013-04-19
  • 打赏
  • 举报
回复
你怎么解决的?求教Q1025394400,感激不尽
Ginie 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

算了,来个人接分吧
[/Quote]
放太久了,没人看,最后自己解决
渔舟唱晚, 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

算了,来个人接分吧
[/Quote]
Ginie 2012-06-08
  • 打赏
  • 举报
回复
算了,来个人接分吧
Ginie 2012-06-07
  • 打赏
  • 举报
回复

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧