如何在Blender Python中为网格设置UV?
我正在使用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相关的东西,所以可能还有其他的因素,但我觉得这就是你遇到的问题所在。