OBJ 加载器无法正确加载纹理坐标。怎么解决?

问题描述 投票:0回答:0

我编写了加载 Wavefront OBJ 文件的程序,并注意到纹理坐标未正确加载:

My result

Correct result

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()

我怀疑浮点数到整数的转换,不知道如何证明它。

如何修复这个错误?另外,我应该把所有代码都放在这个问题中吗?

python rendering .obj
© www.soinside.com 2019 - 2024. All rights reserved.