Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » OpenGL » einfache Bewegung in Ogl 3d Umgebung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
28.12.2003, 11:03 Uhr
~RIP
Gast


Ich bin gerade beim Versuch ein 3D-Engine mit C++ in OpengGL zuschreiben.
Ich nutze im Moment...

C++:
//             Camerapos           Point to look at
gluLookAt( xpos, ypos, zpos,  viewX, viewY, viewZ,  0, 1, 0);


um mich in dieser Welt umzuschauen - allerdings müste ich für die Bewegung immer die x-y-zpos UND viewX-Y-Z Koordinaten berechen - das ist Recht kopliziert.

Gibts da noch etwas anderes womit ich "das Sichtfeld eines Spielers" einfacher berechnen kann. (Aber bitte nicht glTranslatef()!)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.12.2003, 11:08 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Glaube nicht das es da eine nicht so rechenintensive möglichkeit gibt
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.12.2003, 12:22 Uhr
~RIP
Gast


OK habe eine Möglichkeit ausgeknobelt ...
ist allerdings mit viel sinus und cosinus - also sehr rechenintensiv
Wäre schön wenn jemand ne Idee hätte wie man das verbessern kann.


C++:
// Code für Bewegung durch Tastatur
    if (keys[VK_UP])
    {
        xpos-=float(sin(yrot/57.2957797));
        ypos-=float(sin(xrot/57.2957797));
        zpos+=float(cos(yrot/57.2957797));
        viewX-=float(sin(yrot/57.2957797));
        viewY-=float(sin(xrot/57.2957797));
        viewZ+=float(cos(yrot/57.2957797));
    }
    if (keys[VK_DOWN])
    {
        xpos+=float(sin(yrot/57.2957797));
        ypos+=float(sin(xrot/57.2957797));
        zpos-=float(cos(yrot/57.2957797));
        viewX+=float(sin(yrot/57.2957797));
        viewY+=float(sin(xrot/57.2957797));
        viewZ-=float(cos(yrot/57.2957797));
    }
    if (keys[VK_LEFT])
    {
        xpos+=float(cos(yrot/57.2957797));
        zpos+=float(sin(yrot/57.2957797));
        viewX+=float(cos(yrot/57.2957797));
        viewZ+=float(sin(yrot/57.2957797));
    }
    if (keys[VK_RIGHT])
    {
        xpos-=float(cos(yrot/57.2957797));
        zpos-=float(sin(yrot/57.2957797));
        viewX-=float(cos(yrot/57.2957797));
        viewZ-=float(sin(yrot/57.2957797));
    }

// mein Mausheader - damit der Spieler sich auch "rotieren" kann :)
POINT    ms;            // Create a Point with current x and y mousecoordinates
POINT    oldms;        // stores the mousecoordinates of the last frame

