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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

31.10.2011, 11:51

Flugzeuge "fliegen" lassen

Hi Leute,

ich versuche gerade Flugzeugmodelle von ihrer aktuellen Position (m_position) zu einem Wegpunkt (m_waypoint) "fliegen" zu lassen.
Dabei hab ich im Moment noch das Problem das sich die Nase zwar schon langsam in Richtung Zielpunkt dreht, aber das Modell an sich auf direktem Weg zum Wegpunkt verschoben wird.
Wie das aussieht könnt ihr selber ausprobieren: hier (ihr müsst den Pfeil direkt nach Start über WASD + RF verschieben!)

Meine Vorstellung:

1. ein Vektor für die aktuelle Flugrichtung (zeigt über die Längsachse gerade nach vorne)
2. Vektor zwischen Ziel und Position
3. beide addieren, dabei evt. 2. durch einen Faktor teilen damit das Flugzeug einen "Wendekreis" hat
4. Position + 3. rechnen
5. 1. wird auf 3. gesetzt

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void Aircraft::move(float fps){
    vec3 course = (m_waypoint-m_position)/m_turn; // m_turn = Rotationsfaktor (Wendekreis)
    course.normalize();
        
    m_course += course;
    m_course.normalize();
    m_position += m_course/1000*m_speed; // 1000 durch fps ersetzten!
}


Aber er fliegt halt keinen Bogen! Woran kann das liegen? Habt ihr Vorschläge oder gar neue Ideen?

Nur nochmal als Hinweis: Rotation damit die Flächen sich auch in Drehrichtung neigen usw. kommt noch.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

31.10.2011, 11:57

Also ich kann das Programm zwar starten, aber ich hab wirklich alle Tasten meiner Tastatur durchprobiert ohne dass sich was bewegt hätte...
In der Konsole steht folgendes:

Quellcode

1
2
3
4
5
6
7
0(8) : error C5060: out can't be used with non-varying texCoord


Could not initialize shader: 0
Link info
---------
No shader objects attached.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

31.10.2011, 12:00

Pass mal die Shader an, kann sein das du noch kein GLSL 1.5 unterstützt?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

31.10.2011, 12:04

Wenn das GLSL 1.5 sein soll, dann fehlt erstmal ein #version 150 am Anfang der Datei. Dass "ich das nicht unterstütze" kann nicht sein, ich hab hier eine GTX 560 Ti.
Wenn ich das #version 150 einfüge und den Fehler im Fagment Shader behebe, dann seh ich ein schwarzes Fenster.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (31.10.2011, 12:10)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

31.10.2011, 12:05

Ich lass das extra weg, bei manchen läufts da durch.
Ist ja auch egal, das Problem ist rein mathematisch, alles was du brauchst um mir zu helfen steht oben ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

31.10.2011, 12:15

Ich lass das extra weg, bei manchen läufts da durch.

Das darfst du aber nicht einfach weglassen. GLSL 1.5 verlangt, dass es da ist:

Zitat von »GLSL 1.5 Specification«


The directive “#version 150” is required in any shader that uses version 1.50 of the language.

Außerdem hast du in deinem FragmetShader trotzdem noch einen Syntaxfehler: Du definierst einen Sampler namens "texture". Das wird Probleme mit der eingebauten Funktion namens "texture" geben.
Ich kann dir nur empfehlen, GLSL Shader immer auf ATI und NVIDIA Karten zu testen, da die GLSL Implementierungen beider Hersteller sehr unterschiedliche Macken haben. Wenns der eine frisst, heißt das noch lange nicht, dass es auch dem anderen schmeckt...

Wenn ich beide Fehler behebe, bekomm ich wie gesagt ein schwarzes Fenster zu sehen.

Ist ja auch egal, das Problem ist rein mathematisch, alles was du brauchst um mir zu helfen steht oben ;)

Nun, ich hätte mir das Problem gern einfach mal angeschaut, anstatt mir anhand deines Codefragments mühsam zu überlegen, was das Problem denn nun genau sein könnte...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (31.10.2011, 12:23)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

31.10.2011, 12:28

Ich glaube aber ich habs ganz gut beschrieben. Das mit den Shadern änder ich dann mal.
Das du nur schwarz weiß bekommst finde ich komisch, ist bei manchen Freunden auch so... Ich wüsste jetzt aber nicht was eine GraKa mit OpenGL 3+ daran auszusetzen hätte.
Könntest du (oder gerne auch wer anders) trotzdem versuchen mir zu helfen?

