二维垂直 angular 碰撞
2D vertical angular collisions
目前我正在研究 2D 粒子模拟器。我让每个粒子以独特的角度移动。我找到了一个改变 x 和 y 速度的基本公式,但我目前有一个根据角度移动的设定速度。
particles[a][3] += particles[a][1] * cos(radians(particles[a][5]));//move X
particles[a][4] += particles[a][1] * sin(radians(particles[a][5]));//move Y
我有一个关于墙壁碰撞的基本碰撞,但找不到解决碰撞的最佳方法。目前我只是将旋转乘以 -1,但这只适用于顶部和底部。注意:粒子将在 运行 碰撞后始终移动(它不会卡在碰撞盒中并被窃听)。
if(particles[a][3] < 0 || particles[a][3] > windowWidth/2 || particles[a][4] < 0 || particles[a][4] > windowHeight/2) {
/*windowWidth and windowHeight are divided by 2 to find the canvas size. In the setup() I have the canvas set to that value).*/
particles[a][5] *= -1;
}
数组值:
particles[a][1] = speed
particles[a][3] = x position
particles[a][4] = y position
particles[a][5] = rotation
我的问题是 运行 这些碰撞测试的最佳方法是什么。我知道碰撞会以 90 度反弹,但我想使用尽可能少的 if 语句(越简单越好)而不是一堆乏味的东西。
圣诞快乐,提前致谢!
想通了!
最终代码:
if(particles[a][4] < 0 || particles[a][4] > windowHeight/2) {
particles[a][5] *= -1;
} else if(particles[a][3] < 0 || particles[a][3] > windowWidth/2) {
particles[a][5] = 180 - particles[a][5];
}
尝试谷歌搜索 "javascript reflect angle",您会找到用于反映 X 轴和 Y 轴的公式。撞上或撞底你做一个,撞左或右你做另一个。
此外,您可能不应该使用数组来保存数据。创建一个包含您的值的 class,然后创建该 class 的实例。使用魔术数组索引是一个令人头疼的方法。
如果仍然无法正常工作,请 post 一个 MCVE,我们将从那里开始。祝你好运。
目前我正在研究 2D 粒子模拟器。我让每个粒子以独特的角度移动。我找到了一个改变 x 和 y 速度的基本公式,但我目前有一个根据角度移动的设定速度。
particles[a][3] += particles[a][1] * cos(radians(particles[a][5]));//move X
particles[a][4] += particles[a][1] * sin(radians(particles[a][5]));//move Y
我有一个关于墙壁碰撞的基本碰撞,但找不到解决碰撞的最佳方法。目前我只是将旋转乘以 -1,但这只适用于顶部和底部。注意:粒子将在 运行 碰撞后始终移动(它不会卡在碰撞盒中并被窃听)。
if(particles[a][3] < 0 || particles[a][3] > windowWidth/2 || particles[a][4] < 0 || particles[a][4] > windowHeight/2) {
/*windowWidth and windowHeight are divided by 2 to find the canvas size. In the setup() I have the canvas set to that value).*/
particles[a][5] *= -1;
}
数组值:
particles[a][1] = speed
particles[a][3] = x position
particles[a][4] = y position
particles[a][5] = rotation
我的问题是 运行 这些碰撞测试的最佳方法是什么。我知道碰撞会以 90 度反弹,但我想使用尽可能少的 if 语句(越简单越好)而不是一堆乏味的东西。
圣诞快乐,提前致谢!
想通了! 最终代码:
if(particles[a][4] < 0 || particles[a][4] > windowHeight/2) {
particles[a][5] *= -1;
} else if(particles[a][3] < 0 || particles[a][3] > windowWidth/2) {
particles[a][5] = 180 - particles[a][5];
}
尝试谷歌搜索 "javascript reflect angle",您会找到用于反映 X 轴和 Y 轴的公式。撞上或撞底你做一个,撞左或右你做另一个。
此外,您可能不应该使用数组来保存数据。创建一个包含您的值的 class,然后创建该 class 的实例。使用魔术数组索引是一个令人头疼的方法。
如果仍然无法正常工作,请 post 一个 MCVE,我们将从那里开始。祝你好运。