bool CheckMouse()
{
    GetCursorPos(&ms);
    if (ms.x!=oldms.x)
    {
        int diff=ms.x-progx/2;
        yrot+=diff/10;
    }

    if (ms.y!=oldms.y)
    {
        int diff=ms.y-progy/2;
        xrot+=diff/10;
    }
    SetCursorPos(progx/2,progy/2); // Debug
    oldms.x=ms.x;
    oldms.y=ms.y;
    return true;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.12.2003, 12:58 Uhr
~RIP
Gast


wichtiger Nachtrag:
die Werte müssen so initialisiert werden - sonst gehts nett:

C++:
float    xpos=0.0f;
float    ypos=0.0f;
float    zpos=-1.0f;

float    yrot=0.0f;
float    xrot=0.0f;

float    viewX=0.0f;
float    viewY=0.0f;
float    viewZ=0.0f;



damit sollte die Maus besser funktionieren:


C++:
POINT    ms;            // Create a Point with current x and y mousecoordinates
POINT    oldms;        // stores the mousecoordinates of the last frame

bool CheckMouse()
{
    GetCursorPos(&ms);
    if (ms.x!=oldms.x)
    {
        int diff=ms.x-progx/2;
        yrot+=diff*0.2f;
    }

    if (ms.y!=oldms.y)
    {
        int diff=ms.y-progy/2;
        xrot+=diff*0.2f;
    }
    SetCursorPos(progx/2,progy/2);
    oldms.x=ms.x;
    oldms.y=ms.y;
    return true;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.12.2003, 13:42 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


@RIP:
Wie ich (glaube, das ich) sehe, kennst du dich ganz gut mit GL aus, weißt du zufällig wie man bei einer als 2D-Texture geladenen TGA eine bestimmte Farbe (z.b Weiß) transparent machen kann? Ich suche schon seit Wochen nach einer Möglichkeit...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.12.2003, 13:51 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@RIP
sinus und cosinus werden durch taylorreihen berechnet....
die laufen ziemlich weit (natürlich nicht bis unendlich) um das möglichst genau abzubilden. Kann sein das du performance gewinnst wenn du dir einen eingenen ungenauen sinus bzw. cosinus schreibt der nur die ersten 3-5 glieder berücksichtigt. die ganze krempel konvergiert ja dank der fakultät im nenner relativ schnell

sin(x) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! ......
cos(x) = 1- x^2/2! + x^4/4! - x^6/6! + x^8/8! .......
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.12.2003, 20:12 Uhr
~RIP
Gast


@FloSoft
Ich denke nicht das ich gute OpenGL-Kenntnise habe ...
mit den TGAs kann ich dir auch nett helfen - ich benutze immer noch BMP-Dateien - habe noch nie TGAs geladen

Vielleich kann man das ja irgendwie mit ner Maskentextur machen?! Bei diesem ...
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=20
... Tutorial von NeHe wird eine Maske benutzt um etwas kopmplett durchsichtig zu machen - jedoch keine bestimmte Farbe ...

PS: Falls du das mal hinbekommst schreibst mal ins Forum - würde mich auch mal interessieren wie das geht.

@Windalf
danke - gute Idee muss ich unbedingt mal probieren!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.12.2003, 21:59 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Habe herausgefunden wie:


C++:
#define RGBA_EQUAL 0
#define RGBA_GREATER 1
#define RGBA_LESS 2

GLubyte *RGB2RGBA(GLubyte *Image, int length, int bpp, UINT type, GLubyte *Transp)
{
  int multi = 3;
  if(bpp == 32)
    multi = 4;
  GLubyte *NewData = new GLubyte[length*4];
  for(int i=0; i<length; i++)
  {
    NewData[4*i + 0] = Image[multi*i + 0]; //R
    NewData[4*i + 1] = Image[multi*i + 1]; //G
    NewData[4*i + 2] = Image[multi*i + 2]; //B
    if(bpp == 32)
      NewData[4*i + 3] = Image[multi*i + 3]; //A
    switch(type)
    {
    case RGBA_EQUAL:
      {
        if(Image[multi*i + 0] == Transp[0] && Image[multi*i + 1] == Transp[1] && Image[multi*i + 2] == Transp[2] )
          NewData[4*i + 3] = 255;    //A
        else
          NewData[4*i + 3] = 0;    //A
      } break;
    case RGBA_GREATER:
      {
        if(Image[multi*i + 0] < Transp[0] && Image[multi*i + 1] < Transp[1] && Image[multi*i + 2] < Transp[2] )
          NewData[4*i + 3] = 255;    //A
        else
          NewData[4*i + 3] = 0;    //A
      } break;
    case RGBA_LESS:
      {
        if(Image[multi*i + 0] > Transp[0] && Image[multi*i + 1] > Transp[1] && Image[multi*i + 2] > Transp[2] )
          NewData[4*i + 3] = 255;    //A
        else
          NewData[4*i + 3] = 0;    //A
      } break;
    }
  }
  free(Image);
  return NewData;
}



benutzen kannst du es z.b so:


C++:
GLubyte Transp[] = {240,240,240};
UINT width = 256,height = 256;
UBYTE *imageData = (UBYTE *)malloc(width*height*3);
// einlesen: ...
imageData = RGB2RGBA(imageData,width*height, 24, RGBA_GREATER, Transp)
// textur erstellen: ...
free(imageData);


in obigem Fall wird jede Farbe, die "größer" als 240,240,240 ist, Transparent.
Wenn man eine bestimmte Farbe angeben will muss man

RGBA_EQUAL

eintragen,
für einen alle Farben kleiner als den eingegebenen Wert

RGBA_LESS

der übergebene Buffer hat in obigem Fall nur RGB-Werte, wie z.b von einem Bitmap. Wenn man schon Images mit Alpha-Channel (z.b TGA's) hat, muss man statt 24 32 vor RGBA_* eintragen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.12.2003, 03:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ach so ich vergas zu erwähnen...
wenn du dabei rechenzeit sparen willst solltest du in deiner funktion nicht sowas wie pow oder so verwenden
das muss in etwa in der art gemacht werden wie bei diesem Golfrätsel
also eine variable zum merken der potenzen damit man diese bei jedem schritt nur mit -x^2 multiplizieren muss....
und ein zum merken der fakultät damit man dann immer nur noch mit (n+1)*(n+2) multiplizieren muss...

kannst der funktion ja übergeben wie viele glieder die berücksichtigen soll dann kannst du es einfacher testen....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
31.12.2003, 13:56 Uhr
~RIP
Gast


@FloSoft@Windalf

Danke für eure Hilfe! ... Ich weiß gar nicht was ich zu erst programmieren soll vor lauter Ideen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ OpenGL ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: