如何在Blender Python中为网格设置UV?

1 投票
1 回答
3317 浏览
提问于 2025-04-16 01:16

我正在使用Blender 2.49的Python接口创建一个网格。现在我有一个顶点列表和一个面索引列表。

比如说:

mesh = bpy.data.meshes.new('mesh')
mesh.verts.extend(mVerts)
mesh.faces.extend(mFaces)

我注意到MVert的uvco属性和MFace的uv属性,我给它们添加了一些随机值,但在渲染时我看不到任何变化。

关于uvco,文档提到:

注意:这些在UV编辑器中看不到,并且它们不是UV层的一部分。

我尝试在选择的新网格上进行操作:

import Blender
from Blender import *
import random

scn = Scene.GetCurrent()
ob = scn.objects.active
o = ob.getData()

for v in o.verts:
    v.uvco = (random.random(),random.random(),random.random())
    print v.uvco

for f in o.faces:
    r = (random.random(),random.random())
    for i in range(0,4):
        f.uv.append(r)
        print f.uv

我可以在终端看到值的变化,但在渲染时没有看到任何变化。如果我重新选择这个对象,之前的面UV就消失了。

有没有人能解释一下如何使用Blender 2.49的Python接口设置UV?

谢谢

1 个回答

2

试着把这一行替换成:

o = ob.getData()

换成:

o = ob.getData(mesh=True)

由于Blender Python API的发展历史,普通调用blender_object.getData会给你一个对象的网格数据的副本。虽然这个副本可以被修改,但它并不是“实时”的,也就是说你在界面上看到的对象并不会受到影响。(实际上,它甚至是一个“NMesh”——这个类和活的“Mesh”类是不同的。)

如果你在调用getData方法时加上可选参数“mesh=True”,那么你就能得到对象的实时网格,这样你所做的修改会生效(你可以通过调用Blender.Redraw()来强制更新,看到变化)。

不过我从来没有尝试过UV相关的东西,所以可能还有其他的因素,但我觉得这就是你遇到的问题所在。

撰写回答