Letztendlich geht es darum ein Objekt so zu verschieben das es auf einen Punkt zusteuert und dabei nicht plötzlich die Richtung ändert (also von dem einen zum anderen Bild), sondern langsam, also eine Kurve fliegt (über mehrere Bilder).

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

31.10.2011, 12:31

Nun, ich vermute mal, dass das Problem ist, dass dein "Rotationsfaktor" wirkungslos ist, immerhin normalisierst du ihn gleich in der nächsten Zeile wieder weg. Ich vermute mal du wolltest eigentlich eher sowas (m_turn zwischen 0..1):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void Aircraft::move(float fps){
    vec3 target = m_waypoint - m_position;
    target.normalize();
        
    m_course = (1.0f - m_turn) * course + m_turn * target;
    m_course.normalize();
    m_position += m_course/1000*m_speed; // 1000 durch fps ersetzten!
}

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

31.10.2011, 23:41

Oja, gefällt mir schonmal sehr gut :)
Ich pfeile noch ein wenig dran, aber das sieht schonmal sehr gut aus.

Ich nerv euch/dich dann später wenn es darum geht die Flächen zu rotieren usw. ^^ (sollten Probleme auftreten).

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

02.11.2011, 10:00

Ich habe ein etwas anderes Problem mit den Rudern:


(Link)


Wie man links (gerenderte Szene) sieht, sind sie nicht wo sie hingehören, trotz richtiger Position in Blender (ja das Model ist von mir) und gleicher Modelview!
Hier mal wie ich rendere:

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
mat4 modelview, projection;

    glGetFloatv(GL_PROJECTION_MATRIX, projection.getArray());
    
    shader[0]->bindShader(); // Shader
    shader[0]->sendUniform("texture0", 0);
            
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
        
        // Flugzeuge
        for(unsigned int i = 0; i < aircrafts.size(); i++){
            glGetFloatv(GL_MODELVIEW_MATRIX, modelview.getArray());
            modelview = aircrafts[i]->getMatrix(modelview); // Transformieren

            shader[0]->sendUniform4x4("modelview_matrix", modelview.getArray()); // Shader
            shader[0]->sendUniform4x4("projection_matrix", projection.getArray());

            for(int o = 0; o < 4; o++){ // Flugzeugteile
                glBindTexture(GL_TEXTURE_2D, aircrafts[i]->getTextureID(o)); // Textur
                                
                glBindBuffer(GL_ARRAY_BUFFER, aircrafts[i]->getVertexBuffer(o)); // Rendern
                glVertexAttribPointer(GLint(0), 3, GL_FLOAT, GL_FALSE, 0, 0);
                glBindBuffer(GL_ARRAY_BUFFER, aircrafts[i]->getTexCoordBuffer(o));
                glVertexAttribPointer(GLint(1), 2, GL_FLOAT, GL_FALSE, 0, 0);
                glBindBuffer(GL_ARRAY_BUFFER, aircrafts[i]->getNormalBuffer(o));
                glVertexAttribPointer(GLint(2), 3, GL_FLOAT, GL_FALSE, 0, 0);
    
                glDrawArrays(GL_TRIANGLES, 0, aircrafts[i]->getVerticesNumber(o));
            }
        }
        
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(2);

// modelview = aircrafts[i]->getMatrix(modelview); // Transformieren ist:

vec3 z = m_course; // lokale Z-Achse
    z.normalize();
    vec3 x = vecCross(vec3(0, 1, 0), z);
    x.normalize();
    vec3 y = vecCross(x, z);
    y.normalize();

    mat4 am = mat4(x.x, x.y, x.z, 0,
                   y.x, y.y, y.z, 0,
                   z.x, z.y, z.z, 0,
                   m_position.x, m_position.y, m_position.z, 1);
    m *= am;
    m.rotate(m_rotation[0], 1, 0, 0);
    m.rotate(m_rotation[1], 0, 1, 0);
    m.rotate(m_rotation[2], 0, 0, 1);
    m.scale(m_scale, m_scale, m_scale);

    return m; // m = modelview die übergeben wird


Kann sich das jemand erklären? Alle Teile des Flugzeuges werden aus .ply Dateien geladen.
Hatte das Problem schonmal jemand mit Blender?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (02.11.2011, 10:55)


Werbeanzeige