주인장 공지입니다. Lu's…〃 Diary。

반갑습니다. 루사인이라고 합니다.


1. 책 리뷰 & 프로그래밍 일기 블로그입니다.

2. 가끔 성과 글도 올라와요.

3. @Lusain_Kim 에 상주 중.



환영합니다.

[C++] 생성자가 보호된 객체로 스마트 포인터 만들기 Lu's…〃 Programing。

몇몇 드문 경우(싱글톤 등) class의 생성자가 public이 아닐 경우가 있다. 이 객체를 unique_ptr 또는 shared_ptr로 만들 필요가 있을 때도 존재할 것이다. 이 때 몇 가지 방법이 있다.

  1. 걍 팩토리 함수를 friend로 걸고 스마트 포인터 팩토리(make_~~) 함수를 쓰지 않고 때려박아 만든다.
    ex) auto instance = std::unique_ptr<MyClass>{ new MyCalss{} };

    이 경우 생각하지 않고 때려박기 때문에 좋다. 사실 스마트 포인터 팩토리 함수를 쓸 필요따윈 없다.

  2. 스마트 포인터 팩토리 함수를 friend에 등록한다.
    ex)

    class MyClass { //...

    template<class _Ty, class... _Types, class = enable_if_t<!is_array<_Ty>::value>>
    friend unique_ptr<_Ty> std::make_unique(_Types&&... _Args);

    이러면 make_unique 함수가 생성자에 접근할 수 있다. 

 이 때 2번 방법은 최대한 피해야 하는데, 당연하게도 스마트 포인터 팩토리 함수를 호출하는 걸로 객체를 직접 만들 수 있게 된다. 의도하지 않은 객체가 생길 수 있는거다.

그냥 항상 관리되는 객체를 만들고 싶다면 추천하는 방법이긴 하지만... 

Debugging with Visual Studio Lu's…〃 Programing。





프로파일링과 그래픽 디버깅에 대해 추가로 작성하였고, 도구 외적인 요소는 배제했습니다.

Visual Studio 2017을 기준으로 작성하였으며, 

문의는 댓글 또는 sain9212@gmail.com 으로 부탁드립니다.

[OpenGL] gluLookAt Lu's…〃 Programing。

일단, gluLookAt 원리에 대해 알아보자.

 

gluLookAt eye, center,up 3개의 3차원 좌표 값을 인자로 가진다( 9개의 인자)

 

여기서 eye, center 좌표 값이고 up vector값이다.

 

eye는 카메라 위치, center 바라보는 중심 방향이다.

up은 카메라의 up vector(normalize 필요) 나타낸다.

 

 카메라는 일반적인 게임에서 특정 물체(캐릭터, 사물, 또는 지점 자체) 기준으로 일정 거리만큼 떨어진 위치하므로 eye값은 center 중심으로 거리 d 3차원 상의 점이라고 생각하면 된다.


eye 값은 center 값에 따라 지속적으로 바뀌고, 회전할 때마다 좌표 값이 전부 바뀔 있다


따라서 여기서는 eye값은 기록하지 않고, 화면의 회전 (x, y 방향의 회전 ) 기록하고 계산을 것이다.



 

그러면 회전 개로 어떻게 3차원 위의 점을 구하는가


아래 그림은 왼손 좌표계이고, OpenGL, DirectX의 기본 좌표계이다.

 


먼저 y - xz 축으로 α만큼, x-z 축으로 β만큼 회전한 위에 점이 있다면


이런 그림이 건데, x-z축의 A 먼저 구해보자. 간단하다. 원점으로부터 β만큼 회전했으므로 A(d cosβ, 0, d sinβ) 된다.

 

그리고 선분 OB 값은 d cosα 이므로 B (d cosα cosβ, 0, d cosα sinβ) 된다.

 

P y값은 d sinα 이기 때문에 결론적으로 P (d cosα cosβ, d sinα, d cosα sinβ) 된다.

 

여기서 α : y 회전 , β : x 회전 값이다.


왠만하면 up vector 값을 바꿀 일은 없기 때문에 위치를 이동하고 싶으면 center 값을 변경하고, 화면을 회전하고 싶으면 α, β 값을 수정하면 될 것이다.




질문은 댓글로.




[C++] 흔히 변수로 쓰일만한 이름이지만 STL에서 사용중인 이름들 Lu's…〃 Programing。


 학교에서 흔히 'using namespace std; 를 사용하지 말라고 하는 이유로 '다른 이름과 겹칠 수 있어서'를 대는데, 과연 표준 함수들은 얼마나 겹치기 쉬운 이름들을 쓰는 것일까? 한 번 알아보자.

 우선, 기준을 정하자면
  1. 표준 함수(네임스페이스 내부) 또는 클래스일 것
  2. 사용자가 변수로 자주 쓰거나, 흔히 쓰이는 API에 동일한 이름의 함수가 있을 것

정도. 경험 상 이야기라 대체로 동일한 이름의 함수는 WinAPI이다(...)



  1. size

    size() 함수는 배열 또는 STL Container의 크기를 반환하는 표준 함수이다.

  2. next & prev

    둘 모두 인자로 반복자와 오프셋 값을 받으며,
    반복자를 오프셋만큼 떨어진(next는 뒤로, prev는 앞으로) 위치에 있는 반복자를 반환한다.
    범위 벗어나면 예외가 뜨기 때문에 신중한 사용이 필요하다.

  3.  count

    STL Container에서 인자로 준 값과 일치한 값이 몇 개 있는지 찾는 함수이다.
    그러니까 지역변수 이름에 count라고 쓰는것보다 cnt를 쓰자! (...)

  4. bind

    STL에서는 std::function의 매개인자를 붙이는 함수지만,
    이게 C socket에서 전역함수로 동일한 이름이 존재하고 심지어 중요한 함수이다.
    C++ 쓴답시고 using namespace std 쓰고 네트워크 프로그래밍 실습하면 재밌을 거다 (...)

  5. min & max

    WinAPI를 써봤으면 한 번쯤은 사용해봤을 대표적인 매크로들. 물론 C++ 표준함수로 구현되어 있다.
    문제는 WinAPI의 매크로는 식이기 때문에 사용 자체가 안된다는 치명적인 단점이 존재한다 (...)

  6. move

    잘 안 쓸 것 같은데 다른 사람의 코드를 봤을 때 생각보다 변수명으로 자주 써서 놀란 이름.
    C++11 이후의 이동연산자를 사용할 때 절대까지는 아니고 most have 정도 필요한 함수.

  7. left & right

    믿기지 않겠지만 표준 함수이다. 입출력(iostream)에 쓰인다.

  8. vector

    아직도 나는 표준 가변 길이 배열의 이름이 vector인지 알지 못한다.
    나는 그저 3차원 좌표를 표현하려고 했을 뿐이고... C++도 쓰고 싶었을 뿐이고...

  9. get

    은근히 쓰는 변수명. std::tuple에서 n 번째 인자를 받을 때 사용하는 표준 함수.



 더 많을 것 같은데 여기까지만. 


ps. 추가로 WinAPI 배울 때까지만 해도 좋은 선택이라며 칭찬했던 문자열 함수 매크로(~~A, ~~W)가 다른 라이브러리를 쓰면서 뒤통수를 크게 맞았다고 생각하게 된 예가 DrawText. 문자열 출력 함수로 많이 쓰는 이름인데 이게 WinAPI와 같이 쓰면 DrawTextW(또는 DrawTextA)가 되는 불상사가...




1 2 3 4 5 6 7 8 9 10 다음