问题描述
我正在使用 Python 和 pygame 创建一个业余 3D 引擎。但是由于某种原因,根据法线进行的剔除和着色会出现故障。
所以对于网格中的每个面,我得到三个向量。我从这些向量中创建了两个向量,方法是用一个向量减去两个向量。
在此之后我找到这两个向量的法线,然后 规范化。然后我找到法线的点积,如果 面部的法线小于 0,我将其添加到将要渲染的面部列表中。但是为什么这不起作用?
for face in faces:
# Pick three vectors from the face
v1 = face.vectors[0]
v2 = face.vectors[1]
v3 = face.vectors[2]
# Create two vectors with three vectors from the face
v1 = v2.substract( v1 )
v2 = v3.substract( v1 )
# Create a normal vector from the two vectors
Tx = ( v1.y * v2.z ) - ( v1.z * v2.y )
Ty = ( v1.x * v2.z ) - ( v1.z * v2.x )
Tz = ( v1.x * v2.y ) - ( v1.y * v2.x )
length = math.sqrt( Tx*Tx + Ty*Ty + Tz*Tz )
# normal vector x,y,z components
# vector length = 1
Nx = Tx / length
Ny = Ty / length
Nz = Tz / length
# normalize
length_of_normal = math.sqrt(Nx*Nx+Ny*Ny+Nz*Nz)
Nx /= length_of_normal
Ny /= length_of_normal
Nz /= length_of_normal
# Find dot product
dx = Nx * ( v1.x - self.camera_vector[0] )
dy = Ny * ( v1.y - self.camera_vector[1] )
dz = Nz * ( v1.z - self.camera_vector[2] )
# For culling
dot = dx + dy + dz
if dot < 0:
culled_faces.append( face )
# Shading with dot product
light_dir = ( 0,-1 )
dot_l = abs( Nx * light_dir[0] + Ny * light_dir[1] + Nz * light_dir[2] )
shade = 255 * dot_l
face.color = ( shade,shade,shade )
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)