You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Blender中用for循环写CSV多列仅记录首个顶点UV的问题排查

问题原因及修正方案

核心错误:文件打开位置错误

你把with open(...)放在了顶点循环for vert in bm.verts:内部,每次循环到新顶点时,用mode='w'打开文件会清空之前的所有内容。这意味着每处理一个顶点,之前写入的数据都会被覆盖,最终文件里只会保留最后一个顶点的UV数据(你说只看到第一个,可能是模型后续顶点没有关联的loop,或者循环提前中断了,但核心逻辑错误是文件操作嵌套层级不对)。

另外你的代码里不存在三层循环,只有两层:顶点循环 + 顶点关联的loop循环,问题出在文件操作的嵌套位置,而非循环层数。

修正后的代码

import csv
import os

import bmesh
import bpy

# ... 你的其他代码(比如获取bm、uv_lay的逻辑)

# 把文件打开移到顶点循环外面,只打开一次
with open(full_file_path, mode='w', newline='') as file:
    writer = csv.writer(file)
    # 可选:写入表头,方便识别列含义
    writer.writerow(["顶点索引", "U坐标", "V坐标"])
    # 遍历每个顶点
    for vert in bm.verts:
        # 遍历该顶点关联的所有loop(一个顶点可能在多个面中,对应多组UV)
        for loop in vert.link_loops:
            uv_coords = loop[uv_lay].uv
            vert_ind = vert.index
            u = uv_coords[0]
            v = uv_coords[1]
            # 写入单条数据,用writerow比writerows更适配单场景
            writer.writerow([vert_ind, u, v])

关键说明

  • 文件仅打开一次,避免了每次循环清空文件的问题,所有顶点的UV数据都会持续写入到同一个文件中。
  • writerow()替代writerows(),因为每次只生成一行数据,写法更直观简洁。

内容的提问来源于stack exchange,提问作者Troy Carpenter

火山引擎 最新活动