dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

kamera
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> OpenGL
View previous topic :: View next topic  
Author Message
Angel



Joined: 02 Jan 2005
Posts: 113
Location: Latvija

PostPosted: Wed Jan 26, 2005 12:47 am    Post subject: kamera

Man te ir viena baigi pinkeriigaa probleema. [All Post Hawe been deleted] Vairs Nav =)

Last edited by Angel on Wed Jan 26, 2005 2:42 pm; edited 1 time in total
Back to top
View user's profile Send e-mail
Angel



Joined: 02 Jan 2005
Posts: 113
Location: Latvija

PostPosted: Wed Jan 26, 2005 9:53 am    Post subject:

[Post have been deleted]

Last edited by Angel on Wed Jan 26, 2005 2:43 pm; edited 2 times in total
Back to top
View user's profile Send e-mail
Angel



Joined: 02 Jan 2005
Posts: 113
Location: Latvija

PostPosted: Wed Jan 26, 2005 2:39 pm    Post subject: Tutorial Kamerai

Pēc ~7stundu darba ir gatava kamera. Tajā vēl gan ir dažas nepilnības un trūkumi, bet kopumā jau strādā. Te būs viss kods, ko Tu vari paņemt un iekopēt savā projektā. Kā Tu Viņu izmanto man ir vienalga. Smile Smile

Centīšos komentēt.
///////////////////////////////////////////////////////
Iekš Camera.cpp:
Code:

#include "main.h"
#include "camera.h"

#include <math.h>

CVector3 Vector3; // Vector3 tiks izmantots, lai izsauktu funkcijas, kas atrodās iekš CVector3 struktūras

CCamera::CCamera(){
/* Kameras Konstuktors.*/
   CVector3 vPos = CVector3(0,0,-2);
   CVector3 vView = CVector3(0,0,0);
   CVector3 vUp = CVector3(0,1,0);

   c_position = vPos;
   c_view = vView;
   c_up = vUp;
}

void CCamera::Position(float pos_x, float pos_y, float pos_z,
              float view_x, float view_y, float view_z,
              float up_x, float up_y, float up_z){
/* Nostāda kameru, jāizsauc iekš InitGL vai kaut kā tamlīdzīga. Kamera nestrādās, ja tas netiks darīts*/

   CVector3 vPos = CVector3(pos_x,pos_y,pos_z);
   CVector3 vView = CVector3(view_x,view_y,view_z);
   CVector3 vUp = CVector3(up_x,up_y,up_z);

   c_position = vPos;
   c_view = vView;
   c_up = vUp;
}

void CCamera::Look(){
/* Vienkārši tiek aizstāts gluLookAt, lai nebūtu jāizsauc katrā kadrā.*/
   gluLookAt(   c_position.x,   c_position.y,   c_position.z,
            c_view.x,      c_view.y,      c_view.z,
            c_up.x,         c_up.y,         c_up.z);
}

void CCamera::Update(){
/* Domāju komentāri nav vajadzīgi, tikai izsauc katrā kadrā.*/
   CVector3 Strafe = Vector3.Perpendicular(c_position-c_view,c_up);
   c_strafe = Vector3.Vienibas(Strafe);

   MouseView();
   
   Keys();

}

