Blender Python 给出网格中顶点的错误坐标

问题描述 投票:0回答:1

我正在尝试制作一个 Blender Python 脚本来从游戏中导入专有但已记录的高度图格式(格式文档)。

游戏将其高度数据存储在块中,每个块是 256x256 个顶点。我最初遇到的问题是块的边缘相交处有明显的接缝。我后来发现你实际上需要一个 257x257 的顶点网格,并且网格的顶部和右侧边缘需要缝合到顶部和右侧边界块的相应边缘。

我在脚本中创建了一个部分,它迭代每个顶点并检查它是否与顶部或右侧块接壤,然后更改其 Z 位置以匹配边界块的顶点,使其显示为一个,同时保持块独立。这不是最有效的方法,因为我可以让它迭代边缘顶点而不是所有顶点,但它目前有效(大部分)。

我的主要问题是当它到达我的块的右上角顶点时,它恰好是

bm.verts
列表中的最后一个顶点。当我的脚本尝试从顶部或右侧块获取相应顶点的 Z 位置时,它错误地获取了
0.0
。这只会在所有与顶部和右侧块接壤的块中产生一个明显的洞,我无法弄清楚这是一个错误还是我的代码是错误的。我什至尝试手动更改代码中的顶点并打印从中获取值的顶点的 Z 位置,而且它总是
0.0

这是目前的脚本,有点混乱,但那是因为我尝试了很多方法来尝试解决问题:

for obj in objects:
    
    # Get Z-order location and bordering chunks
    z = int(obj.name[2:], base=16)
    top    = (((z & 0b10101010) - 1) & 0b10101010) | (z & 0b01010101)
    right  = (((z | 0b10101010) + 1) & 0b01010101) | (z & 0b10101010)
    top_tile_name = obj.name[:2] + hex(top).replace('x', '').zfill(8).upper()
    right_tile_name = obj.name[:2] + hex(right).replace('x', '').zfill(8).upper()
    
    mesh = bmesh.new()
    mesh.from_mesh(obj.data)
    mesh.verts.ensure_lookup_table()
    
    print('Top tile: ' + top_tile_name)
    print('Right tile: ' + right_tile_name)
    
    # Check if top bordering chunk exists
    if top_tile_name in [object.name for object in objects]:
        top_tile = bmesh.new()
        top_tile.from_mesh(bpy.data.objects[top_tile_name].data)
        top_tile.verts.ensure_lookup_table()
        
        # Stitch top edge vertices to bordering chunk vertex
        for vert in range(257 * 257):
            x = vert % 257
            y = vert // 257
            if y == 256:
                mesh.verts[vert].co.z = top_tile.verts[x].co.z
        mesh.verts.ensure_lookup_table()
    
    # Check if right bordering chunk exists
    if right_tile_name in [object.name for object in objects]:
        right_tile = bmesh.new()
        right_tile.from_mesh(bpy.data.objects[right_tile_name].data)
        right_tile.verts.ensure_lookup_table()
        
        # Stitch right edge vertices to bordering chunk vertex
        for vert in range(257 * 257):
            x = vert % 257
            y = vert // 257
            if x == 256:
                mesh.verts[vert].co.z = right_tile.verts[vert - 256].co.z
        mesh.verts.ensure_lookup_table()
    
    mesh.to_mesh(obj.data)
    obj.data.update()

非常感谢任何帮助

python scripting 3d iteration blender
1个回答
0
投票

我想我一半解决了问题,我只是改变了:

for obj in objects:

对此:

for obj in reversed(objects):

虽然它确实向后迭代,但它通过这样做以某种方式解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.