분류 전체보기 102

[Effective C++]항목 32~34: 객체 지향 설계 1

항목 32 : public 상속은 is-a 관계이다. public 상속은 is-a관계를 의미한다. c가 p를 상속받는다면 c는 p이다. 하지만 p는 c가 아니다. 기본적인 상속 개념이다.객체 지향 설계에서 상속 계층구조를 설계할 때는 이러한 부분을 잘 고려해야한다. 대표적인 예시로 bird라는 클래스가 있다고하자. 이때 bird에 fly라는 함수를 넣어야할까? 만약 펭귄이 bird를 상속받는다면 이는 문제가 될 수 있다. 펭귄은 날 수 없기 때문이다. 이를 위한 해결책은 bird아래에 canflybird라는 계층을 하나더 두는 방법이 대표적이다. 아니면 bird에 fly를 가상함수로 넣고 펭귄에서 오버라이드하여 에러를 띄우는 등의 특수한 처리를 해주면 될 것이다. 어떤게 더 나은 설계인지는 자신이 만들고..

[Effective C++]항목 29~31: 구현 2

항목 29 : 예외 안정성 예외 안전성이란 어떤 함수가 자신이 실행 중 발생한 예외를 어떻게 처리하는지에 대한 안정성 수준을 이야기한다.예외 안정성에서 신경써야하는 부분은 크게 두가지이다.1. 동적할당, 뮤텍스등의 할당한 자원 해제2. 로직 무결성 유지1번째의 경우 스마트포인터, 소멸자 기반 뮤텍스등으로 쉽게 해결가능하다. 하지만 2번의 경우 스스로 로직을 잘짜야하기에 신경쓸 것이 많다.우선 예외 안정성은 다음 3가지 수준을 가진다. 기본적인 보장함수 실행 중 중간에 예외 발생시에도 무결성을 해치지않는다. 즉 정상적인 상태를 유지한다.강력한 보장함수 실행 중 중간에 예외 발생시 함수 호출전의 상태를 보존해준다. 즉 실행성공, 실행 실패 두가지 상태만 존재하며 원자성을 보장해준다.예외불가 보장함수가 밖으로..

[Effective C++]항목 26~28: 구현 1

항목 26 : 변수 생성 타이밍은 신중히하자.클래스 객체 같은 경우 변수의 생성은 기본적으로 큰 비용을 따른다. 생성자의 호출 및 이후 소멸자의 호출을 하기 때문이다. 만약 어떤 함수에서 변수를 생성할 땐 필요한 순간까지 기다렸다가 필요한 순간에 생성하는 것이 좋다. 괜히 함수 호출 초반에 변수를 생성하면 예외 처리등에 의해 해당 변수를 사용하기전에 함수가 리턴되어 끝나버릴 수도 있기 때문이다. 이경우 변수는 사용되지도 않았으면서 생성자 및 소멸자에 대한 비용을 유발하기에 성능에 좋지않다. 디자인의 측면에서도 변수를 실제 사용전 생성하면 생성하는 변수의 용도를 알기 쉬워 좋다.추가로 변수 생성 후 대입보다는 해당 초기화 값으로 바로 생성할 수 있으면 그렇게 하는 것이 당연히 더 성능이 좋다.마지막으로 반..

[언리얼 엔진5][기초 3장]렌더링 리소스 기초

메쉬 언리얼 엔진은 두 종류의 메쉬 리소스가 있다. static mesh 고정된 정점을 가진 스태틱 메쉬 skeletal mesh 관절 웨이팅이 포함되어 호환되는 관절 인덱스를 가진 스켈레톤으로 애니메이션 가능한 메쉬 메테리얼 슬롯 메쉬의 정점 및 기하구조들은 다른 메테리얼을 사용되는 그룹별로 그루핑되어있다. n개의 메테리얼 그룹을 가지는 메쉬 리소스는 n개의 메테리얼 슬롯을 가지고 있고 각 슬롯에 장착된 메테리얼이 해당 그룹 기하구조들을 렌더링하는데 사용된다. 스켈레톤 슬롯 스켈레탈 메쉬 리소스의 경우 자신에게 적용할 스켈레톤을 넣을 수 있는 스켈레톤 슬롯이있다. 스켈레톤 리소스를 넣으면 해당 스켈레톤을 사용하여 애니메이션되게된다. 메테리얼 메테리얼은 셰이더를 기반으로 만들어져 여러 값과 텍스처들을 적..

[언리얼 엔진5][기초 2장] 충돌 감지

개요 언리얼 엔진에서 콜리전속성을 가진 컴포넌트끼리는 충돌이 일어날 수 있다. 여기서 각 콜리전 설정에 따라 해당 콜리전은 각 채널의 콜리전들에 대해서 block되거나 overlap되거나 ignore될 수 있다. block은 서로 막히며 충돌 이벤트가 발생한다. overlap은 막히진않지만 겹침 이벤트가 발생한다. ignore은 무시다. 두 콜리전이 충돌하면 서로가 상대 채널에 대해 처리되는 설정 중 더 낮은 처리가 일어난다. ex)block block => block block overlap => overlap overlap ignore => ignore 충돌 이벤트 엑터 엑터의 notifyHit멤버 함수를 오버라이드하면 엑터가 가진 컴포넌트의 콜리전이 충돌 시 해당 정보들과 함께 해당 함수가 호출된다..

[일반물리학1][5장]선운동량과 충돌

