Panda3D 模型区块划分与可视化
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
这样就能确保区块的数量足够覆盖整个模型。
原文地址: https://www.cveoy.top/t/topic/biAJ 著作权归作者所有。请勿转载和采集!