【作业1】No Body Galaxy的简单鼠标交互

太极图形课S1-HTC Homework

作业描述

NoBody Galaxy

代码原版是3000颗小行星之间万有引力作用,在此基础上加入一颗常量行星(不受其他行星万有引力作用但对其他行星有作用力)

常量行星的质量相比小行星大很多倍,这样会吸引周围的行星涌向自己,常量行星半径也很大(为了醒目,后续会有鼠标控制)

m = 1#小行星质量
M = 5000#常量行星质量
planet_radius = 2#小行星半径
Const_planet_radius = 30#常量行星半径

给常量行星一个初始位置,后面鼠标也会控制这个位置

Const_Pos=ti.Vector.field(2,ti.f32,())
Const_Pos[None]=[.5,.5]

在计算作用力的函数中,添加常量行星和其他行星作用力逻辑(和小行星逻辑一样,核心是万有引力公式),这里会给每个小行星做一个标记,当常量星和小行星到达一定距离会被标记,在开启吸入模式后(点击鼠标右键),这些小行星会被吸入,这里吸入的逻辑就是将他们的position置为负(就不在屏幕空间[0,1]X[0,1]内了),velocity置为0

compute_force函数:

# Const planet
for i in range(N):
    diff = pos[i] - Const_Pos[None]#距离
    if diff.norm() < 1e-2:#吸入标记
    	IsHale[0, i] = 1
    else:
    	IsHale[0, i] = 0

	r = diff.norm(1e-2)  # clamp to 1e-1 if diff<0
	f = -G * m * M * (1.0 / r) ** 3 * diff #万有引力公式
	force[i] += f

update函数:

if Start[None] and IsHale[0, i]:
	pos[i] = [-10000, -10000]
	vel[i] = [0, 0]
else:
	vel[i] += dt * force[i] / m
	pos[i] += dt * vel[i]

成功效果展示

NoBody Galaxy

鼠标左键控制常量巨星的位置,点击右键常量巨星会开始吸收周围行星(其他按键:点击键盘‘r’重新开始,空格暂停)

代码链接

code

2 个赞