전체 글
-
기저 벡터(Basis Vectrors)의 변환 i,j,k를 변환시킨다는 것은 어떻게 보면, 좌표계 자체를 변환시킨다는 의미로 볼 수도 있다. 변환의 구성 1. 여러 변환을 한번씩 한번씩 한다고 생각할 수 있음 2. 다른 방식으로는 공간 그 자체를 한번에 변환시킨다고 생각할 수도 있음 참고로 변환의 순서가 중요하다. 아래 a,b그림을 보면 같은 변환을, 순서만 바꿔서 했더니 결과가 다르다. 내가 연산한 순서가 내가 의도한 결과를 내는지 잘 확인하는것이 중요하다. 좌표계 변환 벡터 사례 프레임==좌표계==스페이스==레퍼런스 프레임 전부 같은 의미 포인트 사례 프레임 B에서 프레임 A로 갔다가 PA로 가는 것을 표현한 식. 아주 간단한 예제(이해를 돕기위한) 프레임A와 프레임 B가 높이만 10차이나게 있다고 ..
좌표계 변환기저 벡터(Basis Vectrors)의 변환 i,j,k를 변환시킨다는 것은 어떻게 보면, 좌표계 자체를 변환시킨다는 의미로 볼 수도 있다. 변환의 구성 1. 여러 변환을 한번씩 한번씩 한다고 생각할 수 있음 2. 다른 방식으로는 공간 그 자체를 한번에 변환시킨다고 생각할 수도 있음 참고로 변환의 순서가 중요하다. 아래 a,b그림을 보면 같은 변환을, 순서만 바꿔서 했더니 결과가 다르다. 내가 연산한 순서가 내가 의도한 결과를 내는지 잘 확인하는것이 중요하다. 좌표계 변환 벡터 사례 프레임==좌표계==스페이스==레퍼런스 프레임 전부 같은 의미 포인트 사례 프레임 B에서 프레임 A로 갔다가 PA로 가는 것을 표현한 식. 아주 간단한 예제(이해를 돕기위한) 프레임A와 프레임 B가 높이만 10차이나게 있다고 ..
2023.11.22 -
애파인 변환? 선형 변환과 이동을 하나의 행렬로 표현 참고자료: https://youtu.be/AheaTd_l5Is Homogeneous Coordinates 벡터: (x,y,z,0)
애파인 변환 (Affine Transformation)애파인 변환? 선형 변환과 이동을 하나의 행렬로 표현 참고자료: https://youtu.be/AheaTd_l5Is Homogeneous Coordinates 벡터: (x,y,z,0)
2023.11.21 -
핵심: 회전도 선형 변환이다. 따라서 회전도 행렬로 표현할 수 있다. 어떤 포인트를 회전시키고 싶다면, 벡터 곱하기 행렬형태로 사용할 수 있다. 회전축에 대한 벡터의 회전 먼저 회전 축을 정해야 한다. 그 다음 몇도만큼 회전할지 정해야 한다. 컴퓨터 그래픽스에서는 3차원 회전에 가장 기본적으로 사원수(Quaternion)을 사용한다. || n x v || == || v ⊥ || 이렇게 길이가 같은데 왜 같을까? 크로스 프로덕트해서 나온 벡터의 길이는 두 벡터가 만드는 평행사변형의 넓이와 같다. 사각형의 넓이는 밑변 x 높이 밑변은 w, 높이는 |v|sinθ 다. 따라서 || n x v || == || v ⊥ || 이다. 따라서 두 벡터가 원을 정의 할 수 있다. 그래서 그 원을 위와같이 한 평면으로 보면..
회전핵심: 회전도 선형 변환이다. 따라서 회전도 행렬로 표현할 수 있다. 어떤 포인트를 회전시키고 싶다면, 벡터 곱하기 행렬형태로 사용할 수 있다. 회전축에 대한 벡터의 회전 먼저 회전 축을 정해야 한다. 그 다음 몇도만큼 회전할지 정해야 한다. 컴퓨터 그래픽스에서는 3차원 회전에 가장 기본적으로 사원수(Quaternion)을 사용한다. || n x v || == || v ⊥ || 이렇게 길이가 같은데 왜 같을까? 크로스 프로덕트해서 나온 벡터의 길이는 두 벡터가 만드는 평행사변형의 넓이와 같다. 사각형의 넓이는 밑변 x 높이 밑변은 w, 높이는 |v|sinθ 다. 따라서 || n x v || == || v ⊥ || 이다. 따라서 두 벡터가 원을 정의 할 수 있다. 그래서 그 원을 위와같이 한 평면으로 보면..
2023.11.19 -
타우를 선형변환이라고 생각하면 된다. 선형 변환은 스케일링, 로테이션을 의미한다. 위의 두 가지 성질을 만족시키면 선형변환이라고 할 수 있다. 반대로 어떤것이 선형변환이다라고하면 위의 두 성질을 이용할 수 있다는 의미. 선형 변환이 아닌 경우 선형 변환의 예시 회전도 선형변환이다. 이동은 선형 변환일까? 선형변환만 가지고는 회전과 이동을 함께 다룰 수 없다. 추가적인 개념이 필요. 선형 변환의 행렬 표현 결국 선형변환을 벡터와 행렬형태의 곱셈으로 나타낼 수 있어서, 프로그래밍하기 쉽다라는 것을 말할려고 하는 것임. 스케일링 스케일링은 각 vertex들의 좌표에 곱셈을 하면 됨. 물론 스케일링의 역변환을 구하려면 역행렬을 구하면 나오긴 한다. 그러나 그냥 기하학적인 역변환을 구하는게 훨씬 쉽고 빠르다. 예시
선형 변환 (Linear Transformation)타우를 선형변환이라고 생각하면 된다. 선형 변환은 스케일링, 로테이션을 의미한다. 위의 두 가지 성질을 만족시키면 선형변환이라고 할 수 있다. 반대로 어떤것이 선형변환이다라고하면 위의 두 성질을 이용할 수 있다는 의미. 선형 변환이 아닌 경우 선형 변환의 예시 회전도 선형변환이다. 이동은 선형 변환일까? 선형변환만 가지고는 회전과 이동을 함께 다룰 수 없다. 추가적인 개념이 필요. 선형 변환의 행렬 표현 결국 선형변환을 벡터와 행렬형태의 곱셈으로 나타낼 수 있어서, 프로그래밍하기 쉽다라는 것을 말할려고 하는 것임. 스케일링 스케일링은 각 vertex들의 좌표에 곱셈을 하면 됨. 물론 스케일링의 역변환을 구하려면 역행렬을 구하면 나오긴 한다. 그러나 그냥 기하학적인 역변환을 구하는게 훨씬 쉽고 빠르다. 예시
2023.11.18 -
회전 주의 Transpose를 하면 -Sin theta가 왼쪽 아래에 온다. 이동 1을 더 붙였다! -> 이동 됨. 0을 붙이면? -> 이동 안됨. 즉, 일반 벡터면 0 붙이고, point 좌표이면 1을 붙인다. (차원 추가) 이런 방식을 Homogeneous Coordinates (동차좌표계)라고 부른다. Homogeneous Coordinates (동차좌표계) 벡터/포인트의 회전과 이동을 하나의 행렬로 표현 가능하다! 엄청 편하다!
변환 (Transformations)회전 주의 Transpose를 하면 -Sin theta가 왼쪽 아래에 온다. 이동 1을 더 붙였다! -> 이동 됨. 0을 붙이면? -> 이동 안됨. 즉, 일반 벡터면 0 붙이고, point 좌표이면 1을 붙인다. (차원 추가) 이런 방식을 Homogeneous Coordinates (동차좌표계)라고 부른다. Homogeneous Coordinates (동차좌표계) 벡터/포인트의 회전과 이동을 하나의 행렬로 표현 가능하다! 엄청 편하다!
2023.11.17 -
핵심 어떤 벡터를 이동, 회전, 스케일링 등등 Transformation 을 가하고 싶으면, 그 벡터에 행렬을 곱하면 된다. 행렬 표기법 row, column 행, 열 그림에서 행렬 B는 3x2 행렬 directX 에서는 u와 같은 row vector를 선호 Row Vector Column Vector 행렬 더하기 주의: 크기가 다른 행렬끼리는 더할 수 없다. 예) C+D=? 불가능 컴퓨터에게 연산을 시킬때, r(A+B)라고 계산을 시키는 쪽이 rA+rB 계산 시키는 쪽 보다 빠를것이다. r(A+B): 덧셈4번, 곱셈4번 rA+rB: 덧셈4번, 곱셈8번 같은 이유로 (r+s)A 가 rA + sA보다 더 빠름 행렬 곱하기 행렬끼리도 크기가 맞아야 한다. 예를들어 다음과 같은 AB의 곱셈은 불가. AB와 B..
행렬핵심 어떤 벡터를 이동, 회전, 스케일링 등등 Transformation 을 가하고 싶으면, 그 벡터에 행렬을 곱하면 된다. 행렬 표기법 row, column 행, 열 그림에서 행렬 B는 3x2 행렬 directX 에서는 u와 같은 row vector를 선호 Row Vector Column Vector 행렬 더하기 주의: 크기가 다른 행렬끼리는 더할 수 없다. 예) C+D=? 불가능 컴퓨터에게 연산을 시킬때, r(A+B)라고 계산을 시키는 쪽이 rA+rB 계산 시키는 쪽 보다 빠를것이다. r(A+B): 덧셈4번, 곱셈4번 rA+rB: 덧셈4번, 곱셈8번 같은 이유로 (r+s)A 가 rA + sA보다 더 빠름 행렬 곱하기 행렬끼리도 크기가 맞아야 한다. 예를들어 다음과 같은 AB의 곱셈은 불가. AB와 B..
2023.11.17 -
벡터는 굵은 소문자, 행렬은 굵은 대문자 사용. 벡터 벡터는 방향과 크기 (direction and magnitude) 두 벡터의 방향과 길이가 같으면 같은 벡터 벡터는 위치 무관 변위(displacements) 시작점과 상관없이 미는 정도(u). 이동을 벡터를 사용해서 표현할 수 있다. 좌표계에서 벡터의 좌표 벡터를 좌표계에 표현가능 벡터의 표준 위치 벡터의 꼬리를 0,0(원점)에 놓으면 표준위치. 좌표계 왼손 좌표계 vs 오른손 좌표계 DirectX, Unreal Engine 등은 왼손좌표계를 사용. Opengl, Vulkan, 컴퓨터 비전 쪽 등은 오른손 좌표계 사용. 통일되지 않았음. 기본적인 벡터 연산 벡터의 길이 단위 벡터(unit vector) 내적 (Dot Product) Orthogona..
벡터벡터는 굵은 소문자, 행렬은 굵은 대문자 사용. 벡터 벡터는 방향과 크기 (direction and magnitude) 두 벡터의 방향과 길이가 같으면 같은 벡터 벡터는 위치 무관 변위(displacements) 시작점과 상관없이 미는 정도(u). 이동을 벡터를 사용해서 표현할 수 있다. 좌표계에서 벡터의 좌표 벡터를 좌표계에 표현가능 벡터의 표준 위치 벡터의 꼬리를 0,0(원점)에 놓으면 표준위치. 좌표계 왼손 좌표계 vs 오른손 좌표계 DirectX, Unreal Engine 등은 왼손좌표계를 사용. Opengl, Vulkan, 컴퓨터 비전 쪽 등은 오른손 좌표계 사용. 통일되지 않았음. 기본적인 벡터 연산 벡터의 길이 단위 벡터(unit vector) 내적 (Dot Product) Orthogona..
2023.11.12 -
조명의 세 가지 종류 조명으로부터 멀어지면 점점 어두워지는 것을 어떻게 구현? 정확한 물리 계산을 하면 너무 느림 falloffStart falloffEnd 이 두 가지를 이용한다. Spot Lights 중심에서 멀 수록 빛이 약해야 한다. 중심에 가까울수록 빛이 강해야 한다. vec3 ComputeSpotLight(Light L, Material mat, vec3 pos, vec3 normal, vec3 toEye) { vec3 lightVec = L.position - pos; // 쉐이딩할 지점부터 조명까지의 거리 계산 float d = length(lightVec); // 너무 멀면 조명이 적용되지 않음 if (d > L.fallOffEnd) return vec3(0.0f); lightVec /=..
조명조명의 세 가지 종류 조명으로부터 멀어지면 점점 어두워지는 것을 어떻게 구현? 정확한 물리 계산을 하면 너무 느림 falloffStart falloffEnd 이 두 가지를 이용한다. Spot Lights 중심에서 멀 수록 빛이 약해야 한다. 중심에 가까울수록 빛이 강해야 한다. vec3 ComputeSpotLight(Light L, Material mat, vec3 pos, vec3 normal, vec3 toEye) { vec3 lightVec = L.position - pos; // 쉐이딩할 지점부터 조명까지의 거리 계산 float d = length(lightVec); // 너무 멀면 조명이 적용되지 않음 if (d > L.fallOffEnd) return vec3(0.0f); lightVec /=..
2023.11.11 -
vec4 MyPixelShader(const PSInput psInput) { vec3 eye = vec3(0.0f, 0.0f, -1.0f); vec3 toEye = glm::normalize(eye - psInput.position); vec3 color = ComputeDirectionalLight(constants.light, constants.material, psInput.normal, toEye); return vec4(color, 1.0f); } 쉐이딩을 어디서 하는 것이 좋을까? vertex shader? pixel shader? vertex shader는 pixel shader 보다 처리해야할 계산 수가 훨씬 적다. 따라서 계산이 빠를것이다. 그러나 퀄리티는 떨어질 것이다. 요즘 GPU는..
블린-퐁 쉐이딩 (Blinn-Phong Shading)vec4 MyPixelShader(const PSInput psInput) { vec3 eye = vec3(0.0f, 0.0f, -1.0f); vec3 toEye = glm::normalize(eye - psInput.position); vec3 color = ComputeDirectionalLight(constants.light, constants.material, psInput.normal, toEye); return vec4(color, 1.0f); } 쉐이딩을 어디서 하는 것이 좋을까? vertex shader? pixel shader? vertex shader는 pixel shader 보다 처리해야할 계산 수가 훨씬 적다. 따라서 계산이 빠를것이다. 그러나 퀄리티는 떨어질 것이다. 요즘 GPU는..
2023.11.10 -
이전 ray tracing 기법에서 했던대로 곧이 곧대로 구현하기만 하면, 왜곡이 일어난다. 이를 수정하는 방법을 배우고, 또한 우리의 눈의 위치와 물체의 위치와의 거리에 따라 보이는게 달라진다. 예를 들어 물체와 가까워질수록 기울어진 각도등이 과장돼서 보이고, 멀어질수록 평면적으로 보인다. Z축은 투영되니까 그냥 0이 되고, Y축은 그림처럼 삼각형의 닮음을 이용한 비례식으로 구할 수 있다. X축도 마찬가지로 위에서 봤을때라고 생각하면 Y와 마찬가지로 구할 수 있다. 이것만 가지고 구하면 다음처럼 왜곡된 형태가 나온다. // 원근투영(Perspective projection) if (this->usePerspectiveProjection) { // ... const float scale = distEye..
원근 투영 (Perspective Projection)이전 ray tracing 기법에서 했던대로 곧이 곧대로 구현하기만 하면, 왜곡이 일어난다. 이를 수정하는 방법을 배우고, 또한 우리의 눈의 위치와 물체의 위치와의 거리에 따라 보이는게 달라진다. 예를 들어 물체와 가까워질수록 기울어진 각도등이 과장돼서 보이고, 멀어질수록 평면적으로 보인다. Z축은 투영되니까 그냥 0이 되고, Y축은 그림처럼 삼각형의 닮음을 이용한 비례식으로 구할 수 있다. X축도 마찬가지로 위에서 봤을때라고 생각하면 Y와 마찬가지로 구할 수 있다. 이것만 가지고 구하면 다음처럼 왜곡된 형태가 나온다. // 원근투영(Perspective projection) if (this->usePerspectiveProjection) { // ... const float scale = distEye..
2023.11.10