Aktuelle Zeit: 20.04.2025, 22:05

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Laden in eine Mesh und Drehen zb.
BeitragVerfasst: 01.11.2008, 14:06 
Offline

Registriert: 24.06.2008, 11:37
Beiträge: 34
Hallo Ihr lieben habe ein neues Thema wo ich mal wieder verzeifel und Hilfe brauche!

Also ich lade eine bsp (einen Virtuellen Raum)

in diesen Raum lade ich nun ein Objekt welches keine Animationen hat !

Code:
   /*
   Laden mesh ! get(Mesh)
   */
   scene::IAnimatedMesh* mesh = smgr->getMesh("raum1.bsp");
   scene::ISceneNode* node = 0;
   
   if (mesh)
      node = smgr->addOctTreeSceneNode(mesh->getMesh(0), 0, -1, 128);

   /*
   position setPosition()
   drehen setRotation()
   */
   if (node){
      node->setPosition(core::vector3df(cam_links_rechts,cam_hoch_runter,cam_vor_zurück));//rechts-links+,oben- unten,vor- zurück+
      node->setRotation(core::vector3df(cam_rotation_x,cam_rotation_y,cam_rotation_z));
   }


   //Laden .x file in die mash
   mesh = smgr->getMesh("stuhl.x");
   scene::IAnimatedMeshSceneNode* anode = 0;
   anode = smgr->addAnimatedMeshSceneNode(mesh);
   anode->setPosition(core::vector3df(-0,20,-60));
   anode->setRotation(core::vector3d(0,90,0));
   
   /*
   Kammera zum anschauen der map
   */
   //smgr->addCameraSceneNode(); // Normale kamera
   smgr->addCameraSceneNodeFPS(); // First person kamera
   //smgr->addCameraSceneNodeMaya(); // Maya kamera


   /*
   Maus cursor AN AUS
   */

   device->getCursorControl()->setVisible(true);

   /*
   Alles Zeichnen
   wobei device->isWindowActive() ist Optional
   */
   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"Irrlicht Engine - Quake 3 Map example [";
         str += driver->getName();
         str += "] FPS:";
         str += fps;

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

   /*
   ende lösche Irrlicht Device
   */
   device->drop();
   return 0;
}


Nun meine probleme
1.mein .x File findet die Texturen nicht ich bekomme als Fehlermeldung
"Could not open file of Texture:../texture/holz.jpg"
die Texturen meiner .bsp sind im selben ordner und werden ohne probleme geöffnet, oder Denke ich falsch?
2.ich möchte gerne meinen Stuhl in einem abstand von sec mal nach links mal nach rechts drehen wie kann ich das den schaffen?


Danke schon mal
LG alex


Nach oben
 Profil  
 
BeitragVerfasst: 01.11.2008, 14:52 
Offline
Benutzeravatar

Registriert: 17.02.2008, 14:08
Beiträge: 125
Zu 1: Die Textur muss relativ zur x. Datei sein damit sie richtig geladen wird glaub ich, andernfalls musst du die Textur halt manuell laden und zuweisen.
"driver->getTexture
node->setMaterialTexture"

Zu 2: Du kannst einen Animator erstellen und ihm eine geschwindigkeit zuweisen, und nach einer Sekunde wieder entfernen oder du machst es mit setRotation wobei du die Geschwindigkeit abhängig von dern FPS machst.

MfG
FTC

_________________
Cold-Death
Magnon


Nach oben
 Profil  
 
BeitragVerfasst: 01.11.2008, 15:13 
Offline

Registriert: 24.06.2008, 11:37
Beiträge: 34
1.Hmm das habe ich nicht verstanden was meinst du mit relativ zur .x datei!
Manuell will ich sie nicht laden den dann könnte ich ja auch das model .3ds nehmen und die Textur laden da der Stuhl aber aus insgesamt 3 Texturen besteht würde ich es dann schon gerne über das x.file machen!
Wenn ich den Stuhl in irredit importiere werden die texturen geladen ?
2.wie erstelle ich den so nen animator?

Danke


Nach oben
 Profil  
 
BeitragVerfasst: 01.11.2008, 20:05 
Offline

Registriert: 23.07.2008, 15:42
Beiträge: 41
1. Jede Datei (in deinem Beispiel die textur) wird in der Regel relativ angegeben.
d.h du sagst deinem Programm : von der datei xxx.x gehe in den Ordner vorher
dort in den Ordner Z und lade da die datei.
wenn die datei z.B im Ordner C:/Texturen liegt und dein Programm im Ordner
C:/Programme Dann muss der pfad lauten:
(relativ) ../Texturen/textur.jpg
oder
(absolut)C:/Texturen/textur.jpg

was auch sein kann wenn du aus einer IDE heraus Startest (Build&run):
das working directory der ide wird verwendet dann starte das programm extern über den explorer oder wie auch immer.
ich benutze immer absolute pfadangaben.

2. Ich schätze du musst mit der timer-klasse arbeiten *keineAhnung-hab*

_________________
Lebe jeden Tag als wäre es dein letzter-
irgentwann wirst du Recht haben.


Nach oben
 Profil  
 
BeitragVerfasst: 01.11.2008, 23:04 
Offline
Benutzeravatar

Registriert: 17.02.2008, 14:08
Beiträge: 125
1. Normalerweise wird das Verzeichnis als root benutzt in dem die exe ausgeführt wird. Und generell gilt: Immer relative Angaben benutzen, sonst läuft dein Programm wirklich nur da wo du es erstellt hast. Wenn du es dann in einen anderen Ordner verschiebst läuft es gar nicht mehr.