void CCamera::Keys(){
/* Strādā ar taustiņu funkcijām. Stils paņemts no NeHe nehe.gamedev.net
   float speed;
   if(keys[VK_SHIFT])
      speed=0.4f;
   else
      speed=0.1f;
   
   //Moving
   if(keys[VK_UP] || keys['W']) Move(speed);
   if(keys[VK_DOWN] || keys['S']) Move(-speed);
   if(keys[VK_LEFT] || keys['A']) Strafe(-speed);
   if(keys[VK_RIGHT] || keys['D']) Strafe(speed);

//   if(keys[' '])Position(0,1.5,-1,0,1.5,0,0,1,0);

   // Viewing
   if(keys[VK_DELETE]) Rotate(0.05f,0,1,0);
   if(keys[VK_NEXT]) Rotate(-0.05f,0,1,0);
   if(keys[VK_HOME]) Rotate(-0.05f,1,0,0);
   if(keys[VK_END]) Rotate(0.05f,1,0,0);
}

void CCamera::Move(float speed){
/* Pārbīda uz priekšu, atpakaļ.
1)Paņem skata vektoru, tad to pārveido, lai nebūtu lielāks par Vienības vektoru.
2) Pie c_view un c_position pieskaita(atņem, ja speed = ar -) redzes vektoru pareizinātu ar ātrumu
*/
   CVector3 vView=c_position-c_view;

   vView = Vector3.Vienibas(vView);
// Ja vēlies kustēties arī pa y asi, tad izkomentē
   c_position.x+=vView.x*speed;
// šo   c_position.y+=vView.y*speed;
   c_position.z+=vView.z*speed;
   c_view.x+=vView.x*speed;
// šo   c_view.y+=vView.y*speed;
   c_view.z+=vView.z*speed;
//Vai arī visu šo nokomentējot virsējās 6 rindiņas
/*   c_position = c_position+(vView*speed);
   c_view = c_view + (vView*speed);
*/
}

void CCamera::Rotate(float angle, float x, float y, float z){
/*Pagriež kameru(viens no grūtākajiem uzdevumiem, jo pārvietojuma formulu nekur nevarēju atrast, beigās paņemta no www.gametutorials.com kameras =)
1) Atrod skata vektoru
2) Atrod sinusu un kosinusu no leņķa angle
3) Atrod vērtības( sīkāk nekomentēšu)
4) Atrastās vērtības pieskaita tikai pie c_view
*/
   CVector3 vView, vView2;
   vView = c_position-c_view;

   // From www.Gametutorials.com[tutorials] [camera2]
   float sinA = (float)sin(angle);
   float cosA = (float)cos(angle);

   vView2.x =   (cosA+(1-cosA)*x*x)      *vView.x+
            ((1-cosA)*x*y-z*sinA)   *vView.y+
            ((1-cosA)*x*z+y*sinA)   *vView.z;

   vView2.y =   ((1-cosA)*y*x+z*sinA)   *vView.x+
            (cosA+(1-cosA)*y*y)      *vView.y+
            ((1-cosA)*y*z-x*sinA)   *vView.z;

   vView2.z =   ((1-cosA)*z*x-y*sinA)   *vView.x+
            ((1-cosA)*z*y+x*sinA)   *vView.y+
            (cosA+(1-cosA)*z*z)      *vView.z;

   c_view = c_position + vView2;
}

void CCamera::Strafe(float speed){
/* Streifošana
1)atrod streifošanas vektoru ( pie Update() )
2)...*/
   c_position.x+=c_strafe.x*speed;
   c_position.z+=c_strafe.z*speed;

   c_view.x+=c_strafe.x*speed;
   c_view.z+=c_strafe.z*speed;
}

void CCamera::MouseView(){
/* Vērošana ar peli(Vai Kā citādāk pateikt?)
1)Atrod kursora koordinaates
2)Ja nav pakustējies, tad return
3)noliek kursoru atpakaļ centrā
4)Atrod pārvietojumu
5)...(skatīt tālāk)
6)Pagriež kameru(ja vaig)*/
   POINT mouse;
   int middleX = SCREEN_WIDTH >> 1;
   int middleY = SCREEN_HEIGHT >>1;
   float angleY=0;
   float angleZ=0;
   static float currentRotX   = 0.0f;
   static float lastRotX      = 0.0f;

   GetCursorPos(&mouse);

   if( (mouse.x == middleX) && (mouse.y == middleY) ) return;
   SetCursorPos(middleX,middleY);

   angleY = (float)(middleX-mouse.x)/500.0f;
   angleZ = (float)(middleY-mouse.y)/500.0f;


   currentRotX-=angleZ;
   // Ierobežots vērošanas leņķis 2 radiāni(t.i no -1 līdz 1)
   if(currentRotX > 1) currentRotX=1;
   else if(currentRotX < -1) currentRotX = -1;
   else{
      // Ja neiet pāri šim leņķim, tad ...
      CVector3 vAxis = Vector3.Perpendicular(c_position-c_view,c_up);
      vAxis = Vector3.Vienibas(vAxis);

      Rotate(angleZ,vAxis.x,vAxis.y,vAxis.z);
      Rotate(angleY,0,1,0);
   }
}

