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
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 |
void setRotation(float &angle) { A = rotatePointbyPoint(center.x, center.y, A.x, A.y, angle); B = rotatePointbyPoint(center.x, center.y, B.x, B.y, angle); C = rotatePointbyPoint(center.x, center.y, C.x, C.y, angle); D = rotatePointbyPoint(center.x, center.y, D.x, D.y, angle); // Vertex static const GLfloat vertex[] = { A.x, A.y, 0.f, B.x, B.y, 0.f, C.x, C.y, 0.f, D.x, D.y, 0.f, }; // UVs static const GLfloat uvs[] = { 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, }; glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(uvs), uvs, GL_STATIC_DRAW); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Vector2f rotatePointbyPoint(float centerx, float centery, float pointx, float pointy, float angle) { float s = std::sin(angle); float c = std::cos(angle); // translate point back to origin pointx -= centerx; pointy -= centery; // rotate point float xnew = pointx * c - pointy * s; float ynew = pointx * s + pointy * c; // translate point back Vector2f newpoint; newpoint.x = xnew + centerx; newpoint.y = ynew + centery; return newpoint; } |
Community-Fossil
Zitat
Mein Ansatz war es, alle 4 Punkte um den Mittelpunkt zu rotieren und dann die Punkte mit den neuen Koordinaten wieder als VBO zu übergeben.
C-/C++-Quelltext |
|
1 2 3 4 5 |
mat4 m; // neue Modelview m.setIdentity(); // Identitätsmatix setzen (sonst kann man damit nicht rechnen) m.translate(-flaeche.breite/2, -flaeche.hoehe/2, 0); // auf den Mittelpunkt schieben... m.rotate(winkel, 0, 0, 1); // drehen... m.translate(flaeche.breite/2, ...); // zurückschieben! |
Zitat
jedoch wird die Textur nach rechts verschoben und nur bei dem ersten Funktionsaufruf von setRotation wird es gedreht.
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 |
glBindTexture(GL_TEXTURE_2D, myID); glUniform1i(myTextureSampler, 0); // Vertices glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 ); // UVs glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 ); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); |
Community-Fossil
Zitat
Den Code den du mir geschickt hast ist "älteres" OpenGL. Aber ich will ja OpenGL +3 benutzten :/.
Zitat
Btw: Wenn es um 2D geht und ich die Koordinaten von einem Mesh ändern will, soll ich das über den Shader machen oder einfach nochmal als VBO machen?
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#version 150 uniform mat4 projection; uniform mat4 modelview; in vec3 vertex0; // Vertexbuffer in vec2 texCoord0; // TexCoordbuffer out vec2 texCoord; // Texturkoordiante an Fragmentshader weitergeben void main(){ gl_Position = projection*modelview*vec4(vertex0, 1.0); // Ausgabe Vertex texCoord = texCoord0; } |
Zitat
jedoch wird die Textur nach rechts verschoben und nur bei dem ersten Funktionsaufruf von setRotation wird es gedreht.
Liegt daran das du glBufferData() benutzt. Wenn du einen Buffer aktualisieren willst nimmst du glBufferSubData() (natürlich nachdem du ihm überhaupt erstmal Daten gegen hast mit glBufferData()). Und wenn du so häufig den Inhalt eines Buffers ändern willst solltest du nicht STATIC_DRAW benutzen, sondern DYNAMIC_DRAW. Aber für dieses Problem sind beide Wege Schwachsinn
Btw: Wenn es um 2D geht und ich die Koordinaten von einem Mesh ändern will, soll ich das über den Shader machen oder einfach nochmal als VBO machen?
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (22.07.2012, 16:33)
Community-Fossil
Zitat
glBufferData() sollte genauso funktionieren
Community-Fossil
Zitat
glBufferSubData() ist möglicherweise effizienter
C-/C++-Quelltext |
|
1 2 3 4 |
float angle = 180.f * 0.0174532925f; glm::mat4 mat(1.f); glm::rotate(mat, angle, glm::vec3(sprite.getPosition().x, sprite.getPosition().y, 0.f)); GLuint MatrixID = glGetUniformLocation(programID, "MVP"); |
C-/C++-Quelltext |
|
1 |
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mat[0][0]); |
Community-Fossil
C-/C++-Quelltext |
|
1 |
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, m.getArray());
|
Werbeanzeige