我编写了加载 Wavefront OBJ 文件的程序,并注意到纹理坐标未正确加载:
OBJ解析器/加载器代码:
from object3d import *
from vector import *
from random import randint
def parse(path):
obj = Object3d()
obj.vertices = []
obj.normals = []
obj.texture_coords = []
obj.faces = []
file = open(path, "r")
source = file.read()
file.close()
source = source.split("\n")
for line in source:
split = line.split(" ")
match split[0]:
case "v":
v = Vertex()
v.pos = Vec3(float(split[1]), float(split[2]), float(split[3]))
obj.vertices.append(v)
case "vn":
vn = Vec3(float(split[1]), float(split[2]), float(split[3]))
obj.normals.append(vn)
case "vt":
vt = Vec2(float(split[1]), 1 - float(split[2]))
obj.texture_coords.append(vt)
case "f":
face = Face()
face_params = [i.split("/") for i in split]
face.v1 = obj.vertices[int(face_params[1][0]) - 1]
face.v2 = obj.vertices[int(face_params[2][0]) - 1]
face.v3 = obj.vertices[int(face_params[3][0]) - 1]
face.v1.texture_coord = obj.texture_coords[int(face_params[1][1]) - 1]
face.v2.texture_coord = obj.texture_coords[int(face_params[2][1]) - 1]
face.v3.texture_coord = obj.texture_coords[int(face_params[3][1]) - 1]
face.v1.normal = obj.normals[int(face_params[1][2]) - 1]
face.v2.normal = obj.normals[int(face_params[2][2]) - 1]
face.v3.normal = obj.normals[int(face_params[3][2]) - 1]
face.color = Vec3(randint(60, 255), randint(60, 255), randint(60, 255))
obj.faces.append(face)
return obj
UV贴图查看器代码:
import pygame as pg
import parser, math
from vector import *
from random import randint
HEIGHT = 512
WIDTH = 512
pg.init()
sc = pg.display.set_mode((WIDTH, HEIGHT))
clock = pg.time.Clock()
running = True
object = parser.parse("House.obj")
texture = pg.image.load("House3.png")
texture = pg.transform.scale(texture, (512, 512))
sc.blit(texture, (0, 0))
for face in object.faces[:i]:
p1 = face.v1.texture_coord.mul(512).int().to_pg()
p2 = face.v2.texture_coord.mul(512).int().to_pg()
p3 = face.v3.texture_coord.mul(512).int().to_pg()
pg.draw.polygon(sc, pg.Color("darkgray"), (p1, p2, p3), 1)
pg.draw.circle(sc, pg.Color("black"), p1, 3)
pg.draw.circle(sc, pg.Color("black"), p2, 3)
pg.draw.circle(sc, pg.Color("black"), p3, 3)
pg.display.flip()
while running:
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
clock.tick()
我怀疑浮点数到整数的转换,不知道如何证明它。
如何修复这个错误?另外,我应该把所有代码都放在这个问题中吗?