Editing the Projection Matrix
This commit is contained in:
+34
-23
@@ -35,38 +35,49 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
return Msg.wParam;
|
return Msg.wParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HandleMouseMovement(LPARAM lParam) {
|
||||||
|
int xPos, yPos;
|
||||||
|
xPos = LOWORD(lParam);
|
||||||
|
yPos = HIWORD(lParam);
|
||||||
|
|
||||||
|
bool movement_detected_x = true;
|
||||||
|
bool movement_detected_y = true;
|
||||||
|
|
||||||
|
if (xPos > prev_mouse_x)
|
||||||
|
move_camera_right();
|
||||||
|
else if (xPos < prev_mouse_x)
|
||||||
|
move_camera_left();
|
||||||
|
else
|
||||||
|
movement_detected_x = false;
|
||||||
|
prev_mouse_x = xPos;
|
||||||
|
|
||||||
|
if (yPos > prev_mouse_y)
|
||||||
|
move_camera_up();
|
||||||
|
else if (yPos < prev_mouse_y)
|
||||||
|
move_camera_down();
|
||||||
|
else
|
||||||
|
movement_detected_y = false;
|
||||||
|
prev_mouse_y = yPos;
|
||||||
|
|
||||||
|
return movement_detected_x || movement_detected_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Update_Window() {
|
||||||
|
render();
|
||||||
|
Update();
|
||||||
|
}
|
||||||
|
|
||||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
switch (message)
|
switch (message)
|
||||||
{
|
{
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
int xPos, yPos;
|
if(HandleMouseMovement(lParam))
|
||||||
xPos = LOWORD(lParam);
|
Update_Window();
|
||||||
yPos = HIWORD(lParam);
|
|
||||||
|
|
||||||
if (xPos == prev_mouse_x)
|
|
||||||
break;
|
|
||||||
else if (xPos > prev_mouse_x)
|
|
||||||
move_camera_right();
|
|
||||||
else
|
|
||||||
move_camera_left();
|
|
||||||
prev_mouse_x = xPos;
|
|
||||||
|
|
||||||
if (yPos == prev_mouse_y)
|
|
||||||
break;
|
|
||||||
else if (yPos > prev_mouse_y)
|
|
||||||
move_camera_up();
|
|
||||||
else
|
|
||||||
move_camera_down();
|
|
||||||
prev_mouse_y = yPos;
|
|
||||||
|
|
||||||
render();
|
|
||||||
Update();
|
|
||||||
break;
|
break;
|
||||||
case WM_RBUTTONDOWN:
|
case WM_RBUTTONDOWN:
|
||||||
break;
|
break;
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
Update();
|
|
||||||
break;
|
break;
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
DestroyWindow(hwnd);
|
DestroyWindow(hwnd);
|
||||||
|
|||||||
+30
-9
@@ -11,9 +11,11 @@
|
|||||||
|
|
||||||
#define DEG2RAD M_PI/180
|
#define DEG2RAD M_PI/180
|
||||||
#define HORIZONTAL_CAMERA_SPEED 1
|
#define HORIZONTAL_CAMERA_SPEED 1
|
||||||
|
#define VERTICAL_CAMERA_SPEED 1
|
||||||
|
|
||||||
#define NEAR_CLIP_PLANE 0.1
|
#define NEAR_CLIP_PLANE 0
|
||||||
#define FAR_CLIP_PLANE 5
|
#define FAR_CLIP_PLANE 15
|
||||||
|
#define FOV 15
|
||||||
|
|
||||||
const TGAColor white = TGAColor(255, 255, 255, 255);
|
const TGAColor white = TGAColor(255, 255, 255, 255);
|
||||||
const TGAColor red = TGAColor(255, 0, 0, 255);
|
const TGAColor red = TGAColor(255, 0, 0, 255);
|
||||||
@@ -166,7 +168,7 @@ void triangle(
|
|||||||
for (int i = 0; i < 3; i++) P.z += pts[i][2] * bc_coord[i];
|
for (int i = 0; i < 3; i++) P.z += pts[i][2] * bc_coord[i];
|
||||||
|
|
||||||
// Coloring according to the Z-Buffer
|
// Coloring according to the Z-Buffer
|
||||||
if (P.z > z_buffer[(int)(P.x + P.y * screen_width)] && P.z > NEAR_CLIP_PLANE)
|
if (P.z > z_buffer[(int)(P.x + P.y * screen_width)] && P.z > 20 && P.z < 50)
|
||||||
{
|
{
|
||||||
z_buffer[(int)(P.x + P.y * screen_width)] = P.z;
|
z_buffer[(int)(P.x + P.y * screen_width)] = P.z;
|
||||||
|
|
||||||
@@ -182,6 +184,9 @@ void triangle(
|
|||||||
}
|
}
|
||||||
color = color * intensity;
|
color = color * intensity;
|
||||||
set_pixel(P.x, P.y, color_to_int(color));
|
set_pixel(P.x, P.y, color_to_int(color));
|
||||||
|
//char debugStr[200];
|
||||||
|
//sprintf_s(debugStr, "%f\n", P.z);
|
||||||
|
//OutputDebugString(debugStr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -221,11 +226,13 @@ void move_camera_left() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void move_camera_up() {
|
void move_camera_up() {
|
||||||
angle_ver += HORIZONTAL_CAMERA_SPEED;
|
angle_ver += VERTICAL_CAMERA_SPEED;
|
||||||
|
if (angle_ver > 90) angle_ver = 90;
|
||||||
}
|
}
|
||||||
|
|
||||||
void move_camera_down() {
|
void move_camera_down() {
|
||||||
angle_ver -= HORIZONTAL_CAMERA_SPEED;
|
angle_ver -= VERTICAL_CAMERA_SPEED;
|
||||||
|
if (angle_ver < -90) angle_ver = -90;
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix ViewPort = Matrix::identity();
|
Matrix ViewPort = Matrix::identity();
|
||||||
@@ -235,16 +242,29 @@ Matrix ModelView = Matrix::identity();
|
|||||||
void render()
|
void render()
|
||||||
{
|
{
|
||||||
|
|
||||||
Vec3f forward = Vec3f(sinf(angle_hor * DEG2RAD), -sinf(angle_ver * DEG2RAD), -cosf(angle_hor*DEG2RAD)*cosf(angle_ver*DEG2RAD));
|
Vec3f forward = Vec3f(
|
||||||
|
sinf(angle_hor * DEG2RAD),
|
||||||
|
-sinf(angle_ver * DEG2RAD),
|
||||||
|
-cosf(angle_hor*DEG2RAD) * cosf(angle_ver*DEG2RAD));
|
||||||
Vec3f right = Vec3f(sinf(angle_hor*DEG2RAD + M_PI_2), 0, 0);
|
Vec3f right = Vec3f(sinf(angle_hor*DEG2RAD + M_PI_2), 0, 0);
|
||||||
|
|
||||||
center = eye + forward;
|
center = eye + forward;
|
||||||
|
|
||||||
ViewPort = viewport(0, 0, screen_width, screen_height);
|
//ViewPort = viewport(0, 0, screen_width, screen_height);
|
||||||
|
ViewPort = viewport(screen_width / 8, screen_height / 8, screen_width * 3 / 4, screen_height * 3 / 4);
|
||||||
ModelView = lookat(eye, center, cross(right, forward));
|
ModelView = lookat(eye, center, cross(right, forward));
|
||||||
|
Projection[0][0] = 1 / tanf(FOV * DEG2RAD);
|
||||||
|
Projection[1][1] = 1 / tanf(FOV * DEG2RAD);
|
||||||
|
Projection[2][2] = (FAR_CLIP_PLANE + NEAR_CLIP_PLANE) / (FAR_CLIP_PLANE - NEAR_CLIP_PLANE);
|
||||||
|
Projection[2][3] = (-2 * FAR_CLIP_PLANE * NEAR_CLIP_PLANE) / (FAR_CLIP_PLANE - NEAR_CLIP_PLANE);
|
||||||
Projection[3][2] = -1.f / (forward).norm();
|
Projection[3][2] = -1.f / (forward).norm();
|
||||||
|
//Projection[3][2] = 1;
|
||||||
|
//Projection[3][3] = 0;
|
||||||
|
|
||||||
Matrix z = ViewPort * Projection * ModelView * model->Transform;// *Projection * ModelView;// * model->Transform;// *Projection * ModelView * model->Transform;
|
// model->rotate(Vec3f(0, 180, 0));
|
||||||
|
// model->ApplyTransform();
|
||||||
|
|
||||||
|
Matrix z = ViewPort * Projection * ModelView * model->Transform;
|
||||||
|
|
||||||
clear_zbuffer();
|
clear_zbuffer();
|
||||||
for (int i = 0; i < model->nfaces(); i++)
|
for (int i = 0; i < model->nfaces(); i++)
|
||||||
@@ -262,7 +282,8 @@ void render()
|
|||||||
Vec4f v4(v);
|
Vec4f v4(v);
|
||||||
Vec3f coord(z * v4);
|
Vec3f coord(z * v4);
|
||||||
|
|
||||||
if (coord.x > 0 && coord.x < screen_height)
|
if (coord.x > 0 && coord.x < screen_width
|
||||||
|
&& coord.y > 0 && coord.y < screen_height)
|
||||||
out = false;
|
out = false;
|
||||||
|
|
||||||
screen_coords[j] = coord;
|
screen_coords[j] = coord;
|
||||||
|
|||||||
Reference in New Issue
Block a user