0

我用网格模型创建了一个简单的实体,我想在它上面添加纹理。

这是代码:

class Slide(Entity):
    def __init__(self, position = (0, 0, 0), rotation = (0, 0, 0)):
        super().__init__(
            model = Mesh(vertices = ((-0.5, -0.5, -0.5), (-0.5, -0.5, 0.5), (0.5, -0.5, 0.5), (0.5, -0.5, -0.5), (-0.5, 0.5, -0.5), (-0.5, 0.5, 0.5)), triangles = (0, 4, 3, 0, 5, 4, 0, 1, 5, 1, 2, 5, 0, 3, 1, 1, 3, 2, 4, 5, 2, 3, 4, 2)),
            color = color.gray,
            position = position,
            rotation = rotation,
            texture = 'white_cube'
        )

slide = Slide()

然后创建的对象将是这样的:

在此处输入图像描述

问题是:我曾尝试在其上添加一些默认纹理,但我收到的唯一结果是原始颜色较深。

我怎样才能解决这个问题?谢谢。

4

1 回答 1

1

您必须提供一个 uv 列表,在其中将每个顶点 (Vec3) 映射到纹理坐标 (Vec2)。设置纹理时只获得较暗版本的原因是它只使用纹理中的第一个像素,因为它不知道如何映射它。

例如,由两个三角形组成的四边形可以这样映射:

Mesh(
    vertices=((0.5, 0.5, 0), (-0.5, 0.5, 0), (-0.5, -0.5, 0), (0.5, -0.5, 0), (0.5, 0.5, 0), (-0.5, -0.5, 0)), 
    uvs=((1, 1), (0, 1), (0, 0), (1, 0), (1, 1), (0, 0))
)

通过代码创建复杂的 uv 贴图可能很困难,因此您应该为此使用 3d 建模程序。但是,如果它是从一侧进行的简单项目,则可以使用顶点坐标来生成 uv。就像是 ...

uvs = [(v[0], v[1]) for v in vertices]

...例如,如果您想从正面投影。

于 2022-01-16T13:33:55.540 回答