PDA

Prikaži potpunu verziju : DirectX Problemi


Andross
15.4.2007, 13:41
Ucim DirectX vec nedelju dana i stigao presao sam svetla koja razumem. Sada u tom tutorijalu ima kao spisak zadataka tj. vezbi koje se kao trebaju uraditi da bi postao upoznat sa svetlima. Sad imaju dva zadatka koja mi nisu jasna. Kaze da napravim da point light kruzi oko kocke. Takodje kaze da posle toga napravim ka kruzi u 8 gde je centar od 8 izmedju dve kocke. Posto se svetlo pravi u funkciji (varijabla i podesavanja) pitam se kako bih to mogao da izvedem. Da se napravi funkcija gde se pravi svetlo sa drugim pozicijama i postavlja na mesto (ako prethodno bilo 0 i ovo je 0) prethodnog ili kako vec? Pomagajte ovo bas i nisam razumeo kako treba uraditi.


void InitLight()
{
D3DLIGHT9 light;
D3DMATERIAL9 material;


ZeroMemory(&light, sizeof(light));
light.Type = D3DLIGHT_POINT;
light.Diffuse.r = 0.5f;
light.Diffuse.g = 0.5f;
light.Diffuse.b = 0.5f;
light.Diffuse.a = 1.0f;
light.Range = 100.0f;
light.Attenuation0 = 0.0f;
light.Attenuation1 = 0.125f;
light.Attenuation2 = 0.0f;


D3DVECTOR vecPosition = {0.0f, 5.0f, 0.0f};
light.Position = vecPosition;


d3ddev->SetLight(0, &light);
d3ddev->LightEnable(0, true);


ZeroMemory(&material, sizeof(material));
material.Diffuse.r = material.Ambient.r = 1.0f;
material.Diffuse.g = material.Ambient.g = 1.0f;
material.Diffuse.b = material.Ambient.b = 1.0f;
material.Diffuse.a = material.Ambient.a = 1.0f;


d3ddev->SetMaterial(&material);
}

EclipsE
15.4.2007, 14:45
Da bi objekat kruzio oko drugog objekta(svetlo oko kocke) morash da menjash X i Z vrednosti. E sad, kako to uraditi??

float radius = 1.0f;
float verticalRotation = 1.0f;
float horizontalRotation = 0.0f;


to su ti globalne promenljive
kad se update-uje frejm treba da ide ovako nesto

horizontalRotation += 0.1f
light.Position.X = (float)( radius * Math.Cos(verticalRotation) * Math.Cos(horizontalRotation) );
light.Position.Y = (float)( radius * Math.Sin(verticalRotation) );
light.Position.Z = (float)( radius * Math.Cos(verticalRotation) * Math.Sin(horizontalRotation) );


ovo Math.Sin i Math.Cos zameni sa odgovarajucim funkcijama, ne znam kako se rade u c++-u (ili bese #include <math.h> :))

a ovo drugo nisam razumeo, ako bi rekao gde si pronasao tutorijale pogledao bih i rekao bih ti :)

btw, deklarisi svetlo kao globalno, nemoj u funkciji

Andross
15.4.2007, 15:20
I ja sam mislio na tako nesto samo sto su mi nedostajali sin i cos :)
Tutorijali su www.directxtutorial.com

quick
15.4.2007, 17:13
@ANDROSS

prvo, izbaci promjenljivu light iz funkcije i stavi je kao globalnu, kako bi je ponovo koristio.

dalje, imas pozicije kocaka b1, b2;
c - centar osmice
r - radijus kruga koji "gradi" osmicu.


c = b1 + (b2-b1)/2;
r = D3DXVec3Length(&(c-b1));


ako posmatras kretanje tacke po osmici (koju cine 2 kruga koja se dodiruju) ono se sastoji od 2 "faze", prva je po prvom krugu u jednom pravcu, druga po drugom krugu u suprotnom pravcu a oba kretanja pocinju i zavrsavaju se u centru osmice. tu varijablu "faze" oznaci kao f;
f bi imala vrijednost od 0 do 2, 0-1 za kretanje po prvoj kruznici, 0-2 po drugoj;
f definisi po neko vremenskoj funkciji, na pr. ako hoces da ti se osmica zaobidje za 5 sekundi uradi ovako


