• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Problema camera irrlicht
#1
Ciao a tutti,
sto cercando di creare un videogioco tipo 3d con un personaggio che si muove per la mappa e spara ai nemici, ma non riesco ad attaccare la camera al personaggio in modo che lo segua. Qualcuno può dirmi come fare?
Grazie Shy
 
Rispondi
#2
Non capirò mai perché hanno fornito Irrlicht di una cameraFPS e di una inutile cameraMaya ma non di una CameraTPS generica e configurabile.

Se ho ben capito il tuo problema è fare si che la camera "segua" il target, perché probabilmente già lo punti tramite il setTarget(). Ora non devi fare altro che mantenere costante (o in un range) la camera dal player che si muove tramite il setPosition().

Non ritrovo il link dal forum ufficiale di Irrlicht (dove ci sono diversi esempi) ma il sorgente ce l'ho (una possibile soluzione):
Codice:
//I3rdPersonCam.h                          3rd Person camera for Irrlicht 3D 1.1  
// version 0.1

#include <irrlicht.h>
using namespace irr;
using namespace irr::core;
using namespace irr::scene;
// 1.  create I3rdPersonCam object <Cam1>;
// 2.  attach a CameraSceneNode with Cam1.attachCamera()
// 3.  Set a target with Cam1.setTarget()
// 4.  call Cam1.modOrientation(pan, tilt, zoom) or Cam1.setOrientation(pan, tilt, zoom) to position camera
// 5.  call Cam1.updatePosition() to apply new Position data
// 6.  repeat 4 and 5 as needed



class I3rdPersonCam{

public:
   float camPan;
   float camTilt;
   float camZoom;
   float maxZoom;
   float camSpeed;
   ICameraSceneNode* cam;
   ISceneNode* camTarget;
   vector3df offset;
  
   I3rdPersonCam(){
      camPan=0;
      camTilt=45;
      camZoom=14;
      maxZoom=250;
      camSpeed=1;
      }

   void setTarget(ISceneNode *newTarget){
      camTarget=newTarget;
      }

   void setOffset(vector3df newOffset){
      offset=newOffset;
      }

   void attachCamera(ICameraSceneNode *camtoattach){
      cam=camtoattach;
      }

   void modOrientation(float pan1,float tilt1,float zoom1){
      camPan=camPan+pan1;
      camTilt=camTilt+tilt1;
      camZoom=camZoom+zoom1;
      if(camPan>360)camPan=camPan-360;
      if(camPan<-360)camPan=camPan+360;
      if(camTilt>89)camTilt=89;
      if(camTilt<-89)camTilt=-89;
      if(camZoom>maxZoom)camZoom=maxZoom;
      if(camZoom<0)camZoom=0;
      }

   void setOrientation(float pan1,float tilt1,float zoom1){
      camPan=pan1;
      camTilt=tilt1;
      camZoom=zoom1;
      }


void updatePosition()
{
vector3df CPosVector;
vector3df NewCamLocation;
vector3df Target1;
//CamPan==0 places camera behind Model--- CamPan range 0-360
//camTilt inputs should be between -89 and +89
CPosVector.X=cos((camPan+180)*PI/180)*sin((camTilt+90)*PI/180);
CPosVector.Y=cos((camTilt+90)*PI/180);
CPosVector.Z=sin((camPan+180)*PI/180)*sin((camTilt+90)*PI/180);

matrix4 m2;
m2.setRotationDegrees(camTarget->getRotation());
m2.transformVect(CPosVector);

Target1=camTarget->getPosition()+offset;
NewCamLocation.X=Target1.X+CPosVector.X*camZoom;
NewCamLocation.Y=Target1.Y+CPosVector.Y*camZoom;
NewCamLocation.Z=Target1.Z+CPosVector.Z*camZoom;

cam->setPosition(NewCamLocation);
cam->setUpVector(vector3df(0,1,0));
cam->setTarget(vector3df(Target1));
cam->updateAbsolutePosition();
}

};

Ora fai attenzione alla parte finale dove c'è NewCamLocation e Target1. Qui viene presa la posizione del player (il camTarget), spostato di offset (un vettore che ti da la distanza cui si deve trovare la camera) e quindi individuata la nuova posizione della camera (NewCamLocation) considerando anche un vettore CPosVector ottenuto dalle camPan (orizzontale), camTilt (su giu) e lo Zoom (cercare i movimenti PTZ).

Se ti muovi in ambienti chiusi considera sulla camera una collisione sferica di raggio almeno 1/4 dell'altezza del player (una pallina) affinché possa restare nel livello e non superare i muri quando quest'ultimo li avvicina troppo.

Prendi anche in considerazione l'uso del tool di Ambiera come surrogato di un Unity3D per gestire le tue scene e le particelle altrimenti diventi pazzo Undecided http://www.ambiera.com/irredit/
 
Rispondi
#3
Grazie per avermi risposto!Veramente non lo puntavo nemmeno con setTarget..Blush Il codice che mi hai postato in che modo va usato? Va sostituito alla camera o va aggiunto? Scusami ma ho appena incominciato con irrlicht e non capisco bene ancora tutto...
 
