Python模拟星空
Posted Want595
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python模拟星空相关的知识,希望对你有一定的参考价值。
文章目录
前言
Python模拟星空,你值得拥有!uu们一周不见啦,本周博主参考网上大佬们的星空,给大家带来了属于自己的星空,快来看看吧~
Turtle基础
小海龟(Turtle)是Python中画图的一个重要的包(内置包),里面包含丰富的画图工具以及画图的各种功能,当你学会了用Turtle画图后,你可以画任何你想画的图案哦
1.1 Turtle画板
Turtle的画板大小可以用turtle.screensize()函数来设置
turtle.screensize(width,height,bg):设置画板的大小,包含长和宽,width为宽,height为高,bg为画布颜色
1.2 Turtle画笔
Turtle的画笔有几个常用的函数
①turtle.penup():抬起画笔,此时移动画笔不会在画布上留下痕迹哦
②turtle.pendown():放下画笔,与turtle.penup相对应,放下画笔后就可以继续画画了(放下画笔后画画会在画布上留下痕迹)
③turtle.pensize():控制画笔的大小(可以根据需求自行定义画笔的大小哦)
④turtle.pencolor():控制画笔的颜色(可以自己在网上查阅所有python可以使用的颜色,python里面可以用的颜色有很多的哦)
⑤turtle.hideturtle():隐藏画笔(隐藏画笔以后画图时画笔就看不到了)
1.3 Turtle画图
在画图的过程中,我们经常要使用一些简单的移动函数
①turtle.forward(x):将画笔向前移动x个像素(x可以理解为距离)
②turtle.backward(x):将画笔向后退x个像素(x可以理解为距离)
③turtle.left(n):将画笔向左旋转n度
④turtle.right(n):将画笔向右旋转n度
⑤turtle.speed():设置画笔画图的速度(1~10递增,0最快)
1.4 Turtle填色
在画好图后,我们经常需要对其进行填色,这里可以用turtle.fillcolor()函数,括号里写入你想填充的颜色即可。
在使用turtle.fillcolor()函数要注意其基本格式
turtle.beginfill() #开始填充
turtle.fillcolor() #输入填充的颜色
turtle.endfill() #结束填充
1.5 Turtle写字
在完成整个画图后,我们可以使用turtle.write()函数进行写字
turtle.write(" ",move,align,font)
① 第一个位置双引号内填入要写的字
② move(可选):在默认情况下,move为false。如果move为true,则笔将移动到右下角
③ align(可选):可取值是left即左、center即中、right即右之一,是字符串格式
④ font(可选):字体三元组(fontname、fontsize、fonttype),fontname即字体名称(字符串格式,如“宋体”),fontsize即字体大小),fonttype即字体类型如:normal(普通)、bold(粗体)、italic(斜体)
模拟星空
简单了解turtle小海龟后,让我们一起来模拟星空吧!
模拟星球
我们将每一个星球看成一个质点,每一个质点用小海龟表示,通过克隆小海龟生成一个个星球
t=tu.Turtle(visible=False,shape='circle')
t.pencolor("white")
t.fillcolor("white")
t.penup()
t.goto(ra.randint(width/2,width),ra.randint(-height/2,height/2))
for i in range(99):
star=t.clone()
s=ra.uniform(0,1)/3
star.shapesize(s,s)
star.speed(ra.randint(2,5))
star.setx(ra.randint(width/2,width))
star.sety(ra.randint(-height/2,height/2))
star.showturtle()
stars.append(star)
浪漫星空
通过循环来模拟星空
当每个星球从左边消失时,我们将他从新加入右侧,继续循环
while True:
for star in stars:
star.setx(star.xcor()-star.speed())
if star.xcor()<-width/2:
star.hideturtle()
star.setx(ra.randint(width/2,width))
star.sety(ra.randint(-height/2,height/2))
star.showturtle()
尾声
友友们下期见!
如何在 OpenGL 中创建 3D 太阳系中的星空背景?
【中文标题】如何在 OpenGL 中创建 3D 太阳系中的星空背景?【英文标题】:How to create a starry background in 3D solar system in OpenGL? 【发布时间】:2018-05-21 06:21:08 【问题描述】:我有一个简单的太阳系模拟,其中行星围绕太阳运行。但我想创建一个星空背景,它不一定是准确的表示。
我尝试下载一张星空图片,然后将其作为纹理映射到一个大球体。然后放置球体,使其包含整个场景,但无论图片如何,它们都非常暗淡。至少,我认为。我什至看不到星星。当我将球体缩小时,我可以看到它实际上是在对其进行纹理处理,但它一点也不亮。
还有其他方法可以做到这一点吗?谢谢
【问题讨论】:
您是否尝试过禁用球体的照明? 使用立方体贴图纹理。并记住在不照亮它的情况下绘制它(仅纹理)。 你正在尝试的是一个天空穹顶。要么增加天空位图的分辨率,要么减小天空穹顶的大小。禁用默认照明。 你正在尝试的是一个天空穹顶。要么增加天空位图的分辨率,要么减小天空穹顶的大小。禁用默认照明。 没有代码,纹理和截图我们只能问。问题可能在任何地方(错误的颜色、照明、分辨率等)。有关混合方法,请参阅 swift sphere combine star data,有关其他想法和内容,请参阅 Is it possible to make realistic n-body solar system simulation in matter of size and mass? ... 【参考方案1】:你快到了!
-
您需要为球体禁用照明,这样即使没有照明,您也可以看到纹理。
此外,您还需要启用自发光,以便星星发出自己的光。
您可能还想了解 天空盒,这是 3D 场景中非几何环境的标准方式。
【讨论】:
我使用glDisable(GL_LIGHTING)
(然后启用它)然后绘制它,但我仍然看不到球体。可能是纹理本身拉伸太多了吗?有没有办法让纹理保持相同大小,但多次粘贴到球体上以覆盖它?
其实我刚刚发现球体的内部实际上并没有被看到。所以问题不在于它太暗,而是球体内部没有纹理。可能是常识,但对我来说是新闻。有什么方法可以让内部纹理化,还是我应该不用这种方法?
好的 nvm。所以我只是 glScalef(-1,-1,-1)
并将它放在场景的中心。对我来说已经足够了
您的球体没有被渲染可能有多种原因。第一个是照明(如果它离灯光太远,它会很暗 - 100% 阴影)。它也可能离相机太远(远剪辑平面)。渲染后,您必须检查拉伸纹理的映射坐标,因此您必须找到正确的设置将纹理映射到球体(您可能希望切换到立方体并使用适当的天空盒纹理) 以上是关于Python模拟星空的主要内容,如果未能解决你的问题,请参考以下文章
满天星空小游戏—小白一学就会的python游戏开发实战源码+教程