Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

24.12.2006, 15:50

Ok!
Erstmal frohe Weihnachten an alle! :)
Und jetzt zum Thema.
Gibt es nicht ein Tutorial wo ich mir das mal angucken kann?
Das mit dieser "bilineare interpolation" klingt total Spanisch!

Gruß Flo

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

24.12.2006, 16:22

Frohe Weihnachten!

zur interpolation:

das ist nicht so schwer ;)

alles läuft in 2d ab:


(Link)


a und b sind die x bzw. y (oder z, je nachdem was deine ebene ist) abstände zu kamera, L ist die kantenlänge des quadrates.
hv1, hv2, hv3 und hv4 sind die höhenwerte der vertices 1 bis 4.

jetzt bekommst du den interpolationsfaktor in x und y richtung:

fx = a / L;
fy = b / L;

jetzt interpolierst du dir 2 Höhenwerte h1 und h2 z.B. in x richtung:

h1 = hv1 * fx + hv2 * (1 - fx)
h2 = hv3 * fx + hv4 * (1 - fx)

und zum schluss bekommst du die höhe h an der position der kamera:

h = h1 * fy + h2 * (1 - fy)

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

13

24.12.2006, 22:10

spanisch? eher englisch nach meinem geschmack...

14

25.12.2006, 12:41

Danke erstmal.
Jetzt geh ich das nochmal alles durch:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Die Eckpunkte des Quadrates sind A,B,C,D. Von denen ist jeweils die x,y und z position bekannt.
Kamera y
Kamera z 
Kamera x
sind bekannt.

L ist die Kantenlänge:

L = A.x - B.x + A.y - B.y + A.z - B.z  (??)

 interpolationsfaktor in x und y richtung:
a ist die distanz zwischen dem linkenrand und der x position der Kamra!
b ist die distanz zwischen dem oberenrand und der y position der Kamera! (Müsste das nicht z sein?)

fx = a / L; 
fy = b / L; 

jetzt interpolierst du dir 2 Höhenwerte h1 und h2 z.B. in x richtung: 

hv1 ist die höhe (also y?) von dem ersten vertex.
hv2 vom zweiten.
hv3 vom dritten.
hv4 vom vierten.

h1 = hv1 * fx + hv2 * (1 - fx) 
h2 = hv3 * fx + hv4 * (1 - fx) 

Jetzt die höhe der Kamera (h):

h = h1 * fy + h2 * (1 - fy)


Bitte verbessert mich!
Wie sieht dann der Wert aus??
Ist das dann ein Wert zwischen 0 bis unendlich?

Gruß Flo

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

25.12.2006, 14:55

Zitat von »"F-Wölkchen"«


L ist die Kantenlänge:

L = A.x - B.x + A.y - B.y + A.z - B.z (??)


!?
L ist die kantenlänge des quadrates.
z.b. L = A.x - B.x

wenns wirklich an so dingen wie der kantenlänge oder dem mittelpunkt eines quadrates scheitert, solltest du dich wirklich mal mit grundlegender geometrie auseinandersetzen.

Zitat von »"F-Wölkchen"«


b ist die distanz zwischen dem oberenrand und der y position der Kamera! (Müsste das nicht z sein?)

Zitat von »"dot"«


...(oder z, je nachdem was deine ebene ist)...

;)

wie gesagt, es hängt davon ab ob jetzt x, y oder z deine "höhe" ist. du hast keinen code gepostet, woher soll ich also wissen was bei dir die höhe ist und was nicht.

Zitat von »"F-Wölkchen"«


jetzt interpolierst du dir 2 Höhenwerte h1 und h2 z.B. in x richtung:

hv1 ist die höhe (also y?) von dem ersten vertex.

siehe oben...

Zitat von »"F-Wölkchen"«


Wie sieht dann der Wert aus??
Ist das dann ein Wert zwischen 0 bis unendlich?


das is dann einfach ein höhenwert. gleich wie der höhenwert deiner vertices, nur halt die höhe an genau der stelle...

16

25.12.2006, 16:28

Zuerst einmal danke!
Also y ist die höhe!
Hier mal mein code (der warscheinlich falsch ist):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
L = A.x - B.x;
            a = Cam.mPos.x-A.x;
            b = Cam.mPos.y-A.y;
            fx = a / L; 
            fy = b / L; 
            h1 = A.y * fx + B.y * (1 - fx); 
            h2 = C.y * fx + D.y * (1 - fx);
            hoehe = h1 * fy + h2 * (1 - fy);


Doch die höhe ist dann immer -1.#IND ??

Was ist falsch?
Gruß Flo

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

25.12.2006, 17:21

was sind A und B, wie ermittelst du sie?

Zitat


Also y ist die höhe!

Zitat


C-/C++-Quelltext

1
b = Cam.mPos.y-A.y;


sollte dann wohl eher z sein!?

Zitat

Doch die höhe ist dann immer -1.#IND ??


schonmal mit dem debugger die zwischenwerte überprüft?

http://de.wikipedia.org/wiki/NaN

Zitat von »"http://www.thescripts.com/forum/thread62988.html"«


> Hello!
>
> Which operatiaon causes -1.#IND ?[/color]

That's how Microsoft's compilers print out a Quiet NaN (Not a Number).
It's typically the result of working with a variable that hasn't been
initialized (the IND stands for "indefinite" if I'm not mistaken).

Another post mentioned infinity. At least with MS's compilers, a
infinity will print out as -1.#INF. This is typically produced by a
division that produces a result too large to represent, such as
something like 1e+300/1e-300. With infinite range available, this would
produce 1e+600, but a double normally tops out at around 1e+308.

18

25.12.2006, 17:48

schon klar ;)
Hab nicht das aktuellste gepostet!

