微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我是否正确地进行了 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 举报,一经查实,本站将立刻删除。