Aktuelle Zeit: 17.05.2024, 10:32

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Schusslöcher
BeitragVerfasst: 23.07.2009, 17:03 
Offline

Registriert: 05.09.2007, 15:01
Beiträge: 103
Huhu,
wollte mal fragen ob es mit IrrLicht möglich ist Einschusslöcher zu machen. Wenn ja, wie?

Mein Ansatz wäre: Einen BillboardSceneNode erstellen und diesen an den Einschlagspunkt der "Kugel" positionieren und anschliessend so ausrichten dass der Billboard Node glatt auf der Fläche draufliegt. Ich weiss leider nicht wie ich verhindern kann dass sich die Billboard Nodes nicht mehr zur Kamera drehen und wie ich herausfinde dass dieser Node nach dem drehen auch richtig liegt.

Danke für eine Antwort.

[EDIT] So, wie ich die Normale von dem Einschlagspunkt herausbekomme weiss ich jetzt, jetzt muss ich nur noch herausfinden wie man einem BillBoardSceneNode sagen kann dass er sich nicht zur Kamera ausrichten soll.

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 23.07.2009, 20:53 
Offline

Registriert: 21.05.2009, 23:10
Beiträge: 17
Im englischen Forum gibts einen Code für Decals:

http://irrlicht.sourceforge.net/phpBB2/ ... c&start=15


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 23.07.2009, 21:58 
Offline

Registriert: 05.09.2007, 15:01
Beiträge: 103
Wenn ich die 2 Dateien include dann kommen folgende 2 Fehler:
Code:
|4|error: redefinition of `class DecalSceneNode'|
|4|error: previous definition of `class DecalSceneNode'|


Ich versteh nicht was das soll ._.

Und die hier werden included:

Decalscenenode.h

Code:
#include <irrlicht.h>
#include <time.h>
using namespace irr;
class DecalSceneNode : public scene::ISceneNode
{
protected:
   core::aabbox3d<f32> Box;
   video::S3DVertex Vertices[4];
   video::SMaterial Material;

public:

DecalSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, core::triangle3df tri, core::vector3df intersection, video::ITexture* image);
         core::vector3df pointA;
      core::vector3df pointB;
      core::vector3df pointC;
      float posA;
      float posB;
      float posC;
       core::vector3df trinormal;
      float basesize;

      float dotcorrection;
       video::IVideoDriver* driver;
   
       core::line3d<f32> line1;
       core::vector3df v1;
       core::vector3df v2;
       core::line3d<f32> line2;
       core::vector3df v3;
             
       core::vector3df squarepA;
       core::vector3df squarepB;
       core::vector3df squarepC;
       core::vector3df squarepD;
       
      time_t c_time;
      time_t d_time;
      double lifeSpan;

void setLifeSpan(double seconds);
float getSize();
void OnPreRender();

void render();
   

const core::aabbox3d<f32>& getBoundingBox() const;

   virtual s32 getMaterialCount();
   
   virtual video::SMaterial& getMaterial(s32 i);

};



Decalscenenode.cpp

Code:
/*
bullethole/decal class
by Armen138

before creating an instance of this class, i assume you got:
1. the triangle you hit with your weapon
2. the coordinates(intersection point) you hit the triangle at
3. the texture you want to display on the decal
4. the size you want the bullethole to be(you'll have to experiment a little with this one)

these are the last 4 arguments for the constructor.

this will create a square decal displaying your texture on the wall you hit
with a weapon shooting in a straight line.
*/

