from direct.showbase.ShowBase import ShowBase
from panda3d.core import LineSegs
from panda3d.core import NodePath

def get_model_blocks(model_path):
    class MyApp(ShowBase):
        def __init__(self):
            ShowBase.__init__(self)

            # 导入模型
            model = self.loader.loadModel(model_path)
            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)),'碰撞箱':[]}

            return 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()

model_path = '1.glb'
blocks_data = get_model_blocks(model_path)
print(blocks_data)

你可以将模型路径作为参数传递给get_model_blocks函数,并将返回的区块数据存储在blocks_data变量中。然后,你可以打印或处理blocks_data变量中的数据。


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

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