선운동량 어떠한 물체의 현재 운동량은 다음과 같다. p = mv 여기서 물체의 순간 선운동량 변화량은 알짜힘과 같다. 충돌량 충돌량은 어떤 시간간격에서의 운동량 변화량을 나타낸다. 보통 충돌후 급격히 변한 운동량을 나타낸다. 충돌량을 그 시간간격으로 나누면 그 구간동안 가해진 평균 알짜힘이 나온다. 탄성 충돌, 비탄성 충돌 일단 마찰력이나 외력등이 발생하지 않았는 고립계안에서 물체끼리 충돌을 하여 운동의 형태가 변했다고 하자. 이때 각 물체들의 운동량의 총합은 변하지않는다. 이는 모든 충돌에 해당된다. 이때 충돌 후 각 물체의 운동에너지의 총합 조차도 변하지않는 충돌을 탄성충돌, 변하는 충돌은 비탄성 충돌이라고 한다. 탄성 충돌은 기본적으로 아무런 외력없이 발생한 충돌에서 나타난다. 비탄성 충돌은 외력이..

[컴퓨터비전개론][9장]Camera

개요 이번 시간엔 카메라가 어떻게 작동하는지와 3차원 좌표가 2차원 좌표에 투영되는 변환을 살펴보자. 그래픽스에 비해 깊이결과를 고려하지않고 xy결과도 주어진 깊이 d 투영창에 대한 시야 공간 상 좌표로의 변환이기에 훨씬 간단하게 표현된다. 그래픽스는 해당 좌표를 주어진 시야각에 대해 ndc로 만들어야 하고 깊이 결과도 만들어야 했기에 훨씬 복잡했다. 이번장은 투영을 포함한 대부분 내용이 그래픽스에서 다뤘기에 생략하고 간단히 넘어가겠다. 카메라 카메라는 간단히 말하면 다음과 같이 작동된다. 중간에 한점만 구멍이 뚫린 가림막으로 인해 외부의 반사된 빛들이 필름의 대칭된 부분에 투사된다. 여기서 가림막 대신 볼록렌즈를 사용하면 같은 효과를 내면서도 빛을 더 많이 모아 성능이 좋아진다. 투영 (x,y,z)의 ..

[컴퓨터비전개론][8장]RANSAC

개요 이전 시간에 특징점 쌍들의 위치를 변화시켰을때 오차의 총합이 가장 적은 변환행렬을 구했다. 하지만 여기서 특징점 쌍들중 잘못 매칭되어 정상 변환과 크게 벗어나는 쌍들이 있을 수 있다. 이런 쌍들은 최종 변환 행렬의 정확도를 떨어트린다. 정상적으로 매칭되어 정상 범주의 변환을 기대하는 특징점 쌍들을 inliers 아닌 쌍들을 outliers라고 한다. RANSAC은 특징점 쌍들중 outliers를 쳐내고 inliers만 남기는 알고리즘 중 하나이다. RANSAC RANSAC은 다음 단계로 처리된다. 1. 샘플 쌍 개수를 정한다. 보통 사용할 변환 행렬을 정의할 수 있는 최소 쌍 개수로 정한다. (이동행렬이면 1개, 아핀이면 3개, homograph면 4개) 2. 전체 특징점 쌍중 샘플 쌍 개수만큼 랜..

[컴퓨터비전개론][7장]Image alignment

개요 이제 두 이미지에서 각각 특징점을 추출하고 매칭을 시켰다고하자. 여기서 우리는 매칭된 각 특징점 쌍들의 집합을 분석하여 이미지에 최종적으로 적용할 변환행렬을 구해내야한다. 이동 변환 먼저 단순히 이동 변환으로만 변환행렬을 정의한다고 해보자. 변환행렬은 x이동,y이동 두개의 매개 변수로 정의될 수 있다. 이는 간단히 다음과 같이 구할 수 있다. 각 특징점 쌍들의 x,y위치 차이를 평균낸다. 그 위치 차이만큼 이동하는 행렬이 최종 변환 행렬이다. 하지만 여기서 그치지 않고 이를 선형 회귀의 관점에서 구해보자. 구하고자하는 변환 행렬의 이동량 x,y를 각각 tx,ty라 해보자. 이때 한 이미지의 특징점들의 x+tx,y+ty는 다른 이미지의 각 특징점 x`,y`과 최대한 근접해야 한다. 각 특징점 쌍에 대..

[언리얼 엔진5][기초 1장] 엑터와 컴포넌트

엑터와 컴포넌트 언리얼 엔진은 월드안에 엑터들이 존재하며 엑터들은 컴포넌트들을 가지고 있다. 여기서 엑터는 오로지 월드위에만 존재 할 수 있으며 다른 엑터에 속할 수 없다.(월드 상의 트랜스폼 배치를 이야기하는 것 이다. 클래스에서 다른 엑터의 참조를 가지는 등은 당연히 가능) 대신 엑터가 가지는 컴포넌트들이 엑터 아래에서 계층적으로 존재한다. 엑터 바로 아래에 루트 컴포넌트가 존재하며 그 아래 계층적으로 존재한다. 엑터 ㄴ 루트 컴포넌트 ㄴ컴포넌트 ㄴ컴포넌트 ㄴ컴포넌트 ㄴ컴포넌트 그럼 계층적인 트랜스폼은 어떻게 표현할까? 컴포넌트 중 씬 컴포넌트는 트랜스폼을 가지는 컴포넌트이다. 이러한 컴포넌트들의 계층으로 계층적인 트랜스 폼을 표현 가능하다. 여기서 루트 컴포넌트는 반드시 씬 컴포넌트나 그의 자손(C..