Я создал этот псевдокод, чтобы изучать трехмерную компьютерную графику по книгам и кодам. Как удалить скрытые поверхности и создать поверхностное освещение? У меня есть вид модели, матрица перспективной проекции, матрица отсечения, но я ничего не могу найти об удалении поверхностей, zbuffer и освещении.
width = 800 //SCREENX
height = 600 //SCREENY
aspect = width /height
scale = tan(fov / 2 * PI / 180) * near
right = aspect * scale
left = -right
top = scale
bottom = -scale
//n = normalize(eye - at) (Z)
t[0] = eye[0] - at[0]
t[1] = eye[1] - at[1]
t[2] = eye[2] - at[2]
magnitude = sqrt( (t[0] * t[0]) + (t[1] * t[1]) + (t[2] * t[2]) )
n[0] = t[0] / magnitude
n[1] = t[1] / magnitude
n[2] = t[2] / magnitude
//u = normalize(up x n) (X)
t[0] = up[1] * n[2] - up[2] * n[1]
t[1] = up[2] * n[0] - up[0] * n[2]
t[2] = up[0] * n[1] - up[1] * n[0]
magnitude = sqrt( (t[0] * t[0]) + (t[1] * t[1]) + (t[2] * t[2]) )
u[0] = t[0] / magnitude
u[1] = t[1] / magnitude
u[2] = t[2] / magnitude
//v = n x u (Y)
v[0] = n[1] * u[2] - n[2] * u[1]
v[1] = n[2] * u[0] - n[0] * u[2]
v[2] = n[0] * u[1] - n[1] * u[0]
//Model View
M_view[0][0] = u[0]
M_view[0][1] = u[1]
M_view[0][2] = u[2]
M_view[0][3] = -(eye[0] * u[0] + eye[1] * u[1] + eye[2] * u[2])
M_view[1][0] = v[0]
M_view[1][1] = v[1]
M_view[1][2] = v[2]
M_view[1][3] = -(eye[0] * v[0] + eye[1] * v[1] + eye[2] * v[2])
M_view[2][0] = n[0]
M_view[2][1] = n[1]
M_view[2][2] = n[2]
M_view[2][3] = -(eye[0] * n[0] + eye[1] * n[1] + eye[2] * n[2])
M_view[3][0] = 0
M_view[3][1] = 0
M_view[3][2] = 0
M_view[3][3] = 1
//Perspective projection
M_projection[0][0] = (2 * near) / (right - left)
M_projection[0][1] = 0
M_projection[0][2] = (right + left) / (right - left)
M_projection[0][3] = 0
M_projection[1][0] = 0
M_projection[1][1] = (2 * near) / (top - bottom)
M_projection[1][2] = (top + bottom) / (top - bottom)
M_projection[1][3] = 0
M_projection[2][0] = 0
M_projection[2][1] = 0
M_projection[2][2] = -(far + near) / (far - near)
M_projection[2][3] = -2 * far * near / (far - near)
M_projection[3][0] = 0
M_projection[3][1] = 0
M_projection[3][2] = 1 //Opengl (-1)
M_projection[3][3] = 0
For i = 0 To 3
M_Clip[i][0] = M_projection[i][0] * M_view[0][0] + M_projection[i][1] * M_view[1][0] + M_projection[i][2] * M_view[2][0] + M_projection[i][3] * M_view[3][0]
M_Clip[i][1] = M_projection[i][0] * M_view[0][1] + M_projection[i][1] * M_view[1][1] + M_projection[i][2] * M_view[2][1] + M_projection[i][3] * M_view[3][1]
M_Clip[i][2] = M_projection[i][0] * M_view[0][2] + M_projection[i][1] * M_view[1][2] + M_projection[i][2] * M_view[2][2] + M_projection[i][3] * M_view[3][2]
M_Clip[i][3] = M_projection[i][0] * M_view[0][3] + M_projection[i][1] * M_view[1][3] + M_projection[i][2] * M_view[2][3] + M_projection[i][3] * M_view[3][3]
End
M_viewport[0][0] = width / 2
M_viewport[0][1] = 0
M_viewport[0][2] = 0
M_viewport[0][3] = width / 2 //xmin + width / 2
M_viewport[1][0] = 0
M_viewport[1][1] = height / 2 //* -1
M_viewport[1][2] = 0
M_viewport[1][3] = height / 2 //ymin + height / 2
M_viewport[2][0] = 0
M_viewport[2][1] = 0
M_viewport[2][2] = 1 //far - 0 //zmax - zmin 1
M_viewport[2][3] = 0 //zmin
M_viewport[3][0] = 0
M_viewport[3][1] = 0
M_viewport[3][2] = 0
M_viewport[3][3] = 1
obj_x[0] = -1
obj_y[0] = -1
obj_z[0] = -1
obj_x[1] = -1
obj_y[1] = 1
obj_z[1] = -1
obj_x[2] = 1
obj_y[2] = 1
obj_z[2] = -1
obj_x[3] = 1
obj_y[3] = -1
obj_z[3] = -1
obj_x[4] = -1
obj_y[4] = -1
obj_z[4] = 1
obj_x[5] = -1
obj_y[5] = 1
obj_z[5] = 1
obj_x[6] = 1
obj_y[6] = 1
obj_z[6] = 1
obj_x[7] = 1
obj_y[7] = -1
obj_z[7] = 1
triangles_p1[0] = 0
triangles_p2[0] = 3
triangles_p3[0] = 2
triangles_p1[1] = 0
triangles_p2[1] = 2
triangles_p3[1] = 1
triangles_p1[2] = 4
triangles_p2[2] = 0
triangles_p3[2] = 1
triangles_p1[3] = 4
triangles_p2[3] = 1
triangles_p3[3] = 5
triangles_p1[4] = 7
triangles_p2[4] = 4
triangles_p3[4] = 5
triangles_p1[5] = 7
triangles_p2[5] = 5
triangles_p3[5] = 6
triangles_p1[6] = 3
triangles_p2[6] = 7
triangles_p3[6] = 6
triangles_p1[7] = 3
triangles_p2[7] = 6
triangles_p3[7] = 2
triangles_p1[8] = 2
triangles_p2[8] = 6
triangles_p3[8] = 5
triangles_p1[9] = 2
triangles_p2[9] = 5
triangles_p3[9] = 1
triangles_p1[10] = 3
triangles_p2[10] = 0
triangles_p3[10] = 4
triangles_p1[11] = 3
triangles_p2[11] = 4
triangles_p3[11] = 7
For i = 0 To 7
V_Clip[0] = (M_Clip[0][0] * obj_x[i] + M_Clip[0][1] * obj_y[i] + M_Clip[0][2] * obj_z[i] + M_Clip[0][3])
V_Clip[1] = (M_Clip[1][0] * obj_x[i] + M_Clip[1][1] * obj_y[i] + M_Clip[1][2] * obj_z[i] + M_Clip[1][3])
V_Clip[2] = (M_Clip[2][0] * obj_x[i] + M_Clip[2][1] * obj_y[i] + M_Clip[2][2] * obj_z[i] + M_Clip[2][3])
V_Clip[3] = (M_Clip[3][0] * obj_x[i] + M_Clip[3][1] * obj_y[i] + M_Clip[3][2] * obj_z[i] + M_Clip[3][3])
V_NDC[0] = V_Clip[0] / V_Clip[3]
V_NDC[1] = V_Clip[1] / V_Clip[3]
V_NDC[2] = V_Clip[2] / V_Clip[3]
V_NDC[3] = 1
x[i] = (M_viewport[0][0] * V_NDC[0] + M_viewport[0][1] * V_NDC[1] + M_viewport[0][2] * V_NDC[2] + M_viewport[0][3])
y[i] = (M_viewport[1][0] * V_NDC[0] + M_viewport[1][1] * V_NDC[1] + M_viewport[1][2] * V_NDC[2] + M_viewport[1][3])
z[i] = (M_viewport[2][0] * V_NDC[0] + M_viewport[2][1] * V_NDC[1] + M_viewport[2][2] * V_NDC[2] + M_viewport[2][3])
z[i] = (M_viewport[3][0] * V_NDC[0] + M_viewport[3][1] * V_NDC[1] + M_viewport[3][2] * V_NDC[2] + M_viewport[3][3])
End
For i = 0 to 11
drawLine(x[ triangles_p1[i] ], y[ triangles_p1[i] ], x[ triangles_p2[i] ], y[ triangles_p2[i] ])
drawLine(x[ triangles_p2[i] ], y[ triangles_p2[i] ], x[ triangles_p3[i] ], y[ triangles_p3[i] ])
drawLine(x[ triangles_p3[i] ], y[ triangles_p3[i] ], x[ triangles_p1[i] ], y[ triangles_p1[i] ])
End
//For i = 0 to 11
//fillTriangle(x[ triangles_p1[i] ], y[ triangles_p1[i] ], x[ triangles_p2[i] ], y[ triangles_p2[i] ], x[ triangles_p3[i] ], y[ triangles_p3[i] ])
//End
И еще вопрос. Это правильный порядок для создания трехмерного куба?