本代码使用 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 * rightp3 = p2 + width * forward 使用了整数 lengthwidthpanda3d.core.LVector3f 类对象 rightforward 进行乘法运算,导致了 TypeError: unsupported operand type(s) for *: 'int' and 'panda3d.core.LVector3f' 错误。

解决方法:

通过使用 right.xyzforward.xyz 访问向量的 x, y, z 分量,将它们转换为 LPoint3f 对象,从而可以与整数进行乘法运算。

修改后的代码:

p2 = p1 + length * right.xyz
p3 = p2 + width * forward.xyz

修改后的代码将使用向量的 xyz 分量进行计算,解决了错误。

注意:

  • xyz 属性用于访问 LVector3f 对象的 x, y, z 分量,并将它们转换为 LPoint3f 对象,以便与整数进行乘法运算。
  • 此错误是由于 Panda3D 中向量类型与整数乘法运算的限制造成的。
  • 修改后的代码将使用向量的 xyz 分量进行计算,从而避免了错误并实现了预期效果。
Panda3D: 使用 LineSegs 绘制平面和长方体边框

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

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