使用【重心坐标】在模型上进行插值来获取纹理上每个像素对应的顶点坐标

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

前提:

纹理在模型上贴好后,能使用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():
    # 关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值