鱼C论坛

 找回密码
 立即注册
查看: 1819|回复: 11

[已解决]pygame天体运动模拟求助……

[复制链接]
发表于 2023-8-2 17:24:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源码:


                               
登录/注册后可看大图
code.zip (114.5 KB, 下崽次数: 1)

现在我已经加入了三维坐标计算,那么怎么知道天体应该缩小成原来的多少倍呢 (视角始终在正上方,x y 没有缩放,我指的是 z)
最佳答案
2023-8-2 17:25:22
本帖最后由 isdkz 于 2023-8-2 17:32 编辑

你好!根据你的描述,你已经在pygame中加入了三维坐标计算,并且你想知道如何确定天体在z轴方向(垂直方向)上应该缩小多少倍,以实现适当的视觉效果。以下是你可以考虑的方法:

在三维图形渲染中,通常会使用透视投影来模拟远近景深,这是因为我们的视觉系统会感知远处的物体比近处的物体小。你可以尝试使用类似的透视投影方法来实现天体在z轴方向上的缩放效果。

一种简单的方法是,根据天体在z轴上的距离,对其进行缩放。你可以通过计算天体的z坐标与相机位置的距离来确定缩放比例。距离相机越远的天体,缩放比例就越小,距离相机越近的天体,缩放比例就越大。

在你的代码中,可以尝试以下步骤来实现这一效果:

1. 计算天体与相机的距离:在更新天体位置的部分,计算天体在三维空间中与相机位置的距离。可以使用欧几里得距离公式来计算距离。

2. 根据距离确定缩放比例:根据计算得到的距离,你可以设置一个缩放函数,将距离映射到适当的缩放比例范围。例如,你可以使用一个反比例函数,让距离越远的天体缩放越小。

3. 应用缩放:在绘制天体的部分,根据计算得到的缩放比例,对天体的z轴尺寸进行缩放。你可以通过修改绘制的矩阵或者直接修改天体的z坐标来实现缩放效果。

以下是一个简化的示例代码片段,演示了如何根据距离进行缩放:
import pygame
import math

# 计算两点之间的距离
def distance(p1, p2):
    return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 + (p1[2] - p2[2])**2)

# 初始化pygame和窗口
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

# 相机位置
camera_pos = [0, 0, 0]

# 天体位置
star_pos = [100, 100, 500]  # 示例天体初始位置

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    # 计算天体与相机的距离
    dist = distance(star_pos, camera_pos)

    # 根据距离设置缩放比例(这里使用简单的线性缩放)
    scale_factor = max(1 - dist / 1000, 0.2)  # 距离越远,缩放越小,最小缩放为0.2

    # 缩放天体的z轴尺寸
    scaled_star_pos = [star_pos[0], star_pos[1], star_pos[2] * scale_factor]

    # 在屏幕上绘制天体(这里使用简化的绘制方法)
    screen.fill((0, 0, 0))
    pygame.draw.circle(screen, (255, 255, 255), (400, 300), int(scaled_star_pos[2]))
    pygame.display.flip()
    clock.tick(60)

请注意,上述代码只是一个示例,你可能需要根据你的具体情况进行调整和优化。希望这能帮助你实现天体在z轴方向上的缩放效果!如果有更多问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-2 17:25:08 | 显示全部楼层
问题:现在我已经加入了三维坐标计算,那么怎么知道天体应该缩小成原来的多少倍呢?

要确定天体在视角上缩小的倍数,可以考虑以下几个因素:

1. 距离因素: 天体与观察者之间的距离是影响缩放比例的一个重要因素。一般而言,距离越远,天体在视角上就会越小。
2. 视野范围因素: 视野范围的设定也会影响天体的缩放比例。如果视野范围较小,天体在相同距离下会更大;反之,如果视野范围较大,天体在相同距离下会更小。
3. 期望的视觉效果: 个人对于天体大小的期望也是决定缩放比例的因素。你可以根据所需的视觉效果来调整缩放比例,使天体看起来更符合你的预期。

在代码中,根据以上因素,你可以通过修改天体半径(或直径)的数值来实现缩放效果。将半径设定为小于原始半径的数值,可以使天体在视角上缩小。你可以尝试不同的倍数,逐渐调整缩放比例,直到达到你期望的效果。

需要注意的是,视角在正上方且 x、y 轴没有缩放,这意味着你只需要调整天体在 z 轴上的缩放比例即可。具体来说,你可以通过修改绘制天体的半径(或直径)来控制其在视角上的大小。

请参考代码中绘制天体部分的相关代码,并根据需求修改半径的数值来实现天体的缩放效果。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 17:25:14 | 显示全部楼层
问题:现在我已经加入了三维坐标计算,那么怎么知道天体应该缩小成原来的多少倍呢?

在进行天体运动模拟时,如果你已经加入了三维坐标计算,那么决定天体缩放比例的关键是选择一个合适的视角和观察距离。通过调整观察距离,你可以控制天体在屏幕上显示的大小。

以下是一些思路和方法供参考:

1. 固定缩放比例: 可以手动选择一个固定的缩放比例作为天体的尺寸,使其在给定的观察距离下看起来合适大小。这种方法简单明了,但可能在不同的观察距离下效果不佳。

