from direct.showbase.ShowBase import ShowBase from panda3d.core import LineSegs from panda3d.core import NodePath class MyApp(ShowBase): def init(self): ShowBase.init(self)

    # 导入模型
    model_path = '1.glb'
    model = self.loader.loadModel(model_path)
    #model.setScale(10,10, 10)
    model.setP(90)
    model.reparentTo(self.render)
    # 获取模型的最小值和最大值
    min_point, max_point = model.getTightBounds()
    min_x, min_y, min_z = min_point
    max_x, max_y, max_z = max_point
    
    # 计算模型的最高点
    height = max_z - min_z
    
    # 定义区块的长、宽和高
    block_length = 10
    block_width = 10
    
    # 计算区块的数量
    num_blocks_x = int((max_x - min_x) / block_length) + 1
    num_blocks_y = int((max_y - min_y) / block_width) + 1
    
    # 创建一个字典来保存每个区块的最小值和最大值
    block_data = {}
    
    # 遍历每个区块
    for i in range(num_blocks_x):
        for j in range(num_blocks_y):
            # 计算区块的最小值和最大值
            block_min_x = min_x + i * block_length
            block_min_y = min_y + j * block_width
            block_max_x = block_min_x + block_length
            block_max_y = block_min_y + block_width
            block_min_z = min_z
            block_max_z = min_z + height
            
            # 将最小值和最大值保存到字典中
            block_data[(i, j)] = {'最值':((block_min_x, block_min_y, block_min_z), (block_max_x, block_max_y, block_max_z)),'碰撞箱':[]}
    
    # 打印每个区块的最小值和最大值
    for block_num, block_values in block_data.items():
        print('Block {}: Min: {}, Max: {}'.format(block_num, block_values['最值'][0], block_values['最值'][1]))
        self.draw_cube(block_values['最值'][0], block_values['最值'][1])
    
    print(block_data)
def draw_cube(self,min_val, max_val):
    # 创建一个LineSegs对象
    lines = LineSegs()
    
    # 获取立方体的8个顶点
    vertices = [(min_val[0], min_val[1], min_val[2]), 
                (max_val[0], min_val[1], min_val[2]), 
                (min_val[0], max_val[1], min_val[2]), 
                (max_val[0], max_val[1], min_val[2]), 
                (min_val[0], min_val[1], max_val[2]), 
                (max_val[0], min_val[1], max_val[2]), 
                (min_val[0], max_val[1], max_val[2]), 
                (max_val[0], max_val[1], max_val[2])]
    
    # 绘制立方体的12条边
    lines.moveTo(vertices[0])
    lines.drawTo(vertices[1])
    lines.drawTo(vertices[3])
    lines.drawTo(vertices[2])
    lines.drawTo(vertices[0])
    
    lines.moveTo(vertices[4])
    lines.drawTo(vertices[5])
    lines.drawTo(vertices[7])
    lines.drawTo(vertices[6])
    lines.drawTo(vertices[4])
    
    lines.moveTo(vertices[0])
    lines.drawTo(vertices[4])
    
    lines.moveTo(vertices[1])
    lines.drawTo(vertices[5])
    
    lines.moveTo(vertices[2])
    lines.drawTo(vertices[6])
    
    lines.moveTo(vertices[3])
    lines.drawTo(vertices[7])
    
    # 创建一个NodePath对象来容纳线段
    node = NodePath(lines.create())
    
    # 将线段添加到场景图中
    node.reparentTo(render)

app = MyApp() app.run() 当模型较小仅为几个区块时,区块不能覆盖整个模型(会少一些区块)这是因为计算区块数量时使用的是整数除法,会向下取整。如果模型的大小不能被区块的大小整除,那么就会有一些区块无法覆盖到模型的边界部分。

为了解决这个问题,你可以使用浮点数除法来计算区块数量,并向上取整。修改以下代码:

num_blocks_x = int((max_x - min_x) / block_length) + 1 num_blocks_y = int((max_y - min_y) / block_width) + 1

这样就能确保区块的数量足够覆盖整个模型。

Panda3D 模型区块划分与可视化

原文地址: https://www.cveoy.top/t/topic/biAJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录