前提:
纹理在模型上贴好后,能使用blender python api直接获取的就是,这个模型的每个三角面片上顶点对应的纹理坐标。这其中每个三角面的顶点构成一个三角形(A),每个三角面的顶点对应的纹理坐标也构成一个三角形(B)。(注:实际上blender常用的是四边形,所以处理时要把四边形分成两个三角形)
计算步骤:
1、遍历每个像素(P)时,先判断这个像素属于一群B三角形中的哪个三角形。
2、然后结合这个像素坐标P以及三角形B算出这个像素对应的重心坐标。
3、然后在结合重心坐标与这个像素P算出这个点在三角形A中的位置。
上述算法的默认条件是:认定三角形A与三角形B一致。然后在利用重心坐标进行差值计算
代码:
因为我需要存储到sqlite3的数据库,所以会用到sqlite3
import bpy
import sqlite3
import bmesh
dbpath = '/Users/wxzjr/file/uv_xyz.db'
# 链接数据库的句柄
db = sqlite3.connect(dbpath)
# cursor对象
cur = db.cursor()
# 存储要写入数据库的数据
sql_value = []
# 获取当前激活的对象:
obj = bpy.data.objects["nan_right"]
obj.select_set(True)
bpy.context.view_layer.objects.active = obj
# 2. 获取对象的网格数据:
mesh = obj.data
# 3. 获取纹理图像数据,以及纹理图像的宽度和高度:
image = bpy.data.images["texture_20001.jpg"]
pixels = image.pixels
width, height = image.size
print(width,height)
uv_layers_data = obj.data.uv_layers.active.data
# 获取三角面数据
face_data = obj.data.polygons
# 获取模型的世界变换矩阵
world_mat = obj.matrix_world
# 清空表格
def clearData():
print('开始清空表')
sql = 'delete from pixelmap where 1 = 1'
try:
cur.execute(sql)
print('清空表成功')
except Exception as e:
print(e)
print('清空表失败')
def dissconnectDB():
# 关闭

文章描述了一个使用Blender的PythonAPI来处理3D模型的纹理坐标的过程,具体包括获取模型每个三角面的纹理坐标,遍历像素并判断其所属的纹理三角形,计算重心坐标,然后将这些信息存储到SQLite3数据库中。代码示例展示了如何操作数据库,创建表,以及处理四边形为两个三角形的情况。
最低0.47元/天 解锁文章
2089

被折叠的 条评论
为什么被折叠?