f = (float)(GetTickCount() % 5000) / 5000.0f * 2.0f;

da ne smaram, evo ti code, ukapiraces


ULONG time = 5000;
D3DXVECTOR3 b1, b2, c;
D3DXVECTOR4 p;
float r, f;
D3DLIGHT9 light;

void init()
{
c = b1 + (b2-b1)/2;
r = D3DXVec3Length(&(c-b1));
p = c;

InitLight(); //ona tvoja funkcija ali sa light promjenljivom kao globalnom
}

void update()
{
f = (float)(GetTickCount() % time) / (float)time * 2.0f;

if(f<1.0f)
{
D3DXMATRIX m;
D3DXMatrixRotationY(&m, 2.0f*D3DX_PI*f);
D3DXVec3Transform(&p, &(c-b1), &m);
p += b1;
}
else
{
D3DXMATRIX m;
D3DXMatrixRotationY(&m, -2.0f*D3DX_PI*(f-1.0f));
D3DXVec3Transform(&p, &(c-b2), &m);
p += b2;
}

light.Position.x = p.x;
light.Position.y = p.y;
light.Position.z = p.z;

d3ddev->SetLight(0, &light);
}

Andross
18.4.2007, 13:37
@quick: Ovo tvoje ne radi. Buni se oko konverzije i jos necega drugog. Mozda je do mog matorog SDK-a (Summer 2003 :D)
Btw. uradio sam rotaciju:

hor += 0.03f;
light.Position.x = (float)sin(hor) * 12.0f;
light.Position.y = 5.0f;
light.Position.z = (float)cos(hor) * 25.0f;
d3ddev->SetLight(0, &light);

Sada ima jedan problem tehnicke prirode. Vezan je za Sinus i Kosinus. Posto se to radi u srednjoj skoli pitao sam nastavnika (8-i sam razred) za to. On mi je pokazao formule (nalegla kateta / hipotenuza...) i to je vezano za ugao trougla. Sada te funkcije u prog. jezicima imaju jedan parametar. Slede pitanja:
1. Cemu Sinus i Kosinus sluze u programiranju igara (i generalno)?
2. Zasto jedan parametar?

quick
18.4.2007, 15:15
@quick: Ovo tvoje ne radi. Buni se oko konverzije i jos necega drugog. Mozda je do mog matorog SDK-a (Summer 2003 :D)

Pa sto ne napises code.
Mozda je problem u ovim linijama:

D3DXVec3Length(&(c-b1));
D3DXVec3Transform(&p, &(c-b1), &m);
D3DXVec3Transform(&p, &(c-b2), &m);

neki kompajleri ne podrzavaju ovo ili javljaju kao warning (u zavisnosti od warning levela) pa stavi u posebne promenljive te izraze (c-b1, c-b2) i proslijedi funkcijama njihove adrese.
Iako nema veze sa DX SDK, mozda je vrijeme da skines noviju verziju :)


1. Cemu Sinus i Kosinus sluze u programiranju igara (i generalno)?
2. Zasto jedan parametar?

Sluze semu god ti padne na pamet sto se 3D grafike i matematike tice.
Parametar je ugao tog pravouglog trougla. Sinus je kolicnik naspramne katete i hipotenuze a kosinus kolicnik nalegle katete i hipotenuze.
Takodje koriscenjem arkus sinusa i arkus kosinusa mozes da pronadjes ugao izmedju 2 vektora na primjer itd. Velika je primjena.

Andross
18.4.2007, 15:38
Znam te formule. Nego kada bih u onom obrisao sin i cos pozive svetlo ne bi islo u krug. To zbog tih uglova ili sta?

quick
18.4.2007, 16:06
naravno da ne bi islo u krug jer se vise ne mijenjaju x i z koordinate :)

sin u = a / c
sin u * c = a

