본문 바로가기

내적(dot product) 외적(cross product) 이용 내적 밝기 계산에서 대표적으로 사용되는데, 면에 수직인 벡터(흔히 노말벡터라 부르는)과 빛방향벡터의 사이각을 이용한 내적값으로 밝기를 구하게 됩니다. (단위 벡터를 사용하므로, 면에수직일때 원래밝기, 면에 가까워질수록 어두워집니다. ) 외적 주로 곡면 또는 평면의 한 점에 대해 서로 다른 두 접선 벡터가 주어질 때, 그 표면에 수직한 법선 벡터를 구하는데 사용한다. 두 3D 벡터 P와 Q의 외적은 PXQ로 표기하며, 교환 법칙이 성립하지 않으므로 A와 B의 순서에 주의해야 한다. 즉, PXQ = [Py*Qz - Pz*Qy, Pz*Qx - Px*Qz, Px*Qy - Py*Qx] 교환법칙은 PXQ = -QXP 임을 주의해야 한다. 표면의 법선 벡터 계산 삼각형의 면적 계산 더보기
방향넣으면 각도 출력하는 함수 float CalAngle(D3DXVECTOR3 vDrt) { D3DXVECTOR3 vP1, vP2; D3DXVECTOR3 vCrossResult; float fDotResult; vP1 = D3DXVECTOR3(-1, 0, 0); vDrt = -1.0f * vDrt; //노말라이즈 D3DXVec3Normalize(&vP2, &vDrt); // 외적구해서 내적 방향3을 정한다. D3DXVec3Cross(&vCrossResult, &vP1, &vP2); // 내적구해서 각도를 구한다 fDotResult = D3DXVec3Dot(&vP1, &vP2); if(vCrossResult.y > 0) return acosf(fDotResult); else if(vCrossResult.y < 0.0f) { return.. 더보기
GetMessage vs. PeekMessage 우리는 지금까지 WinMain의 메인 루프에서 GetMessage라는 함수를 통해 메시지를 받아 처리하였다. 그리고 스크린에 무언가를 그리기 위해서는 WM_PAINT라는 메시지가 들어올 때에만 처리하였다. 이것은 무엇을 의미하는가?! 맞다. WM_PAINT 메시지가 들어오지 않으면 화면에 그리는 작업을 하지 않는다는 것이다. 게임과 같은 프로그램을 생각해보자. 게임과 같은 프로그램에서는 쉴새없이 스크린에 무언가를 그리는 작업을 한다. 당연히 쉴새없이 그려야지만 케릭터의 이동이나 다른 모든 화면의 움직임이 끊기지 않고 부드럽게 이어질 수 있는 것이다. 만약, 이러한 프로그램에서 GetMessage를 통해 메시지를 처리한다면 어떻게 될까? 결과는 불 보듯 뻔하다. 우리는 마우스를 한 손에 부여 잡고 (지속적.. 더보기
SendMessage vs. PostMessage Postmessage 의 경우 윈도우의 메시지 큐에 메시지가 들어가게 되고, 윈도우 프로스저에게 이 메시지를 처리하도록한다. 메시지를 큐에 넣기만 하고 바로 리턴하므로 메시지를 붙인 후 즉시 다른 작업을 할 수 있게 되지만 큐에 대기하고 있는 다른 메시지가 있으면 뒤에 붙은 메시지는 곧바로 처리되지 않는 특징을 가지고 있다. 큐에 붙여진 메시지는 GetMessage 에 의해 읽혀지고, DispatchMessage 함수에 의해 윈도우 프로시저로 보내어져 처리가 된다. SendMessage 는 메시지를 큐에 넣는 것이 아니라 곧바로 윈도우 프로시저로 보내 즉각 처리하도록 하며 메시지가 완전히 처리되기 전에는 리턴하지 않고, 블록시켜서 대기 상태로 만든다. 말하자면, SendMessage는 메시지를 바로 처리.. 더보기
프레임 출력 GetTickCount() 이용 void Frame(void) { HDC hdc; static DWORD dwFTime; static DWORD dwNum; static DWORD dwFrame; char szBuf[128]; DWORD dwTime = GetTickCount(); if(dwFTime < dwTime) { dwFTime = dwTime + 1000; dwFrame = dwNum; dwNum = 0; } else { dwNum++; } hdc = GetDC(g_hWnd); wsprintf(szBuf, "%d", dwFrame); TextOut(g_Image[IMG_BACK].MemDC, 10, 10, szBuf, strlen(szBuf)); wsprintf(szBuf, "%d", nCnt).. 더보기