python使用panda3d制作飞行模拟器

article/2025/7/27 8:35:47

00:目录

  • 01:介绍
  • 02:资源
    • 02.01:准备
    • 02.02:参考
  • 03:上代码
  • 04:效果
  • 05:尾声
    • 05.01:对于网友
    • 05.02:对于列位转发爱好者
    • 05.03:最后

01:介绍

一天,小编没事干,想做一个游戏,于是参考了大量内容,制作了这个飞行模拟器。

02:资源

02.01:准备

1、python
python IDLE (3.7 32-bit)
其他版本没有太大影响

2、panda3d(python库)
pip安装方法

pip3 install panda3d

02.02:参考

1、panda3d
panda3d官网
谷歌翻译

2、三角学
大学数学-平面三角学.pdf

03:上代码

from math import pi, sin, cos
from direct.showbase.ShowBase import ShowBase
from direct.showbase import DirectObject
from direct.task import Task
from direct.actor.Actor import Actor
from direct.interval.IntervalGlobal import Sequence
from panda3d.core import *
from direct.gui.DirectGui import *
from direct.gui.OnscreenText import OnscreenText
from direct.gui.OnscreenImage import OnscreenImageclass MyApp(ShowBase):      def __init__(self):ShowBase.__init__(self)# 禁用鼠标self.disableMouse()#隐藏鼠标props = WindowProperties()props.setCursorHidden(True)base.win.requestProperties(props)#设定摄像机初始位置self.camera.setPos(0,0,100)# 载入环境模型self.environ = self.loader.loadModel("models/environment")# 设置环境模型的父实例self.environ.reparentTo(self.render)# 对模型进行比例及位置调整self.environ.setScale(0.25, 0.25, 0.25)self.environ.setPos(-8, 42, 0)# 通知任务管理器调用SpinCameraTask控制相机self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")# 载入熊猫角色self.pandaActor = Actor("models/panda-model",{"walk": "models/panda-walk4"})self.pandaActor.setScale(0.005, 0.005, 0.005)self.pandaActor.reparentTo(self.render)# 动画循环self.pandaActor.loop("walk")# 创建四幕PosInterval1 = self.pandaActor.posInterval(13,Point3(0, -10, 0),startPos=Point3(0, 10, 0))PosInterval2 = self.pandaActor.posInterval(13,Point3(0, 10, 0),startPos=Point3(0, -10, 0))HprInterval1 = self.pandaActor.hprInterval(3,Point3(180, 0, 0),startHpr=Point3(0, 0, 0))HprInterval2 = self.pandaActor.hprInterval(3,Point3(0, 0, 0),startHpr=Point3(180, 0, 0))# 创建情节并运行四幕2self.pandaPace = Sequence(PosInterval1,HprInterval1,PosInterval2,HprInterval2,name="pandaPace")self.pandaPace.loop()#创建HUDglobal X1,X2,text,text2,L1,L2l,L2rtext=OnscreenText(fg=(255,255,0,255),pos=(-0.1,-0.1),scale=0.1,mayChange=True)text2=OnscreenText(pos=(-0.7,0),scale=0.1,mayChange=True)DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.04,0.04,-0.002,0.002),pos=(0,0,0))DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.002,0.002,-0.04,0.04),pos=(0,0,0))X1=DirectFrame(frameColor=(0,0,0,255),frameSize=(-0.04,0.04,-0.002,0.002),pos=(0,0,0))X2=DirectFrame(frameColor=(0,0,0,255),frameSize=(-0.002,0.002,-0.04,0.04),pos=(0,0,0))DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.5,-0.51,0.5,-0.5),pos=(0,0,0))L1=DirectFrame(frameColor=(255,255,0,255),frameSize=(0.2,0.11,0.005,-0.005),pos=(0,0,0))L2l=DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.1,-0.04,0.002,-0.002),pos=(0,0,0))L2r=DirectFrame(frameColor=(255,255,0,255),frameSize=(0.04,0.1,0.002,-0.002),pos=(0,0,0))DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.1,0.1,0.002,-0.002),pos=(0,0,0.5))DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.1,0.1,0.002,-0.002),pos=(0,0,-0.5))# 定义旋转相机def spinCameraTask(self, task):(mouse,size)=(base.win.getPointer(0),self.get_size())(mx0,my0)=(size[0]-mouse.getX(),mouse.getY())(mx,my,hpr)=(mx0/160,my0/160,self.camera.getHpr())(rx,ry)=(mx-size[0]/320+hpr[0],my-size[1]/320+hpr[1])pos=self.camera.getPos()(lx,ly,lz)=(pos[0],pos[1],pos[2])(angle,angle2)=(hpr[0],hpr[1])distance=0.2if angle<0:while angle<0:angle=angle+360else:angle=angle%360if angle2<0:while angle2<0:angle2=angle2+360else:angle2=angle2%360distance2=cos(angle2*pi/180)*distanceif angle%90==0:if angle==0:(x,y)=(0,distance2)elif angle==90:(x,y)=(distance2,0)elif angle==180:(x,y)=(0,-distance2)else:(x,y)=(-distance2,0)else:if angle<=45:x=sin(angle*pi/180)*distance2y=cos(angle*pi/180)*distance2elif angle<90:angle=90-anglex=cos(angle*pi/180)*distance2y=sin(angle*pi/180)*distance2elif angle<=135:angle=angle-90x=cos(angle*pi/180)*distance2y=-sin(angle*pi/180)*distance2elif angle<180:angle=180-anglex=sin(angle*pi/180)*distance2y=-cos(angle*pi/180)*distance2elif angle<=225:angle=angle-180x=-sin(angle*pi/180)*distance2y=-cos(angle*pi/180)*distance2elif angle<270:angle=270-anglex=-cos(angle*pi/180)*distance2y=-sin(angle*pi/180)*distance2elif angle<315:angle=angle-270x=-cos(angle*pi/180)*distance2y=sin(angle*pi/180)*distance2else:angle=360-anglex=-sin(angle*pi/180)*distance2y=cos(angle*pi/180)*distance2if angle2%90==0:if angle2==0 or angle2==90:z=distanceelse:z=0else:if angle2<=45:z=sin(angle2*pi/180)*distanceelif angle2<90:angle2=90-angle2z=cos(angle2*pi/180)*distanceelif angle2<=135:angle2=angle2-90z=cos(angle2*pi/180)*distanceelif angle2<180:angle2=180-angle2z=sin(angle2*pi/180)*distanceelif angle2<=225:angle2=angle2-180z=-sin(angle2*pi/180)*distanceelif angle2<270:angle2=270-angle2z=-cos(angle2*pi/180)*distanceelif angle2<315:angle2=angle2-270z=-cos(angle2*pi/180)*distanceelse:angle2=360-angle2z=-sin(angle2*pi/180)*distanceif lz<-1:self.closeWindow(self.win)raise RuntimeError('You crash the grund!')self.camera.setPos(-x+lx,y+ly,z+lz)self.camera.setHpr(rx,ry,0)if ry>=360:while ry>=360:ry=ry-360elif ry<0:while ry<0:ry=ry+360if ry//180==0:ry=ryelif ry//180==1:ry=ry-360L2l.setPos(0,0,ry/180)L2r.setPos(0,0,ry/180)b=size[1]/2a=mouse.getX()/b-size[0]/size[1],0,1-mouse.getY()/bX1.setPos(a)X2.setPos(a)text['text']=str(int(ry))text2['text']=str(int(z+lz))if z+lz>100:L1.setPos(-0.7,0,0.5)text2['pos']=(-0.7,0.48)else:L1.setPos(-0.7,0,(z+lz)/100-0.5)text2['pos']=(-0.7,(z+lz)/100-0.52)if z+lz<11:text2['fg']=(255,0,0,255)elif z+lz<31:text2['fg']=(0,255,255,255)else:text2['fg']=(255,255,0,255)return Task.contMyApp().run()