Hier mal der ganze code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#define     MAP_SIZE    1024                // Size Of Our .RAW Height Map ( NEW )

#define     STEP_SIZE   16              // Width And Height Of Each Quad ( NEW )

#define     HEIGHT_RATIO    1.5f                // Ratio That The Y Is Scaled According To The X And Z ( NEW )


                // Holds The Height Map Data ( NEW )


float scaleValue = 0.15f;                   // Scale Value For The Terrain ( NEW )

UINT Gras[1];

typedef struct tVector{
 
GLfloat x;
GLfloat y;
GLfloat z;
        
};

GLfloat hoehe[(MAP_SIZE-STEP_SIZE)*(MAP_SIZE-STEP_SIZE)];


void init_Landschaft(BYTE pHeightMap[]){

LoadRawFile("Terrain.raw", MAP_SIZE * MAP_SIZE, pHeightMap);    // ( NEW )

 BMP_Texture(Gras, "grass.bmp",0);     
}



int Height(BYTE *pHeightMap, int X, int Y)          // This Returns The Height From A Height Map Index

{
    int x = X % MAP_SIZE;                   // Error Check Our x Value

    int y = Y % MAP_SIZE;                   // Error Check Our y Value


    if(!pHeightMap) return 0;               // Make Sure Our Data Is Valid


return pHeightMap[x + (y * MAP_SIZE)];          // Index Into Our Height Array And Return The Height

}



void draw_Landschaft(BYTE pHeightMap[]){

int X = 0, Y = 0;                   // Create Some Variables To Walk The Array With.

int x, y, z=0, i=0;                     // Create Some Variables For Readability


glBindTexture(GL_TEXTURE_2D, Gras[0]);              
glBegin( GL_QUADS );            

for ( X = 0; X < (MAP_SIZE-STEP_SIZE); X += STEP_SIZE )
        for ( Y = 0; Y < (MAP_SIZE-STEP_SIZE); Y += STEP_SIZE )
        {
            tVector A;
            tVector B;
            tVector C;
            tVector D;
            GLfloat L;
            GLfloat a, b;
            GLfloat fx, fy;
            GLfloat h1, h2;
       
            glTexCoord2f(0.0f, 1);
            x = X;                          
            y = Height(pHeightMap, X, Y );  
            z = Y;
                        
            A.x=x;
            A.y=y;
            A.z=z;
            
            
            glVertex3i(x, y, z);        

            glTexCoord2f(0.0f, 0.0f);
            x = X;                                      
            y = Height(pHeightMap, X, Y + STEP_SIZE );  
            z = Y + STEP_SIZE ; 
                                    
            B.x=x;
            B.y=y;
            B.z=z;
            
            glVertex3i(x, y, z);        

            glTexCoord2f(1, 0.0f);
            x = X + STEP_SIZE; 
            y = Height(pHeightMap, X + STEP_SIZE, Y + STEP_SIZE ); 
            z = Y + STEP_SIZE ;
            
            C.x=x;
            C.y=y;
            C.z=z;

                
            glVertex3i(x, y, z);        

           glTexCoord2f(1, 1);
            x = X + STEP_SIZE; 
            y = Height(pHeightMap, X + STEP_SIZE, Y ); 
            z = Y;
            
            C.x=x;
            C.y=y;
            C.z=z;
            
            glVertex3i(x, y, z);    
            
            L = A.x - B.x;
            a = Cam.mPos.x-A.x;
            b = Cam.mPos.z-A.z;
            fx = a / L; 
            fy = b / L; 
            h1 = A.y * fx + B.y * (1 - fx); 
            h2 = C.y * fx + D.y * (1 - fx);
            hoehe[i] = h1 * fy + h2 * (1 - fy);
            
            i++;
        }
    glEnd();


     
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

25.12.2006, 17:55

^^

hab ichs mir gedacht...dein L ist null
außerdem hast du einen copy&paste fehler:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            C.x=x;
            C.y=y;
            C.z=z;

               
            glVertex3i(x, y, z);       

           glTexCoord2f(1, 1);
            x = X + STEP_SIZE;
            y = Height(pHeightMap, X + STEP_SIZE, Y );
            z = Y;
           
            C.x=x;  //sollte D sein, oder ;)

            C.y=y;
            C.z=z; 


;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
L = A.x - D.x;  // bzw. L = STEP_SIZE;

a = Cam.mPos.x - A.x;
b = Cam.mPos.z - A.z;
fx = a / L;
fy = b / L;
h1 = A.y * fx + B.y * (1 - fx);
h2 = C.y * fx + D.y * (1 - fx);
hoehe[i] = h1 * fy + h2 * (1 - fy);


warum du das dann hoehe zuweist, hab ich ka...

achja, nur so ein tipp:

C-/C++-Quelltext

1
2
3
4
5
6
7
typedef struct tVector{
 
GLfloat x;
GLfloat y;
GLfloat z;
       
};


das typedef da is ziemlich sinnlos...

20

25.12.2006, 18:37

ok.
Ich habs verbessert!
Doch jetzt kommt immer ein konstant ein Wert von 14233.6 raus.
Wenn das richtig ist, dann wie kann ich dann die Kamera über die Height-map "gleiten lassen"?

Gruß Flo :)

Werbeanzeige