Iekš Camera.h:
Code:

#ifndef CAMERA_H
#define CAMERA_H
// izveidojam kameras klasi class CCamera
class CCamera{
private:
   // privātie lielumi
   CVector3 c_position;
   CVector3 c_view;
   CVector3 c_up;
   CVector3 c_strafe;
public:

   CCamera();// Kameras konstruktors

   // skatīt Camera.cpp
   void Position(   float posx, float posy, float posz,
               float viewx, float viewy, float viewz,
               float upx, float upy, float upz);

   void Look();

   void Update();

   void Keys();

   void MouseView();

   void Move(float speed);

   void Rotate(float alpha, float x, float y, float z);

   void Strafe(float speed);
};


Vēl ir jāpievieno vektoru matamātika, kas būs zemāk un ko nekomentēšu, ja neprasīsiet =)
////////////////////////////////////////
Vectors.cpp:
Code:

#include "main.h"
#include <math.h>

CVector3 Vienibas(CVector3 vV){
   float lenght = Lenght(vV);
   vV = vV/lenght;
   return vV;
}

float Lenght(CVector3 vV){
   // AB = sqrt( (x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2 )
   // x2 = 0, taatad:
   double lenght = sqrt( (vV.x*vV.x) + (vV.y*vV.y) + (vV.z*vV.z) );

   return (float)lenght;
}

CVector3 Perpendicular(CVector3 vV1, CVector3 vV2){
   CVector3 vPerp;

   vPerp.x = (vV1.y*vV2.z)-(vV1.z*vV2.y);
   vPerp.y = (vV1.x*vV2.z)-(vV1.z*vV2.x);
   vPerp.z = (vV1.x*vV2.y)-(vV1.y*vV2.x);

   return vPerp;
}



Un Pēdējais, Vectors.h:
Code:

#ifndef _VECTORS_H
#define _VECTORS_H

struct CVector3{
public:
   float x,y,z;

   CVector3() : x(0), y(0), z(0) {}

   CVector3(float X, float Y,float Z) : x(X),y(Y),z(Z){}

   CVector3 operator+(CVector3 vV){
      return CVector3(vV.x+x,vV.y+y,vV.z+z);
   }
   CVector3 operator-(CVector3 vV){
      return CVector3(vV.x-x,vV.y-y,vV.z-z);
   }
   CVector3 operator*(float k){
      return CVector3(x*k,y*k,z*k);
   }
   CVector3 operator/(float k){
      return CVector3(x/k,y/k,z/k);
   }
};

CVector3 Vienibas(CVector3 vV);

CVector3 Perpendicular(CVector3 vV1, CVector3 vV2);

float Lenght(CVector3 vV);

#endif


Vectors.h ir jāiekļauj iekš main.h nu, ja kaadam noderees, būšu pateicīgs, un arī dariet zināmu, ko var izdarīt vienkāršāk un\vai īsāk =).

Uhh, sorry, par tik garu postu! Embarassed Embarassed


Last edited by Angel on Wed Jan 26, 2005 5:32 pm; edited 3 times in total
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Jan 26, 2005 4:37 pm    Post subject:

