3D游戏物理开发引擎Panda3D基础

article/2025/7/27 15:32:24

文章目录

    • Panda3D场景安排
    • 模型加载
    • 渲染属性
    • 任务
      • 任务链
      • 事件处理
      • 主循环
    • 视角
      • 相机
      • 阴影
        • 环境灯
        • 方向灯
    • 控制
        • key-events
    • DirectGui
    • 碰撞检测
    • 后续

Panda3D场景安排

​ Panda3D将其对象存储在场景图中,从本质上讲,这是一个对象的层次结构,称为节点。

​ 给定节点的状态(位置与旋转等状态)与其父级的状态是相对的,例如”0“的表示值表示与其父级位于同一位置。因此,每个节点都会影响其儿童节点及其子女,依次影响儿童节点。

​ 但通常情况下我们不直接操作节点,而是操作”NodePath“,"NodePath"包含对其节点的引用,描述了从根部到有关节点的通过场景图的路线。

模型加载

​ loader用于加载多种不同类型的对象,包括非动画模型。要加载文件,只需将以下代码添加到__init__中:


loader.loadModel("Models/Misc/environment")

Panda3D 允许不加入后缀名加载模型,加载模型后还需要将其连接到场景图中,通过使其称为NodePath中的一个节点来实现。

通过下列代码,可以将模型简单连接到场景图根部,NodePath由Panda3D自动提供,可在”render“中进行访问


self.environment.reparentTo(render)

在Panda3D中动画模型被称为”Actors“,不通过loader进行加载,而是直接通过实例化进行创建。构造中通过字典传递动画名称和动画文件。act_p3d_chan和a_p3d_chan_run同样为.egg文件。


from direct.actor.Actor import Actorself.tempActor = Actor("Models/PandaChan/act_p3d_chan", {"walk" : "Models/PandaChan/a_p3d_chan_run"})self.tempActor.reparentTo(render)

渲染属性

​ 总的来说,对象的所有属性都可以算是对象的渲染状态。

属性的分配


nodePath.node().setAttrib(attributeObject)

任务

Tasks:应用程序执行时每个帧调用一次的特殊功能。

| 变量 | 目的 |

| ------------ | ---------------------------------------- |

| Task.done | 指定任务已完成并将其从任务管理器中删除。 |

| Task.cont | 下一帧再次执行任务。 |

| Task.again | 再次执行任务,使用与最初指定相同的延迟。 |

**TaskMgr:**Panda3D中所有任务都通过该对象进行处理

添加任务taskMgr.add(exampleTask, 'MyTaskName')

若要指定参数,可以:taskMgr.add(exampleTask, 'MyTaskName', extraArgs=[a,b,c], appendTask=True)

删除任务taskMgr.remove('MyTaskName')

任务链

创建


taskMgr.setupTaskChain('chain_name', numThreads = None, tickClock = None,threadPriority = None, frameBudget = None,frameSync = None, timeslicePriority = None)

任务链由其唯一名称识别。重复呼叫设置具有相同任务链名称的TaskChain()将重新配置同一任务链。

numThreads:指定为此任务链提供服务的线程数。默认值为零,这意味着任务链将由主线程处理。如果将此设置为 1,则将生成一个线程,以正常顺序一次处理链中的所有任务。如果将此设置为高于 1 的某个数字,则将生成多个线程来处理链上的任务。在这种情况下,有些任务可能同时运行,任务排序难以保证。

threadPriority:可选择TP_low,TP_normal,TP_high,TP_urgent。指定了分配给此任务链上的线程的优先级。

frameBudget:允许此任务链每帧运行的最大时间(秒内),设置为 -1 表示无限制(默认值)。

frameSync:设置为True则使任务链与时钟同步。

timeslicePriority:时间优先性,将其设置为True更改优先级的含义,以便某些任务的运行频率降低,与其使用的时间与其优先值成正比。

事件处理

接收事件


from direct.showbase import DirectObjectclass myDirectObject(DirectObject.DirectObject):#无限接收myDirectObject.accept('Event Name', myDirectObjectMethod)#接收一次myDirectObject.acceptOnce('Event Name', myDirectObjectMethod)

忽略事件


#忽略某个事件myDirectObject.ignore('Event Name')#忽略所有事件myDirectObject.ignoreAll()

发送事件


messenger.send('Event Name')

主循环

​ Panda3D中的主循环通常由run()实现

视角

相机

​ 在Panda3D中,我们所看到的界面视角是以一个"camera"的模块决定的,Panda3D提供了对相机的访问和设置权限,包括一个引用节点路径的变量,即为"camera"。

示例


self.camera.setPos(0, 0, 32)self.camera.setP(-90)

阴影

​ 在Panda3D中,光也是一种节点,其包括多种类型:方向灯、环境灯……

环境灯

​ 环境灯用恒定的光线填充场景,有助于确保未照明区域不会完全变黑、

示例


from panda3d.core import AmbientLightfrom panda3d.core import Vec4ambientLight = AmbientLight("ambient light")ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1))# 连接到场景中self.ambientLightNodePath = render.attachNewNode(ambientLight)# 设置光的影响节点render.setLight(self.ambientLightNodePath)

方向灯

示例


from panda3d.core import DirectionalLightmainLight = DirectionalLight("main light")self.mainLightNodePath = render.attachNewNode(mainLight)self.mainLightNodePath.setHpr(45, -45, 0)render.setLight(self.mainLightNodePath)

控制

key-events

​ Panda3D中处理关键事件


# 存储关键信息self.keyMap = {"up" : False,"down" : False,"left" : False,"right" : False,"shoot" : False}def updateKeyMap(self, controlName, controlState):self.keyMap[controlName] = controlStateself.accept("w", self.updateKeyMap, ["up", True])

DirectGui

​ DirectGui 系统用于在程序中创建按钮、标签、文本条目和帧。所有这些项目都可以用文本、图像和 3D 图形进行装饰。

​ Panda3D的坐标系中,x轴指示左右方向,y轴指示屏幕内外方向,z轴指示上下方向。

碰撞检测

​ Panda3D中提供了处理物理碰撞的两个系统:内置碰撞系统和Bullet物理系统

内置碰撞系统有三个主要元素:Traversers, Handlers, and Solids.

Traversers:用于检测各种物理物体的碰撞

Handlers:处理程序当物体碰撞时会发生的事件

Solids:实际的碰撞物体本身

通常我们只能使用一个traverser, 并让它检查每次更新的碰撞情况,ShowBase 类提供了一个名为"cTrav"的默认变量:如果您为此变量分配了一个新的traverser,Panda 将自动为您更新它。

示例


from panda3d.core import CollisionTraverserself.cTrav = CollisionTraverser()

Handlers的使用

CollisionHandlerQueue:将碰撞事件存储在队列中,并允许您根据需要访问它们。您还可以对队列进行排序,以便轻松获得第一次碰撞。

CollisionHandlerEvent:每当指定的碰撞发生时,就会引发调用事件

CollisionHandlerPusher:防止指定的固体物体与其他固体物体相交

示例


from panda3d.core import CollisionHandlerPusherfrom panda3d.core import CollisionSphere, CollisionNodeself.pusher = CollisionHandlerPusher()colliderNode = CollisionNode("player")colliderNode.addSolid(CollisionSphere(0, 0, 0, 0.3))collider = self.tempActor.attachNewNode(colliderNode)# 显示碰撞物体collider.show()# 添加为活跃对象base.pusher.addCollider(collider, self.tempActor)base.cTrav.addCollider(collider, self.pusher)

Panda3D 的内置系统不会检查每个对象与所有其他对象,只有程序指定的对象才会进行碰撞检测,其他的对象视为非活跃对象。只有活跃对象能够与其他物体碰撞,非活跃对象仅能被碰撞。

在碰撞中我们还可以指定碰撞响应的维度,否则默认为三维的碰撞响应。


#指定碰撞响应维度为水平self.pusher.setHorizontal(True)

Panda3D就是通过这样的机制创建具有障碍性质的对象。

后续

 喜欢的话可以关注一下我的公众号技术开发小圈,尤其是对深度学习以及计算机视觉有兴趣的朋友,我会把相关的源码以及更多资料发在上面,希望可以帮助到新入门的大家!
在这里插入图片描述


http://chatgpt.dhexx.cn/article/AF9icJ4F.shtml

相关文章

Mac 终端快捷键设置:如何给 Mac 中的 Terminal 设置 Ctrl+Alt+T 快捷键快速启动

Mac 电脑中正常是没有直接打开终端命令行的快捷键指令的,但可以通过 commandspace 打开聚焦搜索,然后输入 ter 或者 terminal 全拼打开。但习惯了 linux 的同学会觉得这个操作很别扭。于是我们希望能通过键盘按键直接打开。 操作流程如下: 1…

OpenCV论道:为什么我的伽马校正函数只有一行?

最近在用 OpenCV 识别棋盘棋子,基本的思路是这样的:先转灰度,再做高斯模糊和二值化,此时棋盘格上有的有棋子,有的无棋子;通过迭代腐蚀,消去棋子,再迭代膨胀回来,就得到了…

【TA100】图形 2.6伽马(Gamma)校正

很好的视频 https://www.bilibili.com/video/BV15t411Y7cf/?spm_id_from333.788.b_636f6d6d656e74.96&vd_source6f3a5e0ac931d869aee3d7c9bb6847e0 一、Gamma校正 1.前言:颜色空间 ● 一些颜色空间的举例,(具体参考2.1节内容&#xff0…

Gamma Correction(伽马校正)

定义 Gamma correction, gamma nonlinearity, gamma encoding, or often simply gamma, is the name of a nonlinear operation used to code and decode luminance or tristimulus values in video or still image systems.[1] Gamma correction is, in the simplest cases, …

从0开始的技术美术之路(十)伽马校正

本篇参考B站视频 “技术美术百人计划”霜狼_may ; 《Shader入门精要》冯乐乐女神著; https://www.zhihu.com/question/27467127/answer/111973548 https://www.jianshu.com/p/9a91e6ad0d38 本篇主要用于自我复习,如有疑问或发现有什么错误&am…

2.6 伽马校正 一、Gamma校正

一、Gamma校正 颜色空间 通用:sRGB 电影:DCI-P3 电视:Rec-709、PAL等 印刷:CMYK、Adobe RGB 传递函数 我们知道了颜色的颜色值,要在电子设备上显示,就要把它转换为视频信号,传递函数就是用…

【剑桥摄影协会】伽马校正(Gamma)

伽马是数字成像系统的一个重要特征,它定义了像素值与其实际亮度之间的关系。在标准显示器上面,如果没有伽马,数码相机拍摄到的阴影内容便会跟我们实际看到的有所差异。平时我们所说的伽马校正、伽马编码、伽马压缩,都是伽马曲线的…

自动伽马校正(Auto Gamma Correction)算法

自动伽马校正(Auto Gamma Correction)算法 微信公众号:幼儿园的学霸 目录 文章目录 自动伽马校正(Auto Gamma Correction)算法目录理论代码实现参考资料 理论 在对图像进行处理过程中,查找到一篇对图像进行自动gamma校正的论文,论文名称及链…

图像基础--图像预处理技术(色彩插值、色彩校正、伽马校正、图像增强和白平衡)

1、简介 图像采集的功能由图像传感器实现, 目前图像传感器主要有电荷耦合器件CCD和CMOS传感器,CCD传感器具有高解析度、低噪声、动态范围大等优点;CMOS具备低成本、高的集成度、低功耗等有点。但不论是CCD还是CMOS传感器在将实际景物转换为图…

【Unity3D】伽马校正

1 伽马相关概念 1.1 人眼对亮度变化的感知 人眼对亮度变化的感知不是线性的,如下图,人眼对亮区的亮度变化不太敏感,对暗区的亮度变化较敏感。另外,我们可以想象一下,在一个黑暗的房间里,由 1 根蜡烛到 2 根…

伽马校正(gamma correction)学习笔记

学习HDR和Bloom特效的过程中,接触到了伽马矫正的问题。查阅了不少资料,这一篇讲的最清楚,下面的图片也是来自该文章。 这应该说是一个历史遗留问题,以前的CRT显示器是使用电子显像管,通过控制电流大小来控制显示屏幕上…

sRGB标准与伽马校正 理解

srgb : 颜色值会以非线性的方式存储 如一个颜色值在线性空间中,rgb(1,1,1), 在gamma空间中,rgb会变为(1的2.2幂次,1的2.2幂次,1的2.2幂次),颜色值会发生改变,这样方便在显示器中显示的时候&am…

伽马校正和颜色空间

一、伽马校正 所谓gamma校正,实际上是一个颜色的非线性变换。下面来解释这个变换曲线存在的原因。 1.1 人眼的非线性视觉效应 为什么要有gamma校正了。一言以蔽之,人眼的生理效应。如下图所示, 第一行是人眼感受到的线性亮度变化&#xf…

伽马校正探究

关于伽马校正的前因后果,在网上有不同版本的说法,由于年代久远的因素,导致原本很简单的事情越说越复杂。今天我们的目标就是抓住伽马的头,而不是摸一下伽马的尾巴。 一,鱼龙混杂的论调 1,CRT 显示器的物理…

图像的伽马校正

图像的伽马校正 图像的伽马校正属于图像增强中幂次增强&#xff0c; γ>1时&#xff0c;使图像变暗&#xff0c;即图像变黑&#xff1b; γ<1时&#xff0c;使图像变亮&#xff0c;即图像变白。 下面是伽马校正的过程&#xff1a; 1&#xff09;将像素值为【0,255】如2…

伽马校正笔记(Gamma Correction)

在数字图像系统中&#xff0c;伽马&#xff08;Gamma&#xff09;是一个重要的但很少被正确理解的特性。它定义了一个像素的数值和对应的实际亮度之间的关系。 人眼感知的亮度和相机“看到”的亮度区别 对于数码相机来说&#xff0c;当检测的光子数增加一倍时&#xff0c;sens…

伽马校正-

伽马校正 问题描述&#xff1a;读取图像&#xff0c;然后对图像进行伽玛校正。 伽马校正 这里是一篇写伽马校正比较好的文章&#xff0c;我觉得可以作为背景知识补充。 伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正。如果图像原样显示在显示器等上&…

图形 2.6 伽马校正

一、Gamma校正 1、颜色空间 图中可以看到&#xff0c;sRGB和Rec.709的色域虚线一样&#xff0c;三原色的位置是相同的&#xff0c;那么它们之间的区别就是&#xff1a;传递函数不同 2.传递函数 定义 知道了颜色的颜色值之后&#xff0c;想要在电子设备上显示&#xff0c;就…

伽马校正(Gamma Correction)与sRGB

文章目录 CRT显示器与人眼视觉非线性显示与渲染伽马校正sRGB 纹理正确的点光衰减补充参考资料 CRT显示器与人眼视觉 过去, 大多数监视器是阴极射线管显示器(CRT). 这些监视器有一个物理特性就是两倍的输入电压产生的不是两倍的亮度. 输入电压产生约为输入电压的 2.2 次幂的亮度…

图形学基础——伽马校正

百人计划学习视频连接&#xff1a;【技术美术百人计划】图形 2.6 伽马校正 颜色空间 具体内容在之前的文章有讲&#xff1a;色彩空间介绍 sRGB&#xff1a;微软在1996年发布的通用颜色标准DCI-P3&#xff1a;数字电影播放的颜色标准Rec-709、PAL&#xff1a;电视行业的颜色标…