R 600 600
NO textures/n.xpm
SO textures/s.xpm
WE textures/w.xpm
EA textures/e.xpm
S textures/barrel.xpm
F 000, 123, 222
C 000, 222, 123
11111111111
10200200001
10000000001
10000002001
10E00100001
10100002001
10200200001
10000000021
11111111111
--save
결과R 0 0
F textures/plains.xpm
C textures/cloudy.xpm
NO textures/weed_wall.xpm
EA textures/weed_wall.xpm
SO textures/weed_wall.xpm
WE textures/weed_wall.xpm
S textures/cherry_blossom.xpm
11111111111111111111111111111
10000000001100000000000000001
10110000011100000000000010001
10010000000000000000000010001
10110000011100000000000010001
10000000001100000111011110001
11110111111111011100000010001
11110111111111011101010010001
11000000110101011100000010001
10000000000000001100000010001
10000000000000001101010010001
11000000110101000000000000001
11110111110101000000000000001
10000000001100022222000000001
10222220000000022222000000001
1022222000100002222200N000001
10222220001101022222000000001
10000000000100020000000000001
11111111111111111111111111111
방향
을 구할 수 있다. - [a벡터 - b벡터] = b벡터가 a벡터를 바라보는 방향을 구할 수 있다. (시점이 일치하는 경우에만)스칼라
로 표현되며, 두 백터가 이루는 각(세타)를 구할 수 있다.벡터1 크기 * 벡터2 크기 * cos세타
값
에 해당하는 color로 벽을 세운다. (untextured)gcc *.c -framework OpenGL -framework Appkit
2
를 전달.17
을 전달.int (*funct)()
레이 캐스팅
을 구현하는 것이다. 우리가 해야할 일이다.레이캐스팅
이란 2차원 맵에서 3차원의 원근감을 만드는 렌더링 기술이다.값
으로 구분하면서 원근감을 표시해 준다.레이캐스팅이란 2차원 맵에서 3차원의 원근감을 만드는 렌더링 기술이다.
cameraX
변수가 사용되는데, 이는 -1 ~ 1
의 값을 가진다.카메라 평면 크기
만큼 일정한 간격으로 광선을 쏘게 된다.가로 or 세로로 한칸을 이동할 때 더 가까운 곳
으로 옮기면서 이동한다.가로로 한칸
을 움직이는 광선의 거리 == deltaDistX
이다.세로로 한칸
을 움직이는 광선의 거리 == deltaDistY
이다.최초 플레이어 위치에서 가로, 세로로 한칸을 움직인 거리
이다. sideDist + deltaDist
해준다.texture height
만큼 저장한다.(보통 textrue는 파일로 불러와서 사용한다.)int texture[8][texH * texW]
와같이 정의하여 인덱스로 텍스처를 구분하여 사용. 텍스처 크기의 모든 픽셀은 텍스처 높이와 너비만큼 이중 반복문을 통과하면서, 텍스처 번호마다 x, y값으로 만든 특정한 값을 갖게된다.
int[texH * texW]
에 저장되있다.wallX
이다. (아래코드 참조) // texturing calculations
int texNum = worldMap[mapX][mapY]- 1;
// calculate value of wallX
double wallX;
if (side == 0)
wallX = info->posY + perpWallDist * rayDirY;
else
wallX = info->posX + perpWallDist * rayDirX;
wallX -= floor((wallX));
// x coordinate on the texture
int texX = (int)(wallX * (double)texWidth);
if (side == 0 && rayDirX > 0)
texX = texWidth - texX - 1;
if (side == 1 && rayDirY < 0)
texX = texWidth - texX - 1;
// How much to increase the texture coordinate perscreen pixel
double step = 1.0 * texHeight / lineHeight;
// Starting texture coordinate
double texPos = (drawStart - height / 2 + lineHeight / 2) * step;
for (int y = drawStart; y < drawEnd; y++)
{
// Cast the texture coordinate to integer, and mask with (texHeight - 1) in case of overflow
int texY = (int)texPos & (texHeight - 1);
texPos += step;
int color = info->texture[texNum][texHeight * texY + texX];
// make color darker for y-sides: R, G and B byte each divided through two with a "shift" and an "and"
if (side == 1)
color = (color >> 1) & 8355711;
info->buf[y][x] = color;
}
NO
의 texture가 오른쪽을 보고 있을 때는 EA
의 texture가 보여야 한다. (NO, EA의 texture정보는 .cub파일에 전달 됨) void set_ray_direction(t_ray *ray)
{
int dir;
if (ray->side)
dir = (ray->dir.y < 0) ? (WEST) : (EAST);
else
dir = (ray->dir.x < 0) ? (NORTH) : (SOUTH);
ray->eye = dir;
return ;
}
W, S
키 입력은 현재 시선을 기준으로 앞뒤로 왔다갔다하도록 동작.A D
키 입력은 현제 시선에서 좌, 우로 왔다갔다해야 함..레이캐스팅이 진행 될 2차원 배열의 맵 정보와, 사용될 텍스쳐의 경로, 윈도우 사이즈 등의 정보를 저장한 파일이다.
.cub 파일을 해석하여 3D그래픽을 구현하는데 필요한 정보를 얻는다.
F와 C의 의미는??
int color;
if (worldMap[mapY][mapX] == 1)
color = 0xFF0000;
else if (worldMap[mapY][mapX] == 2)
color = 0x00FF00;
else if (worldMap[mapY][mapX] == 3)
color = 0x0000FF;
else if (worldMap[mapY][mapX] == 4)
color = 0xFFFFFF;
else
color = 0xFFFF00;
R 123,122,133
과 같이 주어진다.0 ~ 255
의 값을 가진다.<<
)을 사용하면 된다.int color
변수의 초기값을 0으로 만든 후0과 ' '
의 처리이다. 나는 아래 2가지를 가정하고 진행했다.--save
전달되면 스크린샷을 찍는다.bmp
확장자를 가진 파일을 생성한다.-1
이 될 수 있다. 그러면 mapX, mapY가 음수가 될 수있지도 않나....? 어떻게 무조건 안되지? //perform DDA
while (hit == 0)
{
//jump to next map square, OR in x-direction, OR in y-direction
if (sideDistX < sideDistY)
{
sideDistX += deltaDistX;
mapX += stepX;
side = 0;
}
else
{
sideDistY += deltaDistY;
mapY += stepY;
side = 1;
}
//Check if ray has hit a wall
if (worldMap[mapX][mapY] > 0) hit = 1;
}
2차원 배열 arr[a][b]일 때, 좌표계로 a는 y좌표를 b는 y좌표를 의미한다.
m1 맥북에서 컴파일할 때 gcc앞에 옵션 붙여주기
arch -x86_64 gcc -L../mlx -lmlx -framework OpenGL -framework AppKit main.c