전체 글 (308) 썸네일형 리스트형 [그래픽스] 직선과 삼각형의 충돌 게임에서 대부분의 모델링은 무수히 많은 삼각형들로 이루어져 있다. 그래서 이번에는 빛과 삼각형이 만날 때 처리를 하기 위해서 선과 삼각형의 충돌에 대해 알아볼 것이다. 삼각형은 세개의 정점으로 이루어져 있다. 당연히 이 세개의 정점은 같은 평면 위에 있을 것이고 이 때 평면의 법선벡터 n과 충돌점 p를 구하는 법을 알아보자. 평면의 법선벡터는 v1-v0과 v2-v0을 외적하고 normalize 해주면 구할 수 있다. 여기서 주의사항은 정점의 순서에 따라 평면의 법선벡터 방향이 반대가 될 수 있다는 것이다. 예를 들어 v0, v1, v2 시계방향이라면 법선 벡터는 평면 위쪽을 가리킬 것이지만, v0, v2, v1 반시계 방향이라면 벡터는 평면 아래쪽으로 향할 것이다. 그래서 외적하는 순서에 따라 법선벡터의.. 23. 05. 15 - 정적 라이브러리와 동적 라이브러리 외 d3dx 헤더는 무겁다. 현재 directx9로 프로젝트를 진행하고 있는데 directx9관련 와 헤더를 사용하고 있다. 이 둘의 차이는 무엇일까? d3d9는 directx9의 기본적인 기능을 담고 있고 d3dx9는 그것을 활용해 개발하는데 사용할 수 있도록 만든 범용적인 기능들의 집합이다. 하지만 지금은 d3dx 시리즈의 헤더 사용을 microsoft에서 권장하지 않는다. 왜냐하면 범용적인 기능들을 한번에 담은만큼 프로그램이 무거워지고 퍼포먼스가 느려지기 때문이다. 그래서 microsoft에서는 directx11 이후로 기능들을 세분화해서 기능별로 라이브러리를 제공하고 있다. 정적 라이브러리와 동적 라이브러리 정적 라이브러리 동적 라이브러리(DLL) lib 파일 생성 lib, dll 파일 생성 구현한 .. 23. 05. 12 - CBase 클래스, 소멸자 vs 함수, 라이브러리 만들고 적용 CBase 클래스 이제부터 생성하는 모든 클래스는 CBase 클래스를 상속받게 될 것이다. 왜냐하면 객체의 레퍼런스 카운트를 저장할 것이기 때문이다. 객체가 참조당할 때 마다 레퍼런스 카운트가 증가하고 더 이상 참조하지 않으면 Safe_Release를 통해 감소시킨다. Safe_Release를 했을 때 레퍼런스 카운트가 0이라면 아무도 객체를 참조하지 않는 것이므로 삭제할 수 있다. unsigned long CBase::AddRef() { return ++m_dwRefCnt; } unsigned long CBase::Release() { return m_dwRefCnt--; } 주의해야할 점은 AddRef함수는 레퍼런스 카운트가 증가되고 난 후의 값을 반환하고 Release는 레퍼런스 카운트가 감소되기 .. [그래픽스] 선과 구의 충돌 그래픽스 광추적기(레이 트레이싱)를 만들면서 공부하게 되었다. 선과 구는 세가지 충돌관계를 가질 수 있다. 1. 충돌하지 않거나, 2. 선이 구의 가장자리에 닿아 한 점에만 접하거나, 3. 선이 구를 관통해 두 점과 겹치는 경우이다. 첫번째 식은 구의 방정식이고 두번째 식은 직선을 표현한다. 직선에서 x는 구와 직선이 겹친 점, o는 직선의 시작점, d는 시작점부터 x까지의 거리, u는 직선의 방향벡터이다. x = o + du를 구의 방정식의 x에 대입하고 d에 대해 정리하면 d에 대한 2차방정식이 만들어진다. 그리고 근의 공식을 이용해서 d의 값을 알아내고, 직선과 구의 충돌관계를 알아낼 수 있다. 복잡한 근의 공식을 다 풀 필요없이 역삼각형으로 되어있는 나블라라는 것의 식에 값을 대입해보면 된다. 나.. 23. 05. 11 - 프로젝트 파일 디렉터리 설정, 클래스 get/set 함수 지양 일반 > 출력 디렉터리 exe 파일이 생성되는 경로를 지정한다. 경로의 마지막이 폴더명일 경우 뒤에 \ 를 붙여야 한다. C++ > 일반 > 추가 포함 디렉터리 경로에 헤더파일이 있는지 한번 더 검색해줘서 경로를 안적어도 되게 한다. 예를 들어 프로젝트 상위 경로의 public 폴더에 있는 헤더파일을 사용하려면 "..\Public\헤더이름.h" 이런식으로 작성해야 하는데 ..\Public을 추가해놓는다면 그냥 "헤더이름.h"로 사용할 수 있다. 보통 클래스의 멤버 변수는 public으로 선언하면 안된다고 알고 있다. 그래서 우리는 get/set 함수를 이용해서 private 멤버 변수에 접근하고 있는데, 모든 멤버 변수에 대해 get/set 함수를 이용해서 접근한다면 public 멤버 변수와 뭐가 다르단.. [그래픽스] Kernel, Convolution, Gaussian Blur 위 사진은 위키피디아에서 Kernel(Image Processing)부분을 가져온 것이다. 이미지에 행렬의 형태를 하고 있는 Kenel을 적용하면 사진을 흐리게 하거나 날카롭게 하는 등 다양한 효과를 줄 수 있다. 행렬에 있는 숫자를 모두 더하면 1이라는 공통점이 있다. 이미지에 Kernel을 적용하는 것을 Convolution이라고 한다. 이미지의 원본 픽셀 값에 Kernel 값을 곱한 값이 최종 이미지의 값이 된다. 위 그림은 2차원 커널을 적용한 것인데, 원본 이미지 픽셀에서 없는 부분은 가장 가까운 픽셀값에서 끌어온다. 그리고 3x3 행렬에서 같은 위치에 있는 픽셀 값과 커널 값을 곱하고 모두 더한 값을 최종 이미지 픽셀(초록색)에 저장한다. 예시로 Blur을 만들기 위해서 Separable Co.. [수학] 역삼각함수로 각도 구하기 좌표와 좌표사이 각도를 계산할 때 역삼각함수를 사용해서 구할 수 있다. asin, acos, atan을 이용해 각도를 구해보고 삼각함수의 원리를 이해해보자. 윈도우 좌표계에서 1사분면 2사분면은 0~180도, 3사분면 4사분면은 0~-180도를 나타낸다. asin asin 함수는 -90도부터 90도까지만 표현할 수 있다. 그렇다면 90도가 넘어갈때 (2사분면에서)는 각도를 어떻게 구하는지 살펴보자. 빨간색 각도를 구한다고 했을 때 좌표 A와 B사이 asin값은 Θ1이고 180도에서 Θ1을 빼 그래서 90도에서 180도 사이일때는 180도에서 B좌표와 A좌표의 asin값을 빼주면 된다. 각도가 -90도에서 -180 일때 (3사분면) 2사분면일 때와 같은 원리이지만 -180도에서 Θ1를 빼야한다. Θ1를 더.. [백준] 2294번 - 동전 2 (동적 계획법) 글의 순서가 우연히 동전 1 다음이 됐지만 동전1을 풀고나서 다른 문제를 많이 풀었다. 이 문제를 풀다가 주의해야 할점을 발견해서 정리한다. 동적 계획법 문제에서 cache의 최소 값을 구해야 할 경우 처음에 cache배열을 큰 값으로 초기화하곤 했다. int main() { cin >> N >> K; for (int i = 1; i > coin[i]; for (int i = 1; i 이전 1 ··· 8 9 10 11 12 13 14 ··· 39 다음