Aktuelle Zeit: 21.04.2025, 09:05

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 16.08.2007, 15:52 
Offline

Registriert: 16.08.2007, 15:22
Beiträge: 34
Hi,

Ich bin grad an meinem ersten Projekt mit der Irrlicht Engine, aber hab noch ein paar Fragen. Wenn ich das:
Code:
IAnimatedMesh* mesh = smgr->getMesh("Objekt.Md2");
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);

anwende irritiert mich das Animated dadrin, wie lautet die funktion um nicht animierte Objeke zu laden und einen Node zu erstellen?

Und wie lautet der Befehl um ein Mesh zu bewegen? Ich habe aus dem Example 4 das hier:
Code:
core::vector3df v = node->getPosition();
v.X += 0.1f;
node->setPosition(v);

Aber ist das so auch richtig? Funktioniert zwar aber gibt es auch noch eine andere Möglichkeit?


Und in meiner alten Sprache, konnte man ein Objekt abhängig von seinem Momentanen Drehwinkel bewegen, also wenn ich vor dieser Gehroutine ein:
Code:
node->setRotation(core::vector3df(0,180.0f,0));

Setzte bewegt er sich ja immernoch in genau die gleiche Richtung, wie bewerkstellige ich das er sich dann z.b. genau andersrum dreht (Sind ja 180 Grad also einmal eine Halbe Drehung. Aber bitte jetzt nicht sagen ich soll bei der Gehroutine ein - statt dem + Zeichen nehmen...)

Wäre super wenn mir jemand diese Fragen beantworten könnte,

Mfg

Blitz303


Nach oben
 Profil  
 
BeitragVerfasst: 16.08.2007, 16:12 
Offline
Moderator

Registriert: 26.03.2007, 20:06
Beiträge: 114
Ja es gibt noch eine andere Möglichkeit. Dabei lädst du auch erst das Animated Mesh, lässt dir dann einen bestimmten Frame des Meshs geben und erstellst damit den IMeshSceneNode.
Etwa so:
Code:
IAnimatedMesh *mesh = smgr->getMesh("Pfad");
IMeshSceneNode *node2 = smgr->addMeshSceneNode(mesh->getMesh(0),0,-1,vector3df(Position));

Wie du siehst, holst du dir einen bestimmten Frame des Meshs mit mesh->getMesh(Framenummer), wobei bei nichtanimierten Meshs immer die 0 Standart ist.

Das bewegen der SceneNodes stimmt schon so, was gefällt dir daran nicht? Mir hat das bis jetzt immer so gereicht...

Zur dritten Frage kann ich nix sagen, hab ich so noch nie gebraucht, ich verwalte sowas im Gamecode...


Nach oben
 Profil  
 
BeitragVerfasst: 16.08.2007, 16:59 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Nein, afaik gibt es keine Funktion, um einen SceneNode relativ zu bewegen.
Schreib dir sie halt selber, Hilfe dazu (und vor allem zu der Sache mit der Rotation und der Bewegung in die neue Richtung) gibt es in dem Thread:
viewtopic.php?f=1&t=128

Vllt kannst du das ja in die Engine integrieren und dann als Patch hier reinstellen für die, die ähnliche Funktionalität wollen? *duck*

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 16.08.2007, 19:50 
Offline

Registriert: 16.08.2007, 15:22
Beiträge: 34
Naja, erstmal muss der Rest her aber wenn ich sowas hinbekomme kriegt ihr es natürlich ;-)

Hab jetzt aber noch eine andere Frage, einem Objekt erstens eine Farbe geben und zweitens, so eine Art Glanz einfügen, gibts sowas?


Nach oben
 Profil  
 
BeitragVerfasst: 17.08.2007, 00:50 
Offline
Benutzeravatar

Registriert: 24.07.2007, 23:11
Beiträge: 283
Achtung jetzt kommt ein völlig unqualifizierter Kommentar:


textur + shader xD
so hätt ichs jetzt gemacht