Nesmuks konstruktors:
Code:
CCamera::CCamera(){
/* Kameras Konstuktors.*/
   CVector3 vPos = CVector3(0,0,-2);
   CVector3 vView = CVector3(0,0,0);
   CVector3 vUp = CVector3(0,1,0);

   c_position = vPos;
   c_view = vView;
   c_up = vUp;
}

Vai labāk nav šādi:
Code:
CCamera::CCamera() :
  c_position(CVector3(0,0,-2)),
  c_view(CVector3(0,0,0)),
  c_up(CVector3(0,1,0)) {
/* Kameras Konstuktors.*/
}

Tas pats ar CVector3 klasi:
Code:
CVector3() {}
CVector3(float X, float Y,float Z){
  x=X;y=Y;z=Z;
}

Labāk šādi:
Code:
CVector3() : x(0), y(0), z(0) {}
CVector3(float X, float Y,float Z) : x(X), y(Y), z(Z) {}


Kā arī CVector3 klasē, lai uzlaboto ātrdarbību visas metodes ieteicams definēt kā inline, un pie tam, ja parametris ir pati klase CVector3, tad padot to kā norādi, nevis lieku kopiju viedot (& simbols).
Back to top
View user's profile Send e-mail
Angel



Joined: 02 Jan 2005
Posts: 113
Location: Latvija

PostPosted: Wed Jan 26, 2005 5:14 pm    Post subject:

Ok, paldies. [Tutorial Edited]. Smile, Bet Ar Tadu Kameras Konstruktoru neiet cauri. Confused
Back to top
View user's profile Send e-mail
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 26, 2005 5:37 pm    Post subject:

bubu, vai tad ir jēga piesities pie tādiem sīkumiem? Vai tad jebkurš jēdzīgs kompilātors ar maximālo optimizācijas settingu pats neuztaisīs inline funkcijas no tādām "vienrindītēm"? Kā arī tiem konstruktoriem vajadzētu nokompilēties vienādi - galvenais, lai cilvēkam būtu salasāmāk. Nu tas IMHO. Par to padošanu kā norādi - tūlīt veikšu pāris testus, bet cik atceros ne vienmēr tas bija labākais variants.
_________________
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Wed Jan 26, 2005 5:40 pm    Post subject:

Nav ne jausmas par optimizāciju, tas jātestē. Bet ar to konstrukorā kola lietošanu gan iesaka lietot pie mainīgo inicializācijas. Īpaši jau nu piemēram CVector3() konstruktorā, kad vispār netiek inicalizēti privātie mainīgie.
Back to top
View user's profile Send e-mail
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 26, 2005 5:57 pm    Post subject:

Par to norādi vērtības vietā - Tev taisnība, tas tiešam to lietu paātrina, bet starpību starp konstruktoru tipiem gan neredzēju. Nu, bet, ja nu reiz iesaka Wink
_________________
Back to top
View user's profile Send e-mail
Angel



Joined: 02 Jan 2005
Posts: 113
Location: Latvija

PostPosted: Wed Jan 26, 2005 7:36 pm    Post subject:

Nu, labi, bet vai juus nepateiktu, kur to noraadi jaaliek(tik vienu, piemēram, lai tad es pats vareetu samekleet arii paareejaas)? Embarassed Embarassed
Back to top
View user's profile Send e-mail
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 26, 2005 7:52 pm    Post subject:

Vienkaarshi shita vietaa:
Code:

   CVector3 operator+(CVector3 vV){
      return CVector3(vV.x+x,vV.y+y,vV.z+z);
   }
   CVector3 operator-(CVector3 vV){
      return CVector3(vV.x-x,vV.y-y,vV.z-z);
   }

dari shitaa:
Code:

   CVector3 operator+(CVector3 &vV){
      return CVector3(vV.x+x,vV.y+y,vV.z+z);
   }
   CVector3 operator-(CVector3 &vV){
      return CVector3(vV.x-x,vV.y-y,vV.z-z);
   }