Rispondi
#4
Figurati siamo qui apposta Big Grin questo è un ".h" quindi salvalo così e usalo seguendo i punti .1 .2 che l'autore indica. qundi facci l'include poi crea l'oggetto cam1, aggancialo allo scenemanager principale eccc. in pratica è come un sistituto o se vuoi alternativa alla cameraFPS. In realtà poi te lo avevo indicato solo per farti prendere spunto e correggere il tuo src. per farti capire come fare. se vuoi sostituire tutto poi potremmo cercare altri script. ce ne è uno anche su irrlichtitalia.altervista.org con tanto di tutorial sulla camera TPS. però devi sapere bene il.C++ e farti alla lettera i tutorial ufficiali fino a saperli a memoria Wink altrimenti leggeremo presto di te nella cronaca nera per esserti buttato dalla finestra dalla disperazione Big Grin
 
Rispondi
#5
Sono andato sul sito ufficiale di unity e... il download pesa 1 giga e mezzo. e io ho una connessione lenta!Dodgy Mi sa che proverò qualcos'altro...
 
Rispondi
#6
doh! Confused non riesci a trovare soluzioni alternative? un amico con una flat più veloce? dove stai? magari qualcuno del forum che sta vicino a te può farti un DVD. Non penso venga allegato nelle riviste, almeno non ricordo di averlo mai visto.
 
Rispondi
#7
Mah penso che lascerò lì il computer tutto il pomeriggio.Sleepy Sono andato sul sito di cryengine ma non trovo il download.Huh E unity mi sembra quello più affidabile. Smile Sto ancora provando con la camera di irrlicht, quando ce la faccio ti informo.

Scusami, come si fa in code blocks a includere un .h e poi a passare da il file main al file .h? Sono bloccato qua...
 
Rispondi
#8
Non conosco codebocks ma in generale una libreria è composta dal file .h con la definizione della classe e un file cpp. (stessi nomi) con la parte del codice dei suoi mebri, metti tutto nella stessa cartella dove si trova il tuo sorgente principale e dentro al sorgente principale dove ci saranno gli include standard di irrlicht aggiungi questo include :
#include "I3rdPersonCam.h"

Può essere che codeblocks capisca che deve anche compilare il .cpp referenziato dal file .h altrimenti devi compilare prima il .cpp/.h per farti una libreria statica (su pc win sarà un file .obj ma dipende dai compilatori).

A quel punto i comandi "nuovi" presenti in quella libreria saranno disponibili nel tuo sorgente primario.

In alternativa, per ora, fai tutto statico, metti tutto nel tuo sorgente principale, la classe e i suoi membri.

http://www.codeblocks.org/docs/main_codeblocks_en.html (2.11.5)
http://msdn.microsoft.com/it-it/library/ms235627.aspx
http://msdn.microsoft.com/it-it/library/36k2cdd4.aspx
http://it.wikiversity.org/wiki/C%2B%2B#Include
 
Rispondi
#9
Sono riuscito a scaricare unity!!!Big Grin D'ora in poi proverò anche con unity a creare un videogioco!Smile Ma andrò avanti anche con irrlicht... Wink
 
Rispondi
#10
Come vuoi, Irrlicht e C++ forse sono più appaganti per uno che ama programmare "di brutto" ma vedrai che con Unity ti diverti lo stesso; lo sto studiano da settembre e lo trovo spassosissimo. L'importante è capire bene come funziona l'editor e come si sviluppano gli script tra i vari oggetti. Consiglio il C# come scelta per lo scripting. Tutorial ne trovi quanti ne vuoi e qui ci sono persone valide che sanno dare una mano.
 
Rispondi
#11
Grazie Chip per tutti i tuoi consigli,Wink per chiedere su unity mi devo spostare di sezione, vero? Altrimenti i moderatori si arrabbiano... Tongue
 
Rispondi
#12
sì chiedi di la e...dadaaaaa! rispondo io..no scherzo ci sono altri che ne sanno molto di più Big Grin
 
Rispondi
#13
Grazie ci vediamo là!Smile
 
Rispondi
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Irrlicht Engine Chip 9 2,113 01-11-2016, 12:48 AM
Ultimo messaggio: Chip
  Irrlicht Engine Info e Download friskon 12 6,264 12-04-2013, 11:25 AM
Ultimo messaggio: war10hacker
Question Problema irrlicht con directx Zettamax 0 1,454 23-02-2012, 06:49 PM
Ultimo messaggio: Zettamax
  [TUTORIAL] Irrlicht - Primo Approccio ManHunter 5 3,525 02-01-2012, 07:16 PM
Ultimo messaggio: steve
  [Irrlicht.net] Tutorial 1 - Tradotto Riddick 2 2,208 05-05-2011, 01:02 AM
Ultimo messaggio: ManHunter
  Irrlicht.Net Riddick 8 2,697 10-02-2011, 12:59 AM
Ultimo messaggio: Riddick
  irrlicht 1.7 puorcunicu 15 3,751 22-10-2010, 10:26 PM
Ultimo messaggio: Jonathan Archer
  Prima prova con irrlicht steve 4 2,166 10-07-2010, 08:31 PM
Ultimo messaggio: Riddick
  Download dei tool free e guide per Irrlicht Riddick 2 1,949 03-06-2010, 08:48 PM
Ultimo messaggio: Riddick
  Installare Irrlicht su: Dev-C++ e Code::Bocks Riddick 9 4,018 03-06-2010, 02:48 PM
Ultimo messaggio: Riddick

Vai al forum:


Browsing: 1 Ospite(i)