_________________
Be Fluffy!
kemomi.de


Nach oben
 Profil  
 
BeitragVerfasst: 17.08.2007, 09:53 
Offline

Registriert: 16.08.2007, 15:22
Beiträge: 34
Textur versteh ich, aber wie erstelle ich so einen shader und wie benutz ich ihn?
Also bei mir kommt eh immer wenn ich das Shader Tut anmache "Could not create Vertex Shader", aber an der Hardware kanns nicht liegen, eine der neusten NVidea Karten...


Nach oben
 Profil  
 
BeitragVerfasst: 17.08.2007, 15:24 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Dann wird das wohl irgendein Problem mit dem Treiber sein... OS?

Übrigends war der Kommentar imho alles andere als unqualifiziert (oder ich bin das auch^^), für realistische Glanzeffekte braucht man das wohl.

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 17.08.2007, 17:39 
Offline

Registriert: 16.08.2007, 15:22
Beiträge: 34
Ich habs grad auch mal mit DirectX8 gemacht, nur mit 9, da gibts Probleme, Aber warum? Meine Graka unterstützt DirectX10 und Shader Version 4, liegts an der DX installation? Soll ich einfach mal neu installieren? Naja, ich hab auf jeden Fall mal so das Example auf mein Prog übertragen, und wenn ich es starte krieg ich keine Fehlermeldung aber sobald er dann von der Konsole ins Fullscreen springt stürzt das Programm ab und diese Windowsmeldung mit "Programm reagiert nicht, wollen sie ein Bericht an Microsoft schicken?" kommt, ich geb euch einfach mal das ganze Prog, weil ich kein Plan habe woran das jetzt liegen könnte...

Code:
#include <irrlicht.h>
#include <iostream>

using namespace irr;
using namespace std;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


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


//--------------------------------------------------------------------Vorbereitungen für den Shader

IrrlichtDevice* device = 0;

class MyShaderCallBack : public video::IShaderConstantSetCallBack
{
public:

   virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
   {
      video::IVideoDriver* driver = services->getVideoDriver();

//--------------------------------------------------------------------Setze invertierte Welt Matrix
      core::matrix4 invWorld = driver->getTransform(video::ETS_WORLD);
      invWorld.makeInverse();

      services->setVertexShaderConstant(invWorld.pointer(), 0, 4);

//-------------------------------------------------------------------------------Clip Matrix setzen
      core::matrix4 worldViewProj;
      worldViewProj = driver->getTransform(video::ETS_PROJECTION);         
      worldViewProj *= driver->getTransform(video::ETS_VIEW);
      worldViewProj *= driver->getTransform(video::ETS_WORLD);

       services->setVertexShaderConstant(worldViewProj.pointer(), 4, 4);

      core::vector3df pos = device->getSceneManager()->
         getActiveCamera()->getAbsolutePosition();

      services->setVertexShaderConstant(reinterpret_cast<f32*>(&pos), 8, 1);

      // set light color

      video::SColorf col(0.0f,1.0f,1.0f,0.0f);

      services->setVertexShaderConstant(reinterpret_cast<f32*>(&col), 9, 1);

      // set transposed world matrix
         
      core::matrix4 world = driver->getTransform(video::ETS_WORLD);
      world = world.getTransposed();

      services->setVertexShaderConstant(world.pointer(), 10, 4);

   }
};



int main()
{
    cout << "-------------------------------------------------------------------------------\n";
    cout << ">>>>>>>>>>>>>>>>>>>>>Bitte warten, es wird initialisiert<<<<<<<<<<<<<<<<<<<<<<<\n";
    cout << "-------------------------------------------------------------------------------\n";
   
   

   IrrlichtDevice *device = createDevice(EDT_DIRECT3D8, dimension2d<s32>(1024, 768), 32, true, true);

   device->setWindowCaption(L"Project");   
   
    video::IVideoDriver* driver = device->getVideoDriver();
   ISceneManager* smgr = device->getSceneManager();
   IGUIEnvironment* guienv = device->getGUIEnvironment();
   
//--------------------------------------------------------------------------------------------Boden
    IAnimatedMesh *bodenMesh = smgr->getMesh("Boden.3ds");
    IMeshSceneNode *bodenNode = smgr->addMeshSceneNode(bodenMesh->getMesh(0),0,-1,vector3df(0,0,0));
   
    bodenNode->setMaterialFlag(EMF_LIGHTING, false);
   
//-------------------------------------------------------------------------Kamera und ihre Bewegung
    scene::ICameraSceneNode *camera = smgr->addCameraSceneNode(0, vector3df(100,200,-100), vector3df(0,50,0));
   
    scene::ISceneNodeAnimator* camAnimator = 0;
   camAnimator = smgr->createFlyCircleAnimator (core::vector3df(0,150,0),250.0f,0.0002);
   camera->addAnimator(camAnimator);
   camAnimator->drop();
//--------------------------------------------------------------------------------------------Nebel

   driver->setFog(video::SColor(255,100,101,140), true, 600, 1000, 0, true);
   bodenNode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
   
//-------------------------------------------------------------------------Licht und seine Bewegung

    scene::ISceneNode* lichtNode = 0;
   
   lichtNode = smgr->addLightSceneNode(0, core::vector3df(0,0,0),video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 300.0f);
   scene::ISceneNodeAnimator* lichtAnimator = 0;
   lichtAnimator = smgr->createFlyCircleAnimator (core::vector3df(0,50,0),50.0f,0.0001);
   lichtNode->addAnimator(lichtAnimator);
   lichtAnimator->drop();
   
//-----------------------------------------------------------------Robotermodel und dessen Schatten

//Roboter
   scene::IAnimatedMesh* roboMesh = 0;
   
   roboMesh = smgr->getMesh("Robo.md2");
   scene::IAnimatedMeshSceneNode* roboNode = 0;
   roboNode = smgr->addAnimatedMeshSceneNode(roboMesh);
   roboNode->setFrameLoop(0, 100);
   roboNode->setAnimationSpeed(1);
   
   roboNode->setPosition(core::vector3df(0,0,0));
   roboNode->setScale(core::vector3df(0.1,0.1,0.1));
   
   roboNode->setMaterialFlag(video::EMF_LIGHTING, false);   
   roboNode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true);
   
//Seine Shader
    s32 materialShader = 0;

    video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
    MyShaderCallBack* shaderCallback = new MyShaderCallBack();
   materialShader = gpu->addShaderMaterialFromFiles("d3d8.vsh", "d3d8.psh", shaderCallback, video::EMT_TRANSPARENT_ADD_COLOR);
    roboNode->setMaterialType((video::E_MATERIAL_TYPE)materialShader);
   
//Dessen Schatten
   roboNode->addShadowVolumeSceneNode();
   smgr->setShadowColor(video::SColor(150,0,0,0));
   
   
   
//------------------------------------------------------------------------------------Hauptschleife
   while(device->run())
   {   
      driver->beginScene(true, true, SColor(255,100,101,140));
      
      smgr->drawAll();
      guienv->drawAll();
      driver->endScene();
   }
   
   device->drop();
   return 0;
   
}

Ist zwar ne Menge, aber hoffentlich könnt ihr mir ein bisschen Helfen, ist ja auch n bisschen ausdokumentiert...

Mfg

Blitz303


EDIT: Ok, der Fehler war die Robo.Md2 Datei, sie scheint fehlerhaft zu sein. Aber wenn ich es jetzt mit einem anderen Objekt versuche ist das Objekt einfach unsichtbar, egal ob ich den Shader EMT_TRANSPARENT_ADD_COLOR oder EMT_SOLID nehme, nix zu sehen. Aber wenn ich den Shader nicht zu dem Node zuweise seh ich das Objekt wieder also muss es ja irgendwie mit dem Shader zu tun haben...


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

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

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