Labums ir taads, ka kompilatoram nevajag uztaisiit jaunu CVector tipa mainiigo un iekopeet tajaa datus no taa, kas tiek padots kaa arguments - tas prasa laiku. Bet taa vietaa vinsh izmanto to pashu mainiigo, kursh tiek padots funkcijai. Tas ir - ja tu mainiisi &vV ieksh funkcijas, mainiisies tas Vektors, kursh ir taas arguments.
_________________
Back to top
View user's profile Send e-mail
chaosman



Joined: 28 Oct 2003
Posts: 64
Location: Rīga

PostPosted: Wed Jan 26, 2005 8:13 pm    Post subject:

Starp citu, daliishanai labaak izmantot kautko tamliidziigu:
Code:

   CVector3 operator/(float k){
      float f = 1/k; // daliishanu veic tikai vienu nevis 3 reizes;
                          // reizinaashana ir daudz aatraaka operaacija par daliishanu
      return CVector3(x*f,y*f,z*f);
   }


Lai nebuutu jaataisa vektoru kopijas, kad taas nav vajadziigas, var defineet operatorus += , -= utt.
Code:

   // atgriezh referenci
   CVector3 & operator += (const CVector3 & v)
   {
        x += v.x; y += v.y; z += v.z;
        return *this;
   }
   CVector3 operator + (const CVector3 & v)
   {
        CVector3(*this) result;
        result += v;
        return result;
   }
    /* ... */

    // veicais kods:
    CVector v(1,0,0);
    v = v +  CVector(0,2,1);
    // jaunais:
    v += CVector(0,2,1);
   


Ja nopietni grib pieveersties optimizaacijai, tad pastaav arii daudz efektiivaakas (bet sarezgiitaakas), metodes - inline asembleris ar SSE utml. kodiem, vai template<> izmantoshana - shablonu metaprogrammeshana. Bet saakumam pietiks arii ar shiim.

Veel taadi siikumi: reekinot vieniibas vektoru vajadzeetu paarbaudiit vai garums nesanaak 0.
Rotaacija ir uztaisiita optimaali, bet gruuti saprotami; ja performance nav tik svariiga (piem. debugojot), tad var vienkaarshot. Izdali rotaciju ar katru asi (x,y,z) un vienkaarshi pareizini ar attieciigajaam rotaacijas matricaam. Kadas izskataas rotaacijas matricas ap asiim, var atrast internetaa.
Back to top
View user's profile
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 26, 2005 8:27 pm    Post subject:

Quote:
vai template<> izmantoshana

kaa tas var paliidzeet optimizaacijai?
_________________
Back to top
View user's profile Send e-mail
Guest






PostPosted: Wed Jan 26, 2005 9:12 pm    Post subject:

[slinkums logoties iekshaa]
Kautko par to lasiiju graamataa C++ Templates: The Complete Guide by David Vandevoorde, Nicolai M. Josuttis.
Cits links no google: http://www.flipcode.com/articles/article_fastervectormath.shtml
Ideja taada, ka tiek noveersta iislaicigu kopiju veidoshana.
Back to top
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Jan 26, 2005 10:03 pm    Post subject:

HOLY! Shocked Shocked Shocked

Jauks triks... shitas man radiija veelmi izpildiit to reader exercise - matrix multiplication Wink ,kad 100% iebraukshu shitaja tas ir Smile kaads ir to meegjinaajis? Kaads aatruma ieguvums? Varbuut ir arii kaut kur jau gatava biblioteeka ar shitaadiem jaukumiem, tiem kas grib lietot slimu (labaa noziimee) cilveeku aatraas idejas, bet nav pietiekami slimi, lai pashi to uzrakstiitu?
_________________
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Thu Jan 27, 2005 11:34 am    Post subject:

Nezinu vai templeites rada ātrdarbību, bet SSE/3DNow izmantošana noteikti dod lielu optimizāciju.
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> OpenGL All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group