Скрытые поверхности, zbuffer и создание поверхностного освещения - PullRequest
0 голосов
/ 11 июля 2020

Я создал этот псевдокод, чтобы изучать трехмерную компьютерную графику по книгам и кодам. Как удалить скрытые поверхности и создать поверхностное освещение? У меня есть вид модели, матрица перспективной проекции, матрица отсечения, но я ничего не могу найти об удалении поверхностей, 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

И еще вопрос. Это правильный порядок для создания трехмерного куба?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...