|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
Angel
Joined: 02 Jan 2005 Posts: 113 Location: Latvija
|
Posted: 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 |
|
|
Angel
Joined: 02 Jan 2005 Posts: 113 Location: Latvija
|
Posted: 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 |
|
|
Angel
Joined: 02 Jan 2005 Posts: 113 Location: Latvija
|
Posted: 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.
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!
Last edited by Angel on Wed Jan 26, 2005 5:32 pm; edited 3 times in total |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
Angel
Joined: 02 Jan 2005 Posts: 113 Location: Latvija
|
Posted: Wed Jan 26, 2005 5:14 pm Post subject: |
|
Ok, paldies. [Tutorial Edited]. , Bet Ar Tadu Kameras Konstruktoru neiet cauri. |
|
Back to top |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: 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 _________________
|
|
Back to top |
|
|
Angel
Joined: 02 Jan 2005 Posts: 113 Location: Latvija
|
Posted: 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)? |
|
Back to top |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: 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 |
|
|
chaosman
Joined: 28 Oct 2003 Posts: 64 Location: Rīga
|
Posted: 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 |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: Wed Jan 26, 2005 8:27 pm Post subject: |
|
Quote: | vai template<> izmantoshana |
kaa tas var paliidzeet optimizaacijai? _________________
|
|
Back to top |
|
|
Guest
|
Posted: 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
Joined: 25 Sep 2003 Posts: 887
|
Posted: Wed Jan 26, 2005 10:03 pm Post subject: |
|
HOLY!
Jauks triks... shitas man radiija veelmi izpildiit to reader exercise - matrix multiplication ,kad 100% iebraukshu shitaja tas ir 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 |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: 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 |
|
|
|
|
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
|