使用Processing和box2d创建单波

使用Processing和box2d创建单波,processing,box2d,Processing,Box2d,我在box2d世界里有一系列的身体。这些尸体被锁在一起。我想在按下鼠标时沿身体创建一个正弦波。我只希望这个波发生一次,它应该以相同的振幅沿着物体的长度继续,直到到达终点,然后停止,直到再次按下鼠标 目前,我有以下几点: 浮动角度=0.0; 浮点标量=1.2; 浮动速度=0.01; 无效鼠标按下{ 对于int j=0;j

我在box2d世界里有一系列的身体。这些尸体被锁在一起。我想在按下鼠标时沿身体创建一个正弦波。我只希望这个波发生一次,它应该以相同的振幅沿着物体的长度继续,直到到达终点,然后停止,直到再次按下鼠标

目前,我有以下几点:

浮动角度=0.0; 浮点标量=1.2; 浮动速度=0.01; 无效鼠标按下{ 对于int j=0;j<91;j++{ float x=sinj+角度*标量; 浮动y=0; Vec2 mov2=新的Vec2x,y; bridge.particles.getj.body.setLinearVelocitymov2; 角度+=速度; } } 然而,这会导致物体变成一个连续波,只会向外扩展,如下所示,此时仅在左股上尝试:

如何创建一个向下移动的单波

使用@dfour的修订代码,我使用:

无效鼠标按下{ int frequency=10;//长波的正弦频率更大 double fullCircle=Math.toRadians180;//以弧度为单位对一个圆进行1次完整迭代; 浮动x=0; 浮动y=0; forint i=0;i<100;i++{ ifi>整圈*频率{ //第一波后,输出0 //System.out.println0; }否则{ //第一个正弦波的一部分,因此输出波形值 x=floatMath.sini/频率; Vec2 mov2=新的Vec2x,y; 打印x:+x; System.out.printlnMath.sini/frequency; bridge.particles.geti.body.setLinearVelocitymov2; } } }
但是这给了我以下的信息,波实际上并没有沿着物体的直线前进:

为了得到一个正弦的单波,你只需要循环通过,一旦第一个波完成,输出0

整数频率=10;//对于较长的波,正弦频率较大 双整圆=Math.toRadians360;//以弧度为单位对一个圆进行1次完整迭代; fordouble i=0;i<75;我++{ ifi>整圈*频率{ //第一波后,输出0 System.out.println0; }否则{ //第一个正弦波的一部分,因此输出波形值 System.out.printlnMath.sini/frequency; } } 编辑:

我已经使用LibGdx框架对此进行了测试,并且一切正常。要将此应用于代码,您需要添加一个计时器字段来存储时间:

专用浮点数定时器=50f//最初50f为0时将开始波动 私有最终整数粒子=40;//桥中粒子的数量 然后在clickMethod中添加:

正弦定时器=-35f;//重置计时器 现在在主循环中添加:

sineTimer+=Gdx.graphics.getDeltaTime*10;//自上一帧开始的增量时间 整数频率=3;//对于较长的波,正弦频率较大 float fullCircle=float Math.toRadians360;//以弧度为单位对一个圆进行1次完整迭代; //循环通过所有粒子 forint i=0;i<颗粒;我++{ 浮动偏移量=i;//设置基准偏移量 offset+=sineTimer;//将计时器值添加到offset //若偏移小于0或超过第一个正弦波,则将粒子设置为默认位置 如果偏移>整圈*频率| |偏移<0{ bridgeParticles.geti.setTransform32,i,0; }else{//else应用正弦位置我在这里使用x*3来放大x轴上的正弦 float x=floatMath.sinoffset/frequency; bridgeParticles.geti.setTransformx*3+32,i,0; } } 为处理环境修订的代码:

专用浮点数定时器=50f//最初50f为0时将开始波动 私有最终整数粒子=40;//桥中粒子的数量 抽真空{ sineTimer+=0.5;//自上一帧开始的增量时间 int frequency=23;//长波的正弦频率更大 float fullCircle=float Math.toRadians180; forint i=0;i<粒子;i++{ 浮动偏移量=i;//设置基准偏移量 offset+=sineTimer;//将计时器值添加到offset 如果偏移>整圈*频率| |偏移<0{ bridge.particles.geti.body.setTransformbox2d.coordPixelsToWorld200,i*10,0; }否则{ float x=floatMath.sinoffset/frequency; bridge.particles.geti.body.setTransformbox2d.coordPixelsToWorldx*125+200,i*10,0; } } } 无效鼠标按下{ sineTimer=-35f;//重置计时器 }
只是要明确一点:这就是为什么两个标签都在。但是问题也可能是java的,如果你想自己控制身体,你使用box2d有什么原因吗?如果你知道物体的位置,为什么不直接画出来,而不是依靠物理引擎?@KevinWorkman我需要使用box2d,因为我正在模拟盒子与物体链的其他相互作用,我没有展示。H
aving说,我使用的是box2d其实并不重要,我可以得到对象的位置,不管它是否是box2d。我只是不知道如何做单正弦波这是重复的吗?谢谢@dfour…请看修改后的代码。我遇到的一个最大的问题是,波浪不会沿着链条向下移动bodies@SebastianZeki我添加了一个在LibGdx框架下工作的完整示例,希望您能够将其转换为您的需要:谢谢@dfour。我已经添加了处理版本。此时,波浪正从底部向顶部传播。我如何改变它的方向,使它从上到下运行?好的,通过改变偏移量-=sineTimer得到它