Panda3D: 使用 LineSegs 绘制平面和长方体边框
本代码使用 Panda3D 绘制了一个平面和一个长方体边框,并展示了如何在代码中解决常见的错误:TypeError: unsupported operand type(s) for *: 'int' and 'panda3d.core.LVector3f'。
import math
from panda3d.core import Vec3, LineSegs, LVecBase3f, LPoint3f
from direct.showbase.ShowBase import ShowBase
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
# 已知平面的4个点
p1 = Vec3(0, 0, 0)
p2 = Vec3(1, 0, 0)
p3 = Vec3(1, 1, 0)
p4 = Vec3(0, 1, 0)
# 计算平面法向量
v1 = p2 - p1
v2 = p3 - p1
normal = v1.cross(v2).normalized()
print('平面法向量:', normal)
# 构造长方体顶点坐标
length = 1
width = 1
height = 2
forward = normal
up = Vec3(0, 0, 1)
right = forward.cross(up)
p1 = p1 - forward - right - up
p2 = p1 + length * right.xyz # 修改:使用 right.xyz 分量
p3 = p2 + width * forward.xyz # 修改:使用 forward.xyz 分量
p4 = p1 + width * forward
p5 = p1 + height * up
p6 = p2 + height * up
p7 = p3 + height * up
p8 = p4 + height * up
vertices = [p1, p2, p3, p4, p5, p6, p7, p8]
# 绘制平面
lines = LineSegs()
lines.setThickness(2)
lines.moveTo(p1)
lines.drawTo(p2)
lines.drawTo(p3)
lines.drawTo(p4)
lines.drawTo(p1)
node = lines.create()
nodePath = self.render.attachNewNode(node)
nodePath.setColor(LVecBase3f(1, 0, 0))
# 绘制长方体边框
lines = LineSegs()
lines.setThickness(2)
lines.moveTo(p1)
lines.drawTo(p2)
lines.drawTo(p3)
lines.drawTo(p4)
lines.drawTo(p1)
lines.moveTo(p5)
lines.drawTo(p6)
lines.drawTo(p7)
lines.drawTo(p8)
lines.drawTo(p5)
lines.moveTo(p1)
lines.drawTo(p5)
lines.moveTo(p2)
lines.drawTo(p6)
lines.moveTo(p3)
lines.drawTo(p7)
lines.moveTo(p4)
lines.drawTo(p8)
node = lines.create()
nodePath = self.render.attachNewNode(node)
nodePath.setColor(LVecBase3f(0, 1, 0))
if __name__ == '__main__':
app = MyApp()
app.run()
错误原因:
代码中原本的计算方式 p2 = p1 + length * right 和 p3 = p2 + width * forward 使用了整数 length 和 width 与 panda3d.core.LVector3f 类对象 right 和 forward 进行乘法运算,导致了 TypeError: unsupported operand type(s) for *: 'int' and 'panda3d.core.LVector3f' 错误。
解决方法:
通过使用 right.xyz 和 forward.xyz 访问向量的 x, y, z 分量,将它们转换为 LPoint3f 对象,从而可以与整数进行乘法运算。
修改后的代码:
p2 = p1 + length * right.xyz
p3 = p2 + width * forward.xyz
修改后的代码将使用向量的 xyz 分量进行计算,解决了错误。
注意:
xyz属性用于访问LVector3f对象的 x, y, z 分量,并将它们转换为LPoint3f对象,以便与整数进行乘法运算。- 此错误是由于 Panda3D 中向量类型与整数乘法运算的限制造成的。
- 修改后的代码将使用向量的 xyz 分量进行计算,从而避免了错误并实现了预期效果。
原文地址: https://www.cveoy.top/t/topic/oDZ6 著作权归作者所有。请勿转载和采集!