cos u = b / c
cos u * c = b

a i b su katete ocigledno, a c je u tvom slucaju ocigleno 12 odnosno 25

pa je u tvom slucaju
x = sin(u)*12
z = cos(u)*25
sto si i ucinio

Andross
18.4.2007, 16:08
E sad sam skroz skapirao.

Andross
19.4.2007, 13:41
Uf sad imam trip sa kamerom. Exe je u prilogu koristite strelice i videcete sta ne valja.

MG-RAY
20.4.2007, 8:58
Kao prvo... trebao bi da napravis neki nacin za izlazak is programa osim Restart tastera na kucistu...:D

Koliko mi se cini, ovde se pozicija tgt-a pomera po pravoj liniji...ako te mrzi da se bakces sa trigonometrijom, samo treba da zarotiras View matricu oko Y ose za odredjeni broj stepeni (tj. radijana)... [ D3DMatrixRotationY(&viewMatrix, angle) ]

kish
20.4.2007, 13:59
Kao prvo... trebao bi da napravis neki nacin za izlazak is programa osim Restart tastera na kucistu...:D

Si probao ESC (Dugme u gonjem levom uglu tastature)? :D
Sorry za OT, ali morao sam :D

MG-RAY
20.4.2007, 20:06
Si probao ESC (Dugme u gonjem levom uglu tastature)? :D
Sorry za OT, ali morao sam :D


:D:D:D I sve ostale...sto je najcudnije... aplikacija radi na samo 30 fps...sve sa Busy cursorom :kreza:

Andross
20.4.2007, 20:30
Pa ja sam ga namestio na 30 FPS :kreza:

Andross
23.4.2007, 22:24
Ovo pitanje se tice MDX-a (za one koji ne znaju preso sam na C#).
Da li postoji razlika u brzini izmedju overrajda OnPaint metoda ili svopstvenog Render metoda. Da razumete:
Jel brze ovo:

protected override void OnPaint(PaintEventArgs e)
{
// ...
}

ili ovo:

private void Render(object sender, PaintEventArgs e)
{
// ...
}

// konstruktori bla bla bla
this.Paint += new PaintEventHandler(Render);

ili je isto?

MG-RAY
24.4.2007, 17:00
Ovo pitanje se tice MDX-a (za one koji ne znaju preso sam na C#).
Da li postoji razlika u brzini izmedju overrajda OnPaint metoda ili svopstvenog Render metoda...neki bla bla code...

OnPaint je clan osnovne Form klase, Paint je Event trenutnog form-a kog koristis...tako da ti dodje isto...u svakom slicaju, uvek mozes da izmeris brzinu...

btw. DirectX za C++ je laksi(tj. manje komplikovan) nego MDX :kreza:, koliko god ti to cudno zvucalo...

Andross
24.4.2007, 19:33
A koliko god tebi cudno zvucalo, nemam nikakve jace resurse za obican DX :kreza:
I da, C++ je komplikovaniji :)
Valja li uzimati XNA sada ili tek kasnije preci?

EclipsE
24.4.2007, 21:21
btw. DirectX za C++ je laksi(tj. manje komplikovan) nego MDX , koliko god ti to cudno zvucalo...

Ako MG-RAY nesto kaze, to mora da bude tacno :D

MG-RAY
24.4.2007, 21:25
A koliko god tebi cudno zvucalo, nemam nikakve jace resurse za obican DX :kreza:
I da, C++ je komplikovaniji :)
Valja li uzimati XNA sada ili tek kasnije preci?

uporedi 2 code-a obicnog i MDX (samo onaj deo koji se odnosi na DirectX), pa ces videti... :D
(naravno, ovo se odnosi na FFP)

Andross
24.4.2007, 21:28
Uporedio sam. I po meni opet je MDX laksi.

MG-RAY
25.4.2007, 15:23
Uporedio sam. I po meni opet je MDX laksi.

Pretpostavljam da si mislio da je C# laksi od C++ :D... da prestanemo sa ovim off-topic -om vise...:opanachke