2. 基于观察距离的自适应缩放: 根据观察距离的远近自动调整缩放比例。当观察距离较远时,天体可以缩小,以避免在屏幕上显示过大。当观察距离较近时,天体可以放大,以更清晰地显示细节。你可以使用线性或非线性函数来计算缩放比例。

   例如,可以使用如下公式之一来计算缩放比例:

   - scale = k / distance:使用一个常数k除以观察距离,其中k是你选择的合适系数。
   - scale = k * log(distance):使用观察距离的对数与一个系数k相乘。

   通过调整k的值,你可以控制天体的最终大小。

3. 与屏幕尺寸相匹配的缩放: 如果你希望天体在屏幕上显示的大小与屏幕尺寸保持一致,可以根据屏幕的宽度或高度来计算缩放比例。当观察距离变化时,天体的缩放比例也会相应调整,以适应不同大小的屏幕。这种方法通常适用于创建适用于不同设备和屏幕尺寸的可视化效果。

请注意,确定合适的缩放比例需要根据具体情况进行调整和实验。你可以通过反复尝试不同的缩放方法和参数来找到最佳效果。最终选择的缩放比例应该根据你的需求和期望来确定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 17:25:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-8-2 17:32 编辑

你好!根据你的描述,你已经在pygame中加入了三维坐标计算,并且你想知道如何确定天体在z轴方向(垂直方向)上应该缩小多少倍,以实现适当的视觉效果。以下是你可以考虑的方法:

在三维图形渲染中,通常会使用透视投影来模拟远近景深,这是因为我们的视觉系统会感知远处的物体比近处的物体小。你可以尝试使用类似的透视投影方法来实现天体在z轴方向上的缩放效果。

一种简单的方法是,根据天体在z轴上的距离,对其进行缩放。你可以通过计算天体的z坐标与相机位置的距离来确定缩放比例。距离相机越远的天体,缩放比例就越小,距离相机越近的天体,缩放比例就越大。

在你的代码中,可以尝试以下步骤来实现这一效果:

1. 计算天体与相机的距离:在更新天体位置的部分,计算天体在三维空间中与相机位置的距离。可以使用欧几里得距离公式来计算距离。

2. 根据距离确定缩放比例:根据计算得到的距离,你可以设置一个缩放函数,将距离映射到适当的缩放比例范围。例如,你可以使用一个反比例函数,让距离越远的天体缩放越小。

3. 应用缩放:在绘制天体的部分,根据计算得到的缩放比例,对天体的z轴尺寸进行缩放。你可以通过修改绘制的矩阵或者直接修改天体的z坐标来实现缩放效果。

以下是一个简化的示例代码片段,演示了如何根据距离进行缩放:
import pygame
import math

# 计算两点之间的距离
def distance(p1, p2):
    return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 + (p1[2] - p2[2])**2)

# 初始化pygame和窗口
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

# 相机位置
camera_pos = [0, 0, 0]

# 天体位置
star_pos = [100, 100, 500]  # 示例天体初始位置

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    # 计算天体与相机的距离
    dist = distance(star_pos, camera_pos)

    # 根据距离设置缩放比例(这里使用简单的线性缩放)
    scale_factor = max(1 - dist / 1000, 0.2)  # 距离越远,缩放越小,最小缩放为0.2

    # 缩放天体的z轴尺寸
    scaled_star_pos = [star_pos[0], star_pos[1], star_pos[2] * scale_factor]

    # 在屏幕上绘制天体(这里使用简化的绘制方法)
    screen.fill((0, 0, 0))
    pygame.draw.circle(screen, (255, 255, 255), (400, 300), int(scaled_star_pos[2]))
    pygame.display.flip()
    clock.tick(60)

请注意,上述代码只是一个示例,你可能需要根据你的具体情况进行调整和优化。希望这能帮助你实现天体在z轴方向上的缩放效果!如果有更多问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-2 17:26:03 | 显示全部楼层
isdkz 发表于 2023-8-2 17:25
你好!根据你的描述,你已经在pygame中加入了三维坐标计算,并且你想知道如何确定天体在z轴方向(垂直方向 ...

Snipaste_2023-08-02_17-25-51.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 17:26:59 | 显示全部楼层
求代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-2 17:27:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-8-2 17:29:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 17:29:48 | 显示全部楼层
歌者文明清理员 发表于 2023-8-2 17:27
这个在 GitHub 上开源了:https://github.com/dddddgz/star-motion-simulate

不会墙翻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-2 17:31:39 | 显示全部楼层

GitHub 不用虚拟隧道网络哦,我直连 1秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 17:56:50 | 显示全部楼层

FastGithub了解一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 21:03:16 | 显示全部楼层
介于你可能以后需要移动摄像机和渲染星球路径,不建议直接将视角定死在俯视图。 OpenGL 这一三维渲染库可能符合你的需求。(你也可以手搓一个,就是要一点点矩阵知识)

就现在而言,你有两种选择:正交和投影。
正交指的是摄像机是一个平面,而投影指的是摄像机是一个点。
如果是正交的话就非常简单,星球的大小并不会改变。
如果是投影的话,你可以使用相似三角形。

设屏幕与摄像机的 z 轴差为 f ,星球实际的大小为 r ,星球与摄像机的 z 轴差为 d ,星球在屏幕上的大小为 r'
容易得到,

d/f = r/r'

d/f = r/r'


r' = fr/d

r' = fr/d

所以星球的大小就是这样。(我应该没算错吧)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 08:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表