可全屏

玩法:
鼠标向上往下飞
鼠标向下往下飞
鼠标往左往左转
鼠标往右往右转
碰到地面会退出

如果您想鼠标往上往上飞,请将第92行改成:

        (mx0,my0)=(size[0]-mouse.getX(),size[1]-mouse.getY())

04:效果

效果1

05:尾声

05.01:对于网友

1、感兴趣的网友可以给这个程序化简一下,或者加上物理效应
2、感兴趣的网友可以找我要一下详细过程

05.02:对于列位转发爱好者

转载请通知我,并附上原网址,谢谢!

05.03:最后

麻烦点个赞,谢谢!


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

相关文章

c++的3D游戏笔录-基于panda3d(2)

1、panda3d使用了称为场景图&#xff08;the Scene Graph&#xff09;的树形数据结构&#xff0c;包括了所有需要渲染的对象&#xff0c;树根对象名为render。 2、通过window->get_render()得到render节点路径。 3、使用reparent_to()方法安装草地风景模型在场景图中。 4、 …

Panda3D设置游戏背景颜色和节点颜色、透明度

Panda3D如何设置游戏背景颜色和节点颜色 ​ 在使用panda3D开发的过程中&#xff0c;遇到了很多问题&#xff0c;国内网站上的资源实在是太少&#xff0c;因此把自己遇到的比较费时间但是又很简单的问题整理了以下&#xff0c;以供后续开发者参考。 1.设置背景颜色 self.setB…

了解Panda3D引擎的配置变量

Panda3d 引擎带有一些配置变量&#xff1b; 可以通过C或python代码访问&#xff1b; 进入自带python环境&#xff1b;输入下图语句&#xff1b; cvMgr是全局实例&#xff0c;定义在ShowBase.py中&#xff1b; 然后列出了引擎的配置变量&#xff1b; 很多&#xff1b; 具体含…

如何将Blender模型导入Panda3d

两种方法&#xff0c;使用Blender插件&#xff0c;或者Blend2bam。 第一种方法&#xff1a;Blender导出插件 1.对于Blender 2.5, 2.6, 2.7版本&#xff0c;使用&#xff1a;YABEE,导出文件格式.egg 注意&#xff0c;YABEE不适用Blender2.8及以上版本 GitHub - 09th/YABEE: …

