默认情况下,一个L贴图贴上正方形 前面和后面 左边和右边朝向都是反的,这个时候需要单独建模 导入了,这个可以用来做 双面棋盘。
import bpy
import bmesh
from mathutils import Vector
# 获取当前活动对象(立方体)
cube = bpy.context.active_object
bpy.context.view_layer.objects.active = cube
# 进入编辑模式
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(cube.data)
# 获取UV层
uv_layer = bm.loops.layers.uv.verify()
# 手动翻转指定面的UV
# 这里翻转:底面(Z-)、后面(Y-)、右面(X+)
flipped_count = 0
for face in bm.faces:
normal = face.normal
# 判断需要翻转的面
should_flip = False
face_name = ""
if normal.z < -0.9: # 底面 (Z轴负方向)
should_flip = True
face_name = "底面"
elif normal.y < -0.9: # 后面 (Y轴负方向)
should_flip = True
face_name = "后面"
elif normal.x > 0.9: # 右面 (X轴正方向)
should_flip = True
face_name = "右面"
# 如果需要翻转
if should_flip:
# 获取当前面的所有UV坐标
uvs = [loop[uv_layer].uv.copy() for loop in face.loops]
# 对每个UV进行水平翻转:u_new = 1 - u_old
for i, loop in enumerate(face.loops):
old_uv = uvs[i]
new_u = 1.0 - old_uv.x # 水平翻转
new_v = old_uv.y # V坐标保持不变
loop[uv_layer].uv = Vector((new_u, new_v))
flipped_count += 1
print(f"已翻转 {face_name}")
# 更新网格
bmesh.update_edit_mesh(cube.data)
# 返回对象模式
bpy.ops.object.mode_set(mode='OBJECT')
print(f"\n总共翻转了 {flipped_count} 个面的UV")
print("UV翻转完成!")