#include <irrlicht.h>
#include "decalscenenode.h"
#include "time.h"
using namespace irr;
DecalSceneNode::DecalSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, core::triangle3df tri, core::vector3df intersection, video::ITexture* image, float size): scene::ISceneNode(parent, mgr, 0)
{           
      time(&c_time);   
      lifeSpan=0;
      pointA=tri.pointA;
      pointB=tri.pointB;
      pointC=tri.pointC;
      posA=intersection.X;
      posB=intersection.Y;
      posC=intersection.Z;
       trinormal=tri.getNormal();     
      dotcorrection=1;
       video::IVideoDriver* driver = SceneManager->getVideoDriver();
           
       Material.Wireframe = false;
       Material.Lighting = false;
       
       this->setMaterialType( video::EMT_TRANSPARENT_ALPHA_CHANNEL  );
       this->setMaterialFlag(video::EMF_LIGHTING, true);
       this->setMaterialTexture(0, image );
      basesize=size/2;


       trinormal=trinormal.normalize();
       core::line3d<f32> line1(pointA, pointB);
       core::vector3df v1 = line1.getVector().normalize();
       core::vector3df v2 = line1.getClosestPoint( pointC );
       core::line3d<f32> line2(v2,pointC);
       core::vector3df v3 = line2.getVector().normalize();
             
       core::vector3df squarepA=(v1*-basesize)+trinormal*dotcorrection+(v3*-basesize);
       core::vector3df squarepB=squarepA+(v1*basesize*2);
       core::vector3df squarepC=squarepA+(v1*basesize*2)+(v3*basesize*2);
       core::vector3df squarepD=squarepA+(v3*basesize*2);


       squarepA=squarepA+core::vector3df(posA,posB,posC);
       squarepB=squarepB+core::vector3df(posA,posB,posC);
       squarepC=squarepC+core::vector3df(posA,posB,posC);
       squarepD=squarepD+core::vector3df(posA,posB,posC);

       Vertices[0] = video::S3DVertex(squarepA.X,squarepA.Y,squarepA.Z, 1,0,0,video::SColor(255,255,255,255),1,0);
       Vertices[1] = video::S3DVertex(squarepB.X,squarepB.Y,squarepB.Z, 1,0,0,video::SColor(255,255,255,255),1,1);
       Vertices[2] = video::S3DVertex(squarepC.X,squarepC.Y,squarepC.Z, 1,0,0,video::SColor(255,255,255,255),0,1);
       Vertices[3] = video::S3DVertex(squarepD.X,squarepD.Y,squarepD.Z, 1,0,0,video::SColor(255,255,255,255),0,0);


       Box.reset(Vertices[0].Pos);
       for (s32 i=1; i<4; ++i)
           Box.addInternalPoint(Vertices[i].Pos);
   }


void DecalSceneNode::setLifeSpan(double seconds){
   lifeSpan=seconds;
}

float DecalSceneNode::getSize(){
   return basesize*2;
}
void DecalSceneNode::OnPreRender()
   {                   
      if(lifeSpan>0){if(difftime(time(NULL),c_time) > lifeSpan)SceneManager->addToDeletionQueue(this);}
       if (IsVisible)
           SceneManager->registerNodeForRendering(this);

       ISceneNode::OnPreRender();
   }

void DecalSceneNode::render()
   {     
       u16 indices[] = { 0,1,2, 0,2,3};
       video::IVideoDriver* driver = SceneManager->getVideoDriver();

       driver->setMaterial(Material);
       driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
       driver->drawIndexedTriangleList(&Vertices[0], 4, &indices[0], 2);
   }

const core::aabbox3d<f32>& DecalSceneNode::getBoundingBox() const
   {         
       return Box;
   }

s32 DecalSceneNode::getMaterialCount()
   {
       return 1;
   }

video::SMaterial& DecalSceneNode::getMaterial(s32 i)
   {
       return Material;
   }



[EDIT]

Wenn ich die Dateien nirgends Include sondern einfach so mit kompilieren (schreibt man das so?) lasse dann kommt folgender Fehler:

Code:
decalscenenode.cpp|21|error: prototype for `DecalSceneNode::DecalSceneNode(irr::scene::ISceneNode*, irr::scene::ISceneManager*, irr::core::triangle3df, irr::core::vector3df, irr::video::ITexture*, float)' does not match any in class `DecalSceneNode'|

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 24.07.2009, 06:51 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Also das mit den Mehrfach-Definitionen kann daher kommen, dass das Include File über irgendwelche Wege mehrmals included wird. Als Abhilfe kann man am Anfang der Datei

Code:
#ifndef _DECAL_SCENE_NODE
  #define  _DECAL_SCENE_NODE


und am Ende

Code:
#endif


reinschreiben. Ich mach das bei meinen Sachen immer automatisch ;).

Die andere Sache: wenn ich das richtig sehe, dann fehlt im .h File beim Prototypen des Konstruktors der letzte Parameter ("float size"). Einfach hinzufügen, neu Kompilieren und das sollte passen.

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 24.07.2009, 13:15 
Offline

Registriert: 05.09.2007, 15:01
Beiträge: 103
Danke, das Funktioniert jetzt. Aber kann es sein dass es bei Irrlicht 1.5 die Funktion
Code:
ISceneNode::OnPreRender()

nicht mehr gibt? Denn dort bekomm ich immer eine dementsprechende Fehlermeldung.

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 24.07.2009, 20:24 
Offline

Registriert: 21.05.2009, 23:10
Beiträge: 17
Ja, die sind geändert worden laut Changelog.
Kannst du umbenennen in "onRegisterSceneNode()"


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 25.07.2009, 02:45 
Offline

Registriert: 05.09.2007, 15:01
Beiträge: 103
Mein Held =D

Ok noch eine Frage: wir bekomm ich die Decals angezeigt? Muss ich die alle einzelnd rendern lassen oder gibts da nen Befehl der Decals zu einer "Renderliste" hinzufügt? Die Funktion "Decal->OnPreRender()" scheint es nicht zu sein...

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 25.07.2009, 21:24 
Offline

Registriert: 21.05.2009, 23:10
Beiträge: 17
Eigentlich sollten die auch so schon sichtbar sein...
Eventuell falschen Pfad zur Textur oder so genommen?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 25.07.2009, 21:54 
Offline

Registriert: 05.09.2007, 15:01
Beiträge: 103
Nein der Pfad ist richtig, ich sehe das Decal ja kurz aufblitzen wenn ich ein decal->render() gleich nach dem erstellen benutze aber dieses verschwindet sofort wieder.
Ich hab mir jetzt testweisse eine Struct geschrieben die immer die letzten 100 erstellten Decals rendert und siehe da: es klappt!

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 25.07.2009, 23:33 
Offline

Registriert: 05.09.2007, 15:01
Beiträge: 103
Oh ich vergaß zu erwähnen:

Die Decals werden einfach als weiße Vierecke dargestellt ohne Textur...obwohl eine Textur drauf kommen müsste und laut debugger diese auch geladen wurde, aber es bleibt immer weiß...

Hier ein screenshot:
Bild

(Sorry für doppelpost aber sonst geht der Thread noch unter :D)

_________________
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 26.07.2009, 19:33 
Offline

Registriert: 21.05.2009, 23:10
Beiträge: 17
Wie sieht denn dein Code momentan aus?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Schusslöcher
BeitragVerfasst: 26.07.2009, 21:36 
Offline

Registriert: 05.09.2007, 15:01
Beiträge: 103
Code:
line3d<f32> line;
line.start = camera->getPosition();
line.end = line.start + (camera->getTarget() - line.start).normalize() * 1000.0f;

vector3df targetPoint;
triangle3df triangle;
if(smgr->getSceneCollisionManager()->getCollisionPoint(line,metaSelector,targetPoint,triangle))
{
       DecalSceneNode* dot=new DecalSceneNode(smgr->getRootSceneNode(),smgr,tri_point,col_point,driver->getTexture("hole.png"),10.0f);
}


Das ist alles was für die decals gebraucht wird und ja das bild Hole.png existiert ;)

_________________
Bild


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

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de