panda3d虚幻引擎--(2)

目录 前言&#xff08;阿巴阿巴&#xff09; 上帝视角 导入人物模型和动作模型 前言&#xff08;阿巴阿巴&#xff09; 前几天无意间看到了一个叫做panda3d的东西&#xff0c;觉得挺好玩&#xff0c;就翻教程&#xff0c;发现现在中文教程似乎没有那么全面成体系&#xff0…

python3的3D实战-基于panda3d(1)

Panda 3D 是一个3D游戏引擎&#xff1a;一个 3D 渲染和游戏开发库 开发维护者&#xff1a;迪士尼VR工作室和卡耐基梅隆娱乐技术中心 授权协议&#xff1a;BSD 类继承自ShowBase。这个类加载大多数其他Panda3D模块&#xff0c;并导致3D窗口出现。 run()方法包含Panda3D主循环…

python panda3d教程_panda3d学习笔记(一)Hello World

终于还是把电脑上的游戏(CS1.6和SC2)打腻了=_=,在无聊的双休,作业又写完的情况下怎么打发时间? 所以还是决定学一款游戏制作的库,我的MX250貌似带不动虚幻系列的引擎,在github上翻大佬的repo时,看到了panda3d这个3d游戏制作库,话不多说,打开官方的tutorial,开始学习…

panda3d场景的主要状态

场景的状态包括位置、方向、缩放比例、物体朝向、颜色、可见性、透明度、相机等。 最常改变的是位置和方向。 panda3d的默认坐标系&#xff1a;X向右&#xff0c;Y向前&#xff0c;Z向上。 对象方向使用欧拉角度坐标&#xff1b;由航向&#xff08;Heading|Yaw&#xf…

Panda3d如何获取到可用的模型?Maya、3D Max、OBJ等3D格式转换为egg、gltf文件

​ 使用Panda3d进行3D环境建模也有一段时间了&#xff0c;真的是被折磨的头秃。。。不过也不得不说&#xff0c;Panda3D也确实是一个比较优秀的3D游戏引擎&#xff0c;还是能满足你的大部分需要的。 ​ 如果你在深入使用Panda3d后&#xff0c;我相信有个问题那绝对是让人头大的…

Panda3D如何加载obj格式的3D模型文件

​ 在上文中&#xff0c;讲了如何将max、obj、mb、fbx等主流格式的3D模型文件转换为egg、gltf格式&#xff0c;Panda3D可以加载的格式。在上文末尾&#xff0c;博主临时看到了一种方式&#xff0c;可以让Panda3d直接加载obj格式的文件&#xff0c;因此本文来专门看下如何实现。…

Panda3D 初学者教程(一)

Panda3D 初学者教程&#xff08;一&#xff09; 原文链接 原文 Lesson 1 Hello World In which we learn how to make and run a Panda3D instance, and how to load and manipulate models. At it’s most basic, running a Panda3D program is quite simple: create a …

panda3d虚幻引擎--(1)

目录 前言&#xff08;阿巴阿巴&#xff09; 安装 调整窗口 导入环境 前言&#xff08;阿巴阿巴&#xff09; 前几天无意间看到了一个叫做panda3d的东西&#xff0c;觉得挺好玩&#xff0c;就翻教程&#xff0c;发现现在中文教程似乎没有那么全面成体系&#xff0c;大部分…

图解 Panda3D引擎开发入门

Panda3D 是一个 3D 渲染和游戏开发框架&#xff0c;可以在这个框架下使用 Python 和 C 。Panda3D 是开源软件&#xff0c; 它的许可证让它可以用于任何用途&#xff0c; 包括商业用途。本文使用Panda3D 1.7.0版本&#xff0c;其最新稳定版本是1.7.2。可在官网下载最新稳定版本。…

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

文章目录 Panda3D场景安排模型加载渲染属性任务任务链事件处理主循环 视角相机阴影环境灯方向灯 控制key-events DirectGui碰撞检测后续 Panda3D场景安排 ​ Panda3D将其对象存储在场景图中&#xff0c;从本质上讲&#xff0c;这是一个对象的层次结构&#xff0c;称为节点。 ​…

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

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

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

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

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

很好的视频 https://www.bilibili.com/video/BV15t411Y7cf/?spm_id_from333.788.b_636f6d6d656e74.96&vd_source6f3a5e0ac931d869aee3d7c9bb6847e0 一、Gamma校正 1.前言&#xff1a;颜色空间 ● 一些颜色空间的举例&#xff0c;&#xff08;具体参考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 &#xff1b; 《Shader入门精要》冯乐乐女神著&#xff1b; https://www.zhihu.com/question/27467127/answer/111973548 https://www.jianshu.com/p/9a91e6ad0d38 本篇主要用于自我复习&#xff0c;如有疑问或发现有什么错误&am…

2.6 伽马校正 一、Gamma校正

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