Войти
IrrlichtФорум

Как научить персонажа подбирать и держать оружиев руках.

#0
10:52, 17 авг. 2009

День добрый!
Собственно говоря только сегодня начал изучение irrlicht'а, немного поковырялся в примерах программ. В целом почти все понятно.
Я собрался делать игрушку от 3го лица и у меня сразу же возникли 3 вопроса:
1 как научить персонажа подбирать оружие?
2 как к рукам персонажа прицепить оружие?
3 как камеру закрепить за моделью персонажа?
Лазя по интернету нашёл демонстрацию как к рукам персонажа прицепить оружие, однако это была только демонстрация а исходников насколько я помню там небыло.
Такой пример валялся гдето на винте только найти я его не могу :(
Поэтому прошу если есть у кого нить подобные примеры с исходным кодом, просьба выложите на них ссылки.
Заранее спасибо!


#1
19:27, 17 авг. 2009

Да я люблю говорить сам с собой :)
Неужели никто не знает?

#2
22:34, 17 авг. 2009

1. Знаю только общий принцип. Проверяй условием на столкновение героя с оружием. Удаляй оружие оттуда где оно лежало. Если надо проигрывай еще анимацию. Как реализовать не знаю. Сам нуб еще в этом движке.
2. Где то такой вопрос был уже на форуме. Просмотри темы.
3. Пример с оф форума. Сам проверял. Работает. Правда не очень нравиться реализация. Может кто-нибудь попроще пример приведет.

#include <irrlicht.h> 
using namespace irr; 
using namespace core; 
using namespace scene; 
using namespace video; 
using namespace io; 
using namespace gui; 
bool up    = false; 
bool down  = false; 
bool right = false; 
bool left  = false; 
int speed=5;

class MyEventReceiver : public IEventReceiver 
{ 
public: 
   virtual bool OnEvent(SEvent event) 
   { 

         if (event.EventType == EET_KEY_INPUT_EVENT) 
      { 
         switch(event.KeyInput.Key) 
         { 
         case KEY_KEY_W: 

            up = event.KeyInput.PressedDown; 
            break; 

         case KEY_KEY_S: 

            down = event.KeyInput.PressedDown; 
            break; 

         case KEY_KEY_A: 

                     left = event.KeyInput.PressedDown; 
            break; 

         case KEY_KEY_D: 

            right = event.KeyInput.PressedDown; 
            break; 

         } 

         //return true; 
      } 

      return false; 
   } 

}; 

int main(int argc, char** argv) 
{

MyEventReceiver receiver; 
    IrrlichtDevice *device = 
        createDevice(EDT_DIRECT3D9, dimension2d<s32>(640, 480), 16, 
            false, false, false, &receiver); 

    device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo"); 

  
    IVideoDriver* driver = device->getVideoDriver(); 
    ISceneManager* smgr = device->getSceneManager(); 
    IGUIEnvironment* guienv = device->getGUIEnvironment();

ISceneNode* hero = smgr->addCubeSceneNode(); //Героем будет кубик:) 
IAnimatedMesh * movingplane; 
    movingplane=smgr->addHillPlaneMesh("floor", core::dimension2df(15, 15), core::dimension2di(40, 40)); 
 IAnimatedMeshSceneNode *floor=smgr->addAnimatedMeshSceneNode(movingplane); 
    if (hero) 
    { 
        hero->setMaterialFlag(EMF_LIGHTING, false); 
    }

ICameraSceneNode* camera = smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));
while(device->run()) 
    { core::vector3df c = hero->getPosition(); 
         core::vector3df d= hero->getRotation(); 
float diry = ((d.Y+90)*3.14)/180; 
        if (up) 
         { 

            c.X += speed * cos((d.Y) * 3.14 / 180); 
  c.Z -= speed * sin((d.Y) * 3.14 / 180); 

         } 
         if (down) 
         { 
                     c.X -= speed * cos((d.Y) * 3.14 / 180); 
  c.Z += speed * sin((d.Y) * 3.14 / 180); 
         } 
         if (left) 
         { 
            d.Y -= 0.1; 
         } 
         if (right) 
         { 
            d.Y += 0.1; 
         }
hero->setRotation(d); 
    int xf = (c.X-sin(diry)*125); 
int yf =(c.Z-cos(diry)*125); 
int zf =100; 

hero->setPosition(c); 


         camera->setTarget(c); 

         c.Y +=200.f; 
         c.Z -= 150.f; 

         camera->setPosition(vector3df(xf,zf,yf));
driver->beginScene(true, true, SColor(0,200,200,200)); 

        smgr->drawAll(); 
        guienv->drawAll(); 

        driver->endScene(); 
    } 
} 
        device->drop(); 

    return 0; 
}

#3
3:29, 20 авг. 2009

рассказываю как прицепить оружие(сам принцип,исходника не дам,потомучто нету)
1.сделать модэль персонажа с костью в области,где перс должен держать пуху
2.сделать модэль оружие с костью в том месте,где оружие должен держать чар(т.е. рукоятка)
3.экспортировать всё это в формат модэлей который понимает irrlicht и в котором поддерживается работа с костями(помоему,это .x формат)
4.с помощью функций работы с костями(полазий по wiki,дето там я  видел) придвинь друг к другу эти кости
5.откорректируй положение и угол
6.отслеживай в процессе работы угол руки перса и ориентируясь на него, устанавливай угол оружия
7.по точнотакомуже приципу устанавливай координаты оружия
вродебы всё
остальное сам додумай
p.s. незабудь к костям прицепить группы вершин,иначе оружие двигатся не будет

#4
12:39, 22 авг. 2009

Digan
Заменил в примере с камерой кубик и плоскость на свой меш и террэйн,получил тормоза кошмарные:(

#5
21:36, 22 авг. 2009

Всем спасибо за ответы.
И еще тогда один глупый вопрос как модельку  разделить на части. Обьясню по подробнее:
к примеру наш персонаж должен бегать и одновременно перезаряжать оружие или стрелять т.е. чтобы анимация была комбинированная.
Сам принцип мне ясен модель нужно разбить на группу конечностей к примеру отдельно руки, отдельно ноги, отдельно тела и голова.
Известен ли вам иной подход к этой реализации?

#6
5:15, 23 авг. 2009

сделай скелет и модифицируй ключи
других решений не вижу

IrrlichtФорум

Тема в архиве.