我是否正确地进行了 3D 剔除?

问题描述

我正在使用 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 (将#修改为@)