读书人

irrlicht3D引擎的第三人称摄像机如何打

发布时间: 2012-06-09 17:16:42 作者: rapoo

irrlicht3D引擎的第三人称摄像机怎么打
请问有人会用这个引擎么,我看到论坛里很多大哥写了这个引擎的博文,现在遇到了点问题,希望懂的人帮帮忙。
如何控制摄像机是第三视角,就是前方有一个model,然后摄像机打在他后方一点,model旋转,摄像机也跟随着转。

C/C++ code
// 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;} 



[解决办法]
探讨

算了,来个人接分吧

读书人网 >VC/MFC

热点推荐