Aktuelle Zeit: 21.04.2025, 23:07

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 25.06.2007, 15:16 
Offline

Registriert: 25.06.2007, 15:07
Beiträge: 5
Hallo,

ich habe mir ein Irredit eine kleine Testwelt gebaut. Diese lade ich nun mit einer leicht modifizierten Version des Irrloader Beispiels (Tutorial 15 glaube ich)

Code:
#include "stdafx.h"

#include <irrlicht.h>
#include <iostream>
using namespace irr;

#pragma comment(lib, "Irrlicht.lib")

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

   video::E_DRIVER_TYPE driverType;
   driverType = video::EDT_OPENGL;

   IrrlichtDevice* device =
   createDevice(driverType, core::dimension2d<s32>(800, 600), 32);


   if (device == 0)
      return 1; // could not create selected driver.

   //Mauscursor Off
   device->getCursorControl()->setVisible(false);

   //set caption
   device->setWindowCaption(L"Load .irr file example");

   video::IVideoDriver* driver = device->getVideoDriver();
   scene::ISceneManager* smgr = device->getSceneManager();

   /* Now load our .irr file.
   .irr files can store the whole scene graph including animators, materials
   and particle systems. And there is also the possibility to store arbitrary
   user data for every scene node in that file. To keep this
   example simple, we are simply loading the scene here. See the documentation
   at ISceneManager::loadScene and ISceneManager::saveScene for more information.
   So to load and display a complicated huge scene, we only need a single call
   to loadScene().
   */

   // load the scene

   //smgr->loadScene("../../media/example.irr");
   printf(argv[1]);
   smgr->loadScene(argv[1]);


   /*
   That was it already. Now add a camera and draw the scene
   */

   // add a user controlled camera
   smgr->addCameraSceneNodeFPS();

   //Sydney einfügen
   //node
   scene::IAnimatedMesh* mesh = smgr->getMesh("meshes/sydney/sydney.md2");
   scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh );

   if (node)
   {
      node->setMaterialFlag(video::EMF_LIGHTING, false);
      node->setFrameLoop(0, 310);
      node->setMaterialTexture( 0, driver->getTexture("meshes/sydney/sydney.bmp") );
   }

   // and draw everything.

   int lastFPS = -1;

   while(device->run())
      if (device->isWindowActive())
      {
         driver->beginScene(true, true, video::SColor(0,200,200,200));
         smgr->drawAll();
         driver->endScene();

         int fps = driver->getFPS();

         if (lastFPS != fps)
         {
            core::stringw str = L"Load Irrlicht File example - Irrlicht Engine [";
            str += driver->getName();
            str += "] FPS:";
            str += fps;

            device->setWindowCaption(str.c_str());
            lastFPS = fps;
         }

      }

      device->drop();

      return 0;
}


Ich füge nach dem laden der irr Datei den Mesh Sydney ein.

Code:
   //Sydney einfügen
   //node
   scene::IAnimatedMesh* mesh = smgr->getMesh("meshes/sydney/sydney.md2");
   scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh );


Jetzt wollte ich fragen wie man die Kamera immer hinter dem Mesh positioniert, das sie den Mesh immer verfolgt wenn er sich bewegt?

Grüße, Florian


Nach oben
 Profil  
 
BeitragVerfasst: 25.06.2007, 15:33 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Du musst die Kamera als Child des Meshes laden und sie dann an eine relative Position wie (0, 0, -50) setzen, damit sie immer hinter dem Objekt bleibt, dazu musst du regelmäßig den LookAt-Vektor der Kamera auf das Objekt richten.

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 28.06.2007, 10:30 
Offline

Registriert: 25.06.2007, 15:07
Beiträge: 5
So ich habe jetzt eine Kamera erstellt und an den Node angehängt.

Code:
scene::ICameraSceneNode *camera = smgr->addCameraSceneNode(node);
camera->setPosition(core::vector3d<f32>(0, 0, -100));


Wenn ich die Figur dann bewege:
Code:
core::vector3d<f32> cPos = node->getPosition();
core::vector3d<f32> cAdd (50, 0, 0);

cPos = cPos + cAdd;

node->setPosition(cPos);


passiert folgendes. Ich habe schon einiges ausprobiert (Kameraposition und so) ausporbiert komme aber immer wieder zu diesem Effekt:

Bild

Kann mir jemand erklären woran das liegt, ich verstehe es einfach nicht.

Danke schonmal(:

Florian


Nach oben
 Profil  
 
BeitragVerfasst: 28.06.2007, 11:28 
Offline
Moderator

Registriert: 25.02.2007, 14:35
Beiträge: 323
Wohnort: Münster
Ja, das Problem ist klar.

Du hast den Post von thephoenix nicht richtig gelesen.

Du musst an diesen Code:
Code:
core::vector3d<f32> cPos = node->getPosition();
core::vector3d<f32> cAdd (50, 0, 0);

cPos = cPos + cAdd;

node->setPosition(cPos);


Diese Zeile noch hinzufügen:
Code:
camera->setTarget(cPos);



also so:
Code:
core::vector3d<f32> cPos = node->getPosition();
core::vector3d<f32> cAdd (50, 0, 0);

cPos = cPos + cAdd;

node->setPosition(cPos);
camera->setTarget(cPos);


Nach oben
 Profil  
 
BeitragVerfasst: 28.06.2007, 11:57 
Offline

Registriert: 25.06.2007, 15:07
Beiträge: 5
Dankeschön(: Ja stimmt habe ich irgendwie komplett übersehen, das mit dem setTarget.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de