목록분류 전체보기 (887)
치춘짱베리굿나이스
키 이벤트 시야 회전 (←, →) 플레이어의 시야를 좌우로 회전하기 위해선 시선 (dir벡터 : dirX, dirY) 과 카메라평면 (plane벡터: planeX, planeY) 이 같이 회전되어야 한다 시선 (dir) 회전하기 dirX = dirX * cos(theta) - dirY * sin(theta); dirY = dirX * sin(theta) + dirY * cos(theta);카메라평면 (plane) 회전하기 planeX = planeX * cos(theta) - planeY * sin(theta); planeY = planeX * sin(theta) + planeY * cos(theta);캐릭터 이동 (w, a, s, d) 카메라평면 (plane) 과 시선벡터 (dir) 는 방향벡터이며, ..
화면에 벽 그리기 이번 예제에서는 텍스쳐 대신 색상을 사용하여 벽을 그린다 벽의 높이 계산하기 카메라 평면부터 벽까지의 거리를 구했으니 이제 벽의 높이를 계산하고, 실제로 화면에 벽을 그릴 단계에 왔다 가중치 없는 기본값으론, 카메라 평면과 벽 사이 거리가 정확히 1일 때 벽의 높이가 height와 일치한다고 가정한다 화면상 표시되는 벽의 높이는 카메라 평면과 벽 사이의 거리 (perpWallDist) 에 비례한다 이때 취향에 따라 height를 보정하여 사용하여도 상관 없다 height의 가중치가 클 수록 벽의 높이가 높아진다 벽을 그리기 위한 벽의 시작점, 끝점 계산 startPoint = (height / 2) - (lineHeight / 2); if (startPoint < 0) startPoin..
광선 이동거리 계산 및 보정 어안렌즈 효과 방지하기 화면에 벽을 출력할 땐 카메라 평면 (plane ⇒ 선) 기준으로 출력됨에도 불구하고 플레이어 기준 (pos ⇒ 점) 으로 거리를 계산하기 때문에 카메라 평면으로부터 벽까지의 거리가 제각각이 된다 카메라 평면의 끄트머리에 가까울 수록 벽까지의 거리가 과도하게 길어져 실제 카메라 평면까지의 거리보다 훨씬 멀게 연산되며 이는 화면의 왜곡을 초래한다 어안렌즈 효과를 방지하기 위해 광선이 벽에 도달했다 하더라도 광선의 이동거리를 바로 구하지 않는다 어안렌즈 효과를 방지한다면 플레이어 시점 (점) 이 아니라 카메라 평면 (선) 까지의 거리를 계산하므로 광선이 정확히 어느 지점에 부딪혔는지도 구할 필요가 없다 perpWallDist 광선의 적중 지점과 카메라 평면..
반복문의 동작 주의할 점 Lodev는 y가 아래에서 위로 증가하는 좌표계를 사용하였는데, 레이캐스팅 구현 시에 이 부분을 신경쓰지 않으면 이동 방향이나 회전 방향이 반대가 된다 각 벡터의 용도를 확실히 알고 구현해야 플레이어의 현재 상태에서 어떤 방향 또는 값을 갖는지 명확하게 알고 디버깅할 수 있으므로 코드를 작성하기 전 각 변수의 의미를 확실히 알고 가는 것을 추천함 위의 이미지 또한 어떻게 구현하는가에 따라 틀릴 수 있다 1. stepX, stepY 설정 if (rayDirX < 0) stepX = -1; else stepX = 1; if (rayDirY < 0) stepY = -1; else stepY = 1; 현재 광선의 방향에 따라 stepX와 stepY를 설정한다 광선의 방향은 rayDirX..
변수 설명 posX, posY 플레이어의 좌표를 나타내는 벡터 원점 (0, 0) 을 시작점으로, 플레이어의 좌표를 끝점으로 하는 벡터이다 단도직입적으로 플레이어의 위치 좌표라고 생각하는게 편하다 dirX, dirY 플레이어의 시선을 나타내는 벡터 길이는 1로 고정된다 플레이어가 보고 있는 방향을 나타낸다 플레이어의 눈에서 레이저가 나온다고 가정할 때 해당 레이저의 이동 방향이라 생각하면 쉽다 planeX, planeY 카메라 평면을 나타내는 벡터 카메라 평면이라는 개념이 생소할 수 있는데, 이 벡터와 반대방향 벡터 (-plane) 를 합친 만큼에 비춰지는 게임 오브젝트들이 화면상에 그려진다고 생각하면 된다 쉽게 말해, 실제 플레이어가 컴퓨터로 보는 화면의 가로 길이와 1대1 대응된다 따라서 시야와는 무조..
Raycasting 기초 계산에 필요한 벡터들 현재 플레이어의 위치를 나타내는 위치벡터 pos 플레이어의 시점 방향을 나타내는 방향벡터 dir 카메라 평면을 나타내는 방향벡터 plane 해당 벡터들 계산법 pos는 (0, 0)을 기준으로 현재 플레이어의 위치 좌표를 나타낸다 dir은 방향벡터이며 단위벡터이므로, 길이는 1로 초기화된다 dir의 시작점은 어디이던지 상관없음 ⇒ (0, 0)으로 가정 plane은 dir과 항상 수직이며, 길이는 구현하고자 하는 시야각에 따라 다름 후술하겠지만 시야각은 dir과 plane의 길이 비율에 따라 결정되며, dir의 길이는 1로 고정시키고 plane의 길이를 조절하게 된다 광선의 방향 계산 광선은 pos의 끝점부터 시작하여 plane 벡터 위의 어느 한 점을 끝점으로..
My first RayCaster with miniLibX 와! 수학! 기하와벡터! 팀 ⌜ ⌟ (웃음) 단언컨대 최고의 팀원이었습니다 감사합니다 HE IS GOD. 제 블로그 오시는 분들 제 컵디 팀원분 진짜 레전드고수왕고수킹갓엠페러코드마스터십니다 클러스터에서 마주치시면 싸인 받아놓으세요 주의사항 주의사항단 4시간동안은 빡세게 하기 파트 나누지 않고 둘이 만나서 같이 붙어서 할것 하루에 4시간씩 투자할 것 사전에 공부해야 할 내용 Lodev Raycasting 정리 참고자료 Raycasting #define screenWidth 640 #define screenHeight 480 #define texWidth 64 #define texHeight 64 #define mapWidth 24 #define m..
undefined Boolean(undefined) //false Number(undefined) //NaN String(undefined) //"undefined" 선언은 되었지만 값이 할당되지 않은 상태 ⇒ 초기화하지 않은 변수 Boolean 문맥에선 false 반환 Number 문맥에선 NaN 반환 null Boolean(null) //false Number(null) //0 String(null) //"Number" 아무런 값도 나타나지 않음 값 자체가 없다는 뜻 (undefined) 이 아니라 값은 존재하지만 어떠한 유효한 값도 아니라는 뜻 Boolean 문맥에선 false 반환 Number 문맥에선 0 반환 NaN Boolean(NaN) //false Number(NaN) //NaN Strin..