blender中获取虚拟相机渲染图片上每像素对应的纹理上的像素值

Blender中获取渲染图像素对应纹理像素值

示例图:

相机渲染出图后,图片上每个像素点中对应的纹理的像素值。获取这个对应关系存到数据库

基本思路是

从相机圆心发射射线接触到物体时获取接触点(三维坐标)所在三角面,通过这个三角面的三个顶点坐标及其三个纹理坐标,通过重心坐标求出接触点所对应的纹理坐标。在发射射线时,通过相机分辨率中某一点的二维坐标(即渲染出图后图片上的坐标)转三维坐标,结合相机圆心确认射线方向。至此【图片上每个像素点中对应的纹理的像素值】对应关系所需要的数据已具备,

示例代码

如上图,相机视野中存在一个半球模型(已贴图),一个模型船

import bpy
import mathutils
import sqlite3
import time
import numpy as np
from PIL import Image

# 虚拟相机名称的变量,用与获取自定义命名方式的物体。
name = 'bow'
# 导出数据库位置
dbpath = 'D:/syncdisk/blender_export/' + name + '.db'
# 渲染出图的位置
export_image_path = 'D:/syncdisk/blender_export/' + name + '.png'
# 获取当前场景中的相机对象
camera = bpy.data.objects[name + ".001"]
# 获取对象的网格数据
back_mesh = bpy.data.objects["球体.001"]
ship = bpy.data.objects["Box5885.001"]
line = bpy.data.objects["Box5885.003"]

# 链接数据库的句柄
db = sqlite3.connect(dbpath)
# cursor对象
db_cur = db.cursor()

# 获取当前渲染设置
render_settings = bpy.context.scene.render
# 获取渲染图的尺寸
render_width = render_settings.resolution_x
render_height = render_settings.resolution_y
# 获取所有材质,用于获取材质颜色
materials = bpy.data.materials

mesh = back_mesh.data
# 获取模型的世界变换矩阵
world_mat = back_mesh.matrix_world
# 获取uv层,用于遍历获取uv数据
uv_layers_data = back_mesh.data.uv_layers.active.data
# 存储要写入数据库的数据
sql_value = []


# 清空表格
def clearTable(tableName, cur):
    print('开始清空表'+tableName)
    sql = 'delete from ' + tableName + ' where 1 = 1'
    try:
        cur.execute(sql)
        print('清空表' + tableName + '成功')
    except Exception as e:
        print(e)
        print('清空表' + tableName + '失败')


def dissconnectDB(cur):
    # 关闭游标
    cur.close()
    # 关闭连接
    db.close()
    print('断开数据库链接')


# 执行sql创建表
def createTable(cur):
    print('开始创建表:pixelmap')
    # 执行sql创建表
    sql = 'create table pixelmap(id integer primary key,canvas integer not null,row0 float not null,col0 float not null,source  integer not null,row1 float not null,col1 float not null,wt float not null)'
    try:
        cur.execute(sql)
        print('创建表:pixelmap成功')
    except Exception as e:
        print(e)
        print('创建表:pixelmap失败')
    print('开始创建表:keyvalue')
    sql = 'create table keyvalue(id integer primary key,key string,value string)'
    try:
        cur.execute(sql)
        print('创建表:keyvalue成功')
    except Exception as e:
        print(e)
        print('创建表:keyvalue失败')
Blender 中调整渲染图片的亮度,尤其是当图片显得太暗时,可以通过多种方式进行优化。以下是一些常见的方法来提升光照亮度并改善整体渲染效果: ### 调整光源强度 可以通过增加光源的功率或亮度值来提高场景的整体光照水平。在 **Blender** 中,光源的亮度可以在光源属性面板中进行调整。对于 **点光源、面光源、太阳光** 等,可以直接修改其 **"强度"(Strength)** 参数,通常以瓦特(W)或无单位数值表示,具体取决于渲染器设置 [^3]。 ```python # 示例:通过脚本调整光源强度(假设光源名称为 'Light') import bpy light = bpy.data.objects['Light'].data light.energy = 1000 # 增加光源能量值 ``` ### 使用 HDR 环境贴图 如果场景使用的是 **CYCLES** 或 **EEVEE** 渲染器,可以为世界环境添加一个 **HDR 图像** 作为背景和光源。HDR 图像不仅提供逼真的背景,还能作为光源增强场景的亮度。在 **“世界属性”(World Properties)** 面板中,选择 **“环境纹理”(Environment Texture)** 并加载 HDR 文件 [^2]。 ### 调整渲染器设置 在 **EEVEE** 中,由于其不支持完整的光线追踪,可能需要手动添加额外的光源或使用 **“环境光遮蔽”(Ambient Occlusion)** 来提升阴影区域的亮度。而在 **CYCLES** 中,可以通过增加 **“采样数”(Samples)** 来减少噪点,并在后期处理中调整曝光 [^3]。 ```python # 示例:通过脚本调整渲染采样数(适用于 CYCLES) bpy.context.scene.cycles.samples = 128 # 提高采样数以减少噪点 ``` ### 使用后期处理调整亮度 在 **“合成器”(Compositor)** 中,可以通过 **“亮度/对比度”(Bright/Contrast)** 节点对渲染完成的图像进行后期调整。启用 **“渲染层”(Render Layer)** 和 **“合成”(Composite)** 节点后,添加 **“亮度/对比度”** 节点并调整其参数,可以快速提升图像整体亮度 [^3]。 ### 调整材质反射与漫反射 某些材质可能会吸收过多光线,导致场景显得较暗。检查材质的 **“基础颜色”(Base Color)** 和 **“粗糙度”(Roughness)** 属性,适当减少粗糙度值可以让材质表面更光滑、反射更强,从而提升整体亮度 [^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值