OpenGL – Game Math

말이 게임이지 그냥 그래픽 배우는중.

https://heinleinsgame.tistory.com/10?category=757483

위 사이트를 보고 수학 관련 정리

<벡터>

벡터는 기본적으로 방향을 가리키고, 크기(길이)의 정보도 갖고있음

길이(크기)-> 루트(요소1제곱 + 요소2제곱 + ….) 피타고라스 정리*
단위벡터-> 길이가 무조건 1. (요소1 / 길이)2 + (요소2 / 길이)2 + (요소3 / 길이)2 = 1 단위벡터
()2 = 제곱
내적 -> 두 벡터간의 각도를 구할 때 씀. cos의 역함수로 각도가 나옴. 단위 벡터간 곱해서 나온게 cos-1에 들어갈 놈.
외적-> 가위질. 중간*밑 – 밑*중간, 밑*위 – 위*밑, 위*중간, 중간*위 그냥 외워

<행렬>

변환행렬

단위 행렬 -> 1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

확대.축소 -> x 0 0 0
0 x 0 0
0 0 x 0
0 0 0 1 여기에 연산하는 벡터는 좌표가 아닌 오브젝트의 길이일듯
비균일, 균일 스케일

이동-> 1 0 0 x
0 1 0 x
0 0 1 x
0 0 0 1 여기는 오브젝트의 현재 좌표를 넣어서 더해짐

동차좌표 w 가 0 -> 방향벡터 – > 0이면 이동시킬 수 없기 때문

회전 -> 각도에 의한 각 = 라디안 * (180.0f / PI) 
라디안에 의한 각 = 각도 * (PI / 180.0f) 
PI는 3.14159265359와 같습니다.
반원을 돌리면 360/2 = 180도 회전하고 1/5회전하면 360/5 = 72도 회전.
3D 공간에서의 회전은 각 그리고 회전 축을 사용
지정된 각은 주어진 축에 대해 회전. 하나의 회전 축을 바라보며 머리를 회전시켜보면서 생각. 3D 공간에서 2D 벡터를 회전시킬 때 회전축을 z축으로 설정.

나중에 사원수 배움. 배울 때 추가 수정! 나중에 게임에 행렬 조합 사용해 보기.

행렬 조합 -> 행렬을 곱할 떄 이동을 먼저 한 후, 스케일링이 된다.
행렬은 교환 법칙이 성립 되지 않기 떄문에 순서가 중요!
행렬을 곱할 때 가장 오른쪽에 있는 행렬이 벡터와 처음으로 곱해지므로 곱셈은 오른쪽에서 왼쪽으로 읽어야 함. 행렬을 조합할 때 먼저 스케일 연산을 한 후 회전 연산을 하고 마지막으로 이동 연산을 하는 것을 권장. 그렇게 하지 않으면 (부정적인) 효과를 서로에게 줄 수 있음. 예를 들어 먼저 이동을한 후 스케일링을 했다면 이동 벡터 또한 스케일됨.

trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

이동 변환

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f);
glm::mat4 trans; trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f));
vec = trans * vec;
std::cout << vec.x << vec.y << vec.z << std::endl;

회전, 스케일링

glm::mat4 trans;
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5));

comment

タイトルとURLをコピーしました