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
Community-Fossil
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 |
void rotate(float angle, float x, float y, float z){ mat4 m; float co, si, x2, y2, z2; angle = angle*(PI/180); co = cos(angle); si = sin(angle); x2 = x*x; y2 = y*y; z2 = z*z; m.values[0] = x2*(1-co)+co; m.values[1] = y*x*(1-co)+z*si; m.values[2] = x*z*(1-co)-y*si; m.values[3]= 0; m.values[4] = x*y*(1-co)-z*si; m.values[5] = y2*(1-co)+co; m.values[6] = y*z*(1-co)+x*si; m.values[7]= 0; m.values[8] = x*z*(1-co)+y*si; m.values[9] = y*z*(1-co)-x*si; m.values[10]= z2*(1-co)+co; m.values[11]= 0; m.values[12] = 0; m.values[13] = 0; m.values[14]= 0; m.values[15]= 1; *this *= m; } |
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 |
float m[16]; mat4 m2; glPushMatrix(); glLoadIdentity(); glRotatef(32, 1, 1, 0); glGetFloatv(GL_MODELVIEW_MATRIX, m); glPopMatrix(); m2.setIdentity(); m2.rotate(32, 1, 1, 0); for(int r = 0; r < 4; r++){ for(int c = 0; c < 4; c++){ if(m[r*4+c] != m2[r*4+c]){ cout<<r*4+c<<": "<<m[r*4+c]<<" = "<<m2[r*4+c]<<endl; } } } cout<<endl; |
Community-Fossil
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 |
axis = vec3(x, y, z); axis.normalize(); axis2 = axis; axis2 *= axis2; axis2.normalize(); angle = angle*(PI/180); co = cos(angle); si = sin(angle); x2 = axis2.x; y2 = axis2.y; z2 = axis2.z; m.values[0] = x2*(1-co)+co; m.values[1] = axis.y*axis.x*(1-co)+axis.z*si; m.values[2] = axis.x*axis.z*(1-co)-axis.y*si; m.values[3]= 0; m.values[4] = axis.x*axis.y*(1-co)-axis.z*si; m.values[5] = y2*(1-co)+co; m.values[6] = axis.y*axis.z*(1-co)+axis.x*si; m.values[7]= 0; m.values[8] = axis.x*axis.z*(1-co)+axis.y*si; m.values[9] = axis.y*axis.z*(1-co)-axis.x*si; m.values[10]= z2*(1-co)+co; m.values[11]= 0; m.values[12] = 0; m.values[13] = 0; m.values[14]= 0; m.values[15]= 1; |
C-/C++-Quelltext |
|
1 2 3 4 |
m.values[0] = axis.x*axis.x*(1-co)+co; m.values[1] = axis.y*axis.x*(1-co)+axis.z*si; m.values[2] = axis.x*axis.z*(1-co)-axis.y*si; m.values[3]= 0; |
Zitat
Basically, there are only 10 types of people in the world. Those who know binary, and those who don't.
Community-Fossil
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 |
void lookAt(float x, float y, float z, float xlook, float ylook, float zlook, float xup, float yup, float zup){ mat4 mat1, mat2; vec3 dir, right, up; up.x = xup; up.y = yup; up.z = zup; dir.x = (xlook-x); dir.y = (xlook-y); dir.z = (xlook-z); dir.normalize(); right.cross(dir, up); right.normalize(); up.cross(right, dir); up.normalize(); mat1.values[0] = right.x; mat1.values[4] = right.y; mat1.values[8] = right.z; mat1.values[12] = 0; mat1.values[1] = up.x; mat1.values[5] = up.y; mat1.values[9] = up.z; mat1.values[13] = 0; mat1.values[2] = -dir.x; mat1.values[6] = -dir.y; mat1.values[10] = -dir.z; mat1.values[14] = 0; mat1.values[3] = 0; mat1.values[7] = 0; mat1.values[11] = 0; mat1.values[15] = 1; mat2.setIdentity(); mat2.values[12] = -x; mat2.values[13] = -y; mat2.values[14] = -z; *this *= mat1; *this *= mat2; } void ortho(float left, float right, float bottom, float top, float nearp, float farp){ mat4 m; m.setIdentity(); m.values[0] = 2/(right-left); m.values[5] = 2/(top-bottom); m.values[10] = -2/(farp-nearp); m.values[3] = -(right+left)/(right-left); m.values[7] = -(top+bottom)/(top-bottom); m.values[11] = -(farp+nearp)/(farp-nearp); *this *= m; } void frustum(float left, float right, float bottom, float top, float nearp, float farp){ mat4 m; m.setIdentity(); m.values[0] = 2*nearp/(right-left); m.values[5] = 2*nearp/(top-bottom); m.values[8] = (right+left)/(right-left); m.values[9] = (top+bottom)/(top-bottom); m.values[10] = -(farp+nearp)/(farp-nearp); m.values[11] = -1; m.values[14] = -2*farp*nearp/(farp-nearp); m.values[15] = 0; *this *= m; } |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (01.09.2011, 17:49)
Stellt sich mir nurnoch die Frage wo diese geringfügige Ungenauigkeit her kommt?
So jetzt hab ich nurnoch Probleme mit lookAt, ortho und frustum die ich mir nicht erklären kann:
Community-Fossil
Bei lookAt, kommt übrigens immer -1.#IND raus...
Quellcode |
|
1 2 3 4 |
right.x right.y right.z -dot(right, eye) up.x up.y up.z -dot(up, eye) -dir.x -dir.y -dir.z dot(dir, eye) 0 0 0 1 |
Werbeanzeige