Last active
March 16, 2023 03:24
-
-
Save sketchpunk/d89d7c2a18c2d6f81bed6a6f3b50fbf9 to your computer and use it in GitHub Desktop.
Apply Euler Rotation on position & normals in GLSL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
vec3 rot = vec3( 90.0, 90.0, 0.0 ); | |
vec3 pos = position * scale; | |
vec3 norm = normal; | |
eulerRotation( rot * DEG2RAD, pos, norm ); | |
*/ | |
const float DEG2RAD = 0.01745329251; // PI / 180 | |
// Apply YXZ radian rotation | |
vec3 eulerRotation( vec3 rot, out vec3 pos, out vec3 norm ){ | |
float s; | |
float c; | |
vec3 v; | |
if( rot.z != 0.0 ){ | |
c = cos( rot.z ); | |
s = sin( rot.z ); | |
v = pos; | |
pos.x = v.x * c - v.y * s; | |
pos.y = v.x * s + v.y * c; | |
v = norm; | |
norm.x = v.x * c - v.y * s; | |
norm.y = v.x * s + v.y * c; | |
} | |
if( rot.x != 0.0 ){ | |
c = cos( rot.x ); | |
s = sin( rot.x ); | |
v = pos; | |
pos.y = v.y * c - v.z * s; | |
pos.z = v.y * s + v.z * c; | |
v = norm; | |
norm.y = v.y * c - v.z * s; | |
norm.z = v.y * s + v.z * c; | |
} | |
if( rot.y != 0.0 ){ | |
c = cos( rot.y ); | |
s = sin( rot.y ); | |
v = pos; | |
pos.x = v.z * s + v.x * c; | |
pos.z = v.z * c - v.x * s; | |
v = norm; | |
norm.x = v.z * s + v.x * c; | |
norm.z = v.z * c - v.x * s; | |
} | |
return pos; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment