Autor Wątek: Jak to jest z normalnymi dla plikow BSP  (Przeczytany 3062 razy)

Offline ziomber

  • Użytkownik

  • Zbanowany
# Luty 13, 2007, 00:04:47
Czytajac plik (q3) bsp mozna pobrac np. informacje o face'ach w tym normalnych dla tych face'ow + mozna zaladowac wierzcholki ktore maja tez osobne normalne, no spoko tylko te normalne sa jakas dziwnie obliczone nie wskazuja kierunku w ktorym face jest skierowany tylko jakos na ukos chociaz niektore sa dobrze nalozone ale wiekszasc jest zepsuta. Jak ktos ladowal takie pliki to pewnie wie ja  to objesc bo nie jestem pewny czy to trzeba zmienic moze z = -y, a y na z dla wektorow normalnych... juz probowalem i tak zle sa rysowane, probowalem tez wyliczyc sam normalne ale one sie tez zle obliczaja chociaz funkcja do obliczania jest dobra, przeczytalem gdzies na necie ze te face'y moga byc odwrocone ale niektore sa niektore nie i wiekszasc jest zle skierowana jak to skorygowac?  ie moge przez to swiatla poprawnie nalozyc ani tez sprawdzic kolizji...
moze jest jakis szczegol ktory pominolem podczas ladowania takiej mapy

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Luty 13, 2007, 00:52:01
Po przejrzeniu przeczytaniu Twojego posta i opisu formatu BSP Quake'a 3 mam wrażenie, że próbujesz rysować face'y zamiast ich triangulacji. :)

Offline ziomber

  • Użytkownik

  • Zbanowany
# Luty 13, 2007, 01:30:28
mozez to rozwinac bo nie kapuje :X

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Luty 13, 2007, 01:42:02
Googlowanie po "q3 bsp" znalazło to: http://graphics.stanford.edu/~kekoa/q3/


Jednym z interesujących nas tu kawałków jest fragment opisujący sposób przechowywania Face'ów. Taki face ma normalną, wierzchołki oraz tajemnicze meshvertex'y. Pod opisem strukturki jest opisane "z czym to się je". :)

Cytuj
For type 1 faces (polygons), vertex and n_vertexes describe a set of vertices that form a polygon. The set always contains a loop of vertices, and sometimes also includes an additional vertex near the center of the polygon. For these faces, meshvert and n_meshverts describe a valid polygon triangulation. Every three meshverts describe a triangle. Each meshvert is an offset from the first vertex of the face, given by vertex.

Mówiąc po polsku, wierzchołki mogą być podane w dowolny sposób (pętla w dowolnym kierunku plus czasem pomocnicze wierzchołki wewnątrz). To, w jaki sposób to narysować jest określone przez meshvertexy, które są po prostu listą indeksów kolejnych trójkątów, po których już myślę, że można się spodziewać konkretnego zwrotu. Jeżeli chodzi o normalną face'a, to zignorował bym ją całkowicie i po prostu używał normalnych podanych przy wierzchołkach. Jeżeli potrzebujesz kompletnego tangent-space'a, to możesz normalne z pliku zignorować całkowicie i użyć na przykład NVMeshMender'a. :)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Luty 13, 2007, 10:31:25
Nie wiem w jakiej bibliotece graficznej piszesz ani jaki układ współrzędnych mają pliki BSP, ale jeśli to jest inny układ, to czy współrzędne normalnych zamieniasz i negujesz tak samo jak pozycje wierzchołków przekształcając je między tymi układami?

Offline ziomber

  • Użytkownik

  • Zbanowany
# Luty 13, 2007, 12:22:39
npo wlansie nie neguje bo nie wiem czy to trzeba znegowac, co do normalnych czyli nie moge pobrac kazzdej normalnej dla sciany i zrobic z tego kolizji? bo ja tylko tyle chce a ty mi o jakis tanget spaceach gadasz xDDDDD swoja droga jak wyglada rekord meshvert? pewnie tak:

  type TBSPVertex = Record
    Position      : TVector3f;             // (x, y, z) position.
    TextureCoord  : TVector2f;             // (u, v) texture coordinate
    LightmapCoord : TVector2f;             // (u, v) lightmap coordinate
    Normal        : TVector3f;             // (x, y, z) normal vector
    Color         : Array[0..3] of Byte    // RGBA color for the vertex
  end;

i ja to ładuje i to też ma pokrzywione normlane, ale reszta jak poistion lightcoord i texcoord dzialaja dobrze do czasu jak nie wstawie pointed light :X
« Ostatnia zmiana: Luty 13, 2007, 12:28:56 wysłana przez ziomber »

Offline mINA87

  • Użytkownik

# Luty 13, 2007, 13:02:53
O które normale Ci chodzi w końcu? Wierzchołków czy face'ów? Jeśli wierzchołków, to wektor normalny płaszczyzny rozpiętej na tych wierzhcołkach wyznacza się chyba superpozycją wektorów normalnych wierzchołków składowych, bo przecież wierzchołki mogą być współdzielone przez trójkąty.

Offline ziomber

  • Użytkownik

  • Zbanowany
# Luty 13, 2007, 13:40:53
wierzchpolki towrza face, ale ja chce normalna face'a, tylko jak ładuje z pliku informacje o tej normalnej to ta normlana nie pokazuje prawidlowego kierunku
« Ostatnia zmiana: Luty 13, 2007, 13:43:06 wysłana przez ziomber »

Offline mINA87

  • Użytkownik