2. scenemanager->createRotationAnimator()

MfG

_________________
Cold-Death
Magnon


Nach oben
 Profil  
 
BeitragVerfasst: 02.11.2008, 00:33 
Offline

Registriert: 24.06.2008, 11:37
Beiträge: 34
also ich habe die angaben bzw den pfad relativ angegeben denn ich will ja wirklich das es überall läuft!
Die fehler sind auch beseitigt habe ein neues .x file erstellt nun klappt eigendlich alles !
aber wie gesagt nur eigendlich!
die Texturen werden ordnungsgemäss geladen und mein Stuhl ist auch sichtbar nur in schwarz und nicht in den Texturen!
Ich habe nun ein anderes .x file geladen ein plackat so zu sagen und auch hier bleibt alles schwarz ?
wenn ich die zwei sachen in irredit importiere und dann die gesamte mash in irrlicht lade sieht man die Texturen in der Engine einband frei!
aber das will ich nicht ich will die sachen halt im c code laden und nicht mit irredit!

hier nochmal der Code
Code:
   //Laden .x file in die mash
   mesh = smgr->getMesh("plackat.x");
   scene::IAnimatedMeshSceneNode* anode = 0;
   anode = smgr->addAnimatedMeshSceneNode(mesh);
   anode->setPosition(core::vector3df(-0,20,-60));
   anode->setRotation(core::vector3df(0,90,0));
   //anode->setAnimationSpeed(15);

   //add shadow
   anode->addShadowVolumeSceneNode();
   smgr->setShadowColor(video::SColor(0,0,0,0));

   // make the model a little bit bigger and normalize its normals
   // because of this for correct lighting
   anode->setScale(core::vector3df(2,2,2));
   anode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true);


Oh man was mache ich falsch oder muss ich die Textur noch sichtbar machen neeee ich weiss nicht mehr licht oh je
LG Alex


Nach oben
 Profil  
 
BeitragVerfasst: 02.11.2008, 01:16 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Du musst entweder ein Licht hinzufügen oder das lightning für die Scenenodes deaktivieren. (setMaterialFlag)
Ohne Licht keine Farbe ;)

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 02.11.2008, 02:34 
Offline

Registriert: 24.06.2008, 11:37
Beiträge: 34
ahhh Danke ja das war es !
Ich lade auch anders hier mal der Text
Code:
   //Laden der Stuhls
      scene::IAnimatedMeshSceneNode* anms = smgr->addAnimatedMeshSceneNode(smgr->getMesh("stuhl.x"));
//rotation
   if (anms)
   {
      scene::ISceneNodeAnimator* anim =
         smgr->createRotationAnimator(core::vector3df(0,0.3f,0));
      if (anim)
      {
         anms->addAnimator(anim);
         anim->drop();
      }
      anms->setMaterialFlag(video::EMF_LIGHTING, false);
      anms->setRotation(core::vector3df(0,180.0f,0));
      

   }

und so sieht das ganze auch noch viel besser aus :)
aber jetzt mal zurück zum drehen des stuhls

ich will ja das der stuhl sich um 90 grad nach links dreht und dann wieder 90 grad zurück und mit
Code:
scene::ISceneNodeAnimator* anim =
         smgr->createRotationAnimator(core::vector3df(0,0.3f,0));

dreht der stuhl immer nur in eine richtung was könnte ich da machen?
LG alex


Nach oben
 Profil  
 
BeitragVerfasst: 02.11.2008, 02:56 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Festsetzen, wie lange sich der Stuh in die eine richtung drehen soll.
Dann in der main loop gucken, ob die zeit um ist. Wenn sie um ist den animator entfernen und einen neuen mit entgegengesetzer richtig dranhängen.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 02.11.2008, 23:51 
Offline

Registriert: 24.06.2008, 11:37
Beiträge: 34
Also irgendwie geht das nicht das ich die animation hin und her bewege :(!

Also eigendlich will ich das der stuhl sich um 90° nach links dreht und dann um 90° nach rechts dreht!
das ist die position im game
Code:
stuhl->setRotation(core::vector3df(0,270,0));

danach soll er sich bis an Position drehen
Code:
stuhl->setRotation(core::vector3df(0,360,0));

nun 5 sec warten
und dann wieder zurückdrehen!
da die geschwindigkeit vom drehen des Stuhls über die gui gesteuert wird ist das drehen anhand von einer Zeit denke ich recht ungünstig !
ich wollte das in eine schleife packen die die animation solange ausführt bis sie halt an dem punkt 360 angekommen ist aber grr ..
kann mir nicht jemand nen beispiel machen??
wäre echt total lieb!

LG alex


Nach oben
 Profil  
 
BeitragVerfasst: 03.11.2008, 23:04 
Offline

Registriert: 24.06.2008, 11:37
Beiträge: 34
habe es den ganzen tag versucht aber es gelingt mir nicht !

hat den keiner ne idee wie ich das hin bekomme?

LG ALex


Nach oben
 Profil  
 
BeitragVerfasst: 04.11.2008, 09:21 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
drehe vector 3d um eine entsprechende grad-zahl und setze diese dann.
mit diesen funktionen kannst du den vector drehen:

Code:
void irr::core::vector3d< T >::rotateXYBy(f64 degrees, const vector3d< T > & center)
void irr::core::vector3d< T >::rotateXZBy(f64 degrees, const vector3d< T > & center)
void irr::core::vector3d< T >::rotateYZBy(f64 degrees, const vector3d< T > & center)

(http://irrlicht.sourceforge.net/docu/classirr_1_1core_1_1vector3d.html#a34)


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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