-
1. Data: 2014-11-25 13:58:56
Temat: half sky dome + podstawa
Od: firr <p...@g...com>
jezeli obracam kamere w pustej przestrzeni 3d to kazddemu pikselowi na ekranie
odpowiada pewien unormalizowany wektor kierunku w 3D (dir.x, dir.y, dir.z)
ten wektor mam w programie dostepny w petli dla kazdego piksela ekranu i moge np
przeksztalcic go analitycznym wzorkiem na jakis kolor(dir) wtedy dostje w efekcie
pomalowana kopule (sfere)
zrobilem proste mapowanie dir na x,y z look upem w bitmapie (konkretnie
if(dir.z>0)
{
x = dir.x
y = dir.y
color_piksela = bitmapa[x][y]
}
else
color_piksela = szary
i to przeksztalca bitmape na polkule, w zenicie (tj dla dir.x, i dir.y rownych zero a
dla dir.z = +1) ta bitmapa jest nawet niezbyt nieksztalcona, silnie odksztalca sie w
okolicach czterech biegunów,
wschod (x=1.0, y=0.0)
zachod (x=-1., y=0.)
polnoc (x=0., y=1.)
poludnie (x=0., y=-1.)
przydaloby mi moze jakies mapowanie ktore mniej znieksztalca, ale na razie mam tez
inny problem
chcialbym dolna czesc polkuli (dj wszystkie piksele dla dir.z<0) zmapowac nie na
polsfere
ale na plaskie koło, tez moze byc z look upem
w bitmapie, tak by miec na gorze oteksturpwaną
kopule a na dole oteksturowany plaski teren
jak powinno wygladac takie rzutowanie?
(fir)
-
2. Data: 2014-11-29 12:01:29
Temat: Re: half sky dome + podstawa
Od: firr <p...@g...com>
zrobilem cos takiego
inline unsigned CalcPixelForPlate_(float3 dir, float px, float py, float h)
{
unsigned color;
float fhx, fhy;
// if(dir.z==0)
if(dir.z>-0.0001 && dir.z<0.0001)
{
fhx = 512.+ px;
fhy = 512.+ py;
}
else
{
float inv_dir_z = 1./dir.z;
fhx = 512. + px + (h*dir.x*inv_dir_z);
fhy = 512. + py + (h*dir.y*inv_dir_z);
}
int xc = ((int)(fhx))&1023;
int yc = ((int)(fhy))&1023;
color= working_buffer[yc*working_buffer_size_x + xc];
return color;
}
gdzie px,py,ph jest przeskalowana (na slepo) pozycja kamery
ten poczatek chyba mozna by poprawic ale nie wiem jak
w sumie moglbym zrobic na tym prosty symulator lotu ale jeszcze nie wiem jak