# Luty 13, 2007, 13:51:16
To olej normalną z face'a i wyznacz ja z wierzchołków tworzących face'a. Dodaj do siebie wektorki normalne  wierzchołków tworzących face'a i znormalizuj.

Offline ziomber

  • Użytkownik

  • Zbanowany
# Luty 13, 2007, 14:37:10
czyli mam nie obliczac od nowa normalnej (bo jak tak robilem to mi dziwne dlugosci tych normalnych wychodzily widzialem tylko kropke zamiast kreski i nie wiem w jaka strone to mi obliczalo zwrot tego wektora)
przez wyszstkie vertexy danego face'a , wynik = wynik + normalna.wierzcholka;
wynik := normalize(wynik);

cos takiego o to ci chodzi dodaejmy a pozniej robimy wersor

Offline mINA87

  • Użytkownik

# Luty 13, 2007, 15:27:29
Niom, dodatkowo żeby dłuższe to było to po normalizacji wynik przemnóż wektor przez jakąś stała np. 10, 100 czy ileś tam, zależnie jak długie chcesz mieć "wąsy" i warto by było wtedy też przesunąć taki wektor do środka face'a i będziesz miał pięknie narysowaną normalną face'a.
//edit tzn przesuwając mam na myśli że rysujesz linie od środka face'a do środka + ten wektor.

Offline ziomber

  • Użytkownik

  • Zbanowany
# Luty 14, 2007, 01:12:10
a jendak nie to teraz to mi normalne wychodza w boki i zadna do gory lub na dol :U

na stronie
http://graphics.stanford.edu/~kekoa/q3/#Faces

jest podane float[3] normal    Surface normal. no to jak to jest surface normal to czemu jest zle obliczony ?

face int texture Texture index.
int effect Index into lump 12 (Effects), or -1.
int type Face type. 1=polygon, 2=patch, 3=mesh, 4=billboard
int vertex Index of first vertex.
int n_vertexes Number of vertices.
int meshvert Index of first meshvert.
int n_meshverts Number of meshverts.
int lm_index Lightmap index.
int[2] lm_start Corner of this face's lightmap image in lightmap.
int[2] lm_size Size of this face's lightmap image in lightmap.
float[3] lm_origin World space origin of lightmap.
float[2][3] lm_vecs World space lightmap s and t unit vectors.
float[3] normal Surface normal.
int[2] size Patch dimensions.

a moze jednak cos mi zle dziala z obliczaniem normalnych dla face'ow

bo niby jak ma sie wierzcholkii to mozna normalna obliczyc a mi to tez nie wychodzi zbytnio :X
oto kod:

//moze zel ustawiam wektory? bo cos mi ta procka sie chrzani :X
function Normal(point1, point2, point3 : t3dpoint; NormalizeNormal : boolean) : t3dpoint;
var
v1, v2  : t3dpoint;
vn      : t3dpoint;
begin
vn.x := 0.0;
vn.y := 0.0;
vn.z := 0.0;
Result := vn;
v1 := Vector(point2, point1);
v2 := Vector(point3, point1);
vn := vectorcross(v1,v2);
if NormalizeNormal = true then vn := Normalize(vn);

Result := vn;
end;


function vectorcross(v1, v2 : t3dpoint) : t3dpoint;
var
crossproduct    : t3dpoint;
begin
crossproduct.x  := (v1.y*v2.z)-(v1.z*v2.y);
crossproduct.y  := (v1.x*v2.z)-(v1.x*v2.z);
crossproduct.z  := (v1.x*v2.y)-(v1.y*v2.x);
Result          := crossproduct;
end;

procedure createnormals(var model : tglarrayselectionmodel);
var
i : integer;
vertarray       : array[0..2] of t3dpoint;
begin
setlength(model.FACE_NORMAL,lengtH(model.face));
for i:=0 to high(model.face) do
begin
vertarray[0] := model.arrays[i][0].vertex3f;
vertarray[1] := model.arrays[i][1].vertex3f;
vertarray[2] := model.arrays[i][2].vertex3f;

model.FACE_NORMAL[i] := Normal(vertarray[0],vertarray[1],vertarray[2],true);
end;

end;
« Ostatnia zmiana: Luty 14, 2007, 14:12:01 wysłana przez ziomber »

Offline ziomber

  • Użytkownik

  • Zbanowany
# Luty 14, 2007, 14:38:21
Swoja droga to chyba nie pozostali mi nic innego jak testowanie normalnych i sprawdzanie czy one sa prostopadle :X ciekawe czy ta dokladnosc komputerow sprawdzi sie

Offline Charibo

  • Redaktor

# Luty 14, 2007, 17:09:30
To moze byc raczej nieszybkie jak bedziesz mial duzo normalnych :)

Offline ziomber

  • Użytkownik

  • Zbanowany
# Luty 16, 2007, 13:58:16
to nie bedzie sie robilo w real time tylko raz by pozmienialo normalne btw...
Mialłem jedna procedura ktora mi tworzyła normalne z wartosci wlasnie tbspFace (i tylko takie zapisywała do pamieci a reszta procedur nie mogla byc nad ta procedura co dawalo ze zawsze byl jeden wynik , usunałem te procedure)
i zroibłem tak, że zanegowałem normalne (i vertexy) czyli z wartosci x,y,z zrobiłem x,z,-y (dla normalnych i vertexow)
Pozniej tylko podałem normalne face'a tak, że to była normalna każdego pierwszego vertexa w polygonie (scianie) bo jak wiadomo kazdy polygon, face lub tam sciana sklada sie z conajmniej 3 vertexow i wszystko dziala >>//