Panda3D 模型分割:获取模型区块最小最大值
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 著作权归作者所有。请勿转载和采集!