- 通过方向和方向上的速度算Motion值
1.找到Motion by Speed一栏;
2.填写RotationX、RotationY、Speed;
3.按下Work out Motion按钮即可。
4.点击ClearAll按钮清空所有。
- 通过起点坐标和终点坐标算Motion
1.填写起点坐标和终点坐标(有没有填写的会有提示);
2.填写加速度和阻力、抛射角度;
3.点击Work out Motion生成,注意不是所有角度都符合条件,如果不符合条件会有提示;
4.填写一个正确的抛射角度后,点击Work out Motion算出Motion值。
6.点击Export Rotation按钮生成NBT的Rotation。
- 画线功能
1.在得到Motion后(可以自行填写),点击Draw the line画出运动轨迹。
2.点击确定。如果拥有起点坐标,左上会写出起点坐标;如果有终点坐标,两条直线交点则是终点坐标。
3.点击Clear the line清空画线面板。
4.修改画面比例可以得到全图运动轨迹。通过速度算出的Motion可以算出最终距离起点多少长度。
5.同样按下确定,如果有,能够显示起点坐标和终点坐标。
6.点击ClearAll按钮清空所有。
- 贴心功能
- xmov = sp * sin(xdeg) * cos(ydeg)
- ymov = sp * sin(ydeg)
- zmov = sp * cos(xdeg) * cos(ydeg)
- xmov = -sp * sin(xdeg) * cos(ydeg)
- ymov = sp * sin(ydeg)+0.1
- zmov = sp * cos(xdeg) * cos(ydeg)
算法2——两坐标算方向
前面提到了Ry,Rx有些特别,
根据规律:
Rx:
Ry:
- <b style="font-size: x-large;"> </b><font size="1">Rx = atan2(delZ, delX)
- Ry = atan2(delY,Sqrt(delX * delX + delZ * delZ)))</font>
算法3——两坐标算Motion
- v = f + (Math.Sqrt(g * lenx * lenx) / (Math.Cos(d * Math.PI / 180) * Math.Sqrt(2 * lenx * Math.Tan(d * Math.PI / 180) - leny))) * Math.PI
- this.posX += this.motionX;
- this.posY += this.motionY;
- this.posZ += this.motionZ;
- this.motionX *= (double)var18;
- this.motionY *= (double)var18;
- this.motionZ *= (double)var18;
- this.motionY -= (double)var19;
- this.setPosition(this.posX, this.posY, this.posZ);
var18=f=1-阻力
- x=mx+fmx+f^2 mx+……+f^t mx
- =(f^0+f^1+f^2+……+f^t)mx
再整理:
- mx=x/(-100(0.99^t-1))
- my=(y+gt)/(-100(0.99^t-1))
因此能进一步推导t,也可以通过另类求法:
- θ<45
- tan(θ)=my/mx=(y+gt)/10(1-0.99^t)*10(1-0.99^t)/x=(y+gt)/x
- y+gt=x*tan(θ)
- gt=x*tan(θ)-y
- t=(x*tan(θ)-y)/g
- θ>45
- tan(90-θ)=mx/my
- t=(x/tan(90-θ)-y)/g
求出t后,mx my mz只需要:
- motx = delX / (-100 * (Math.Pow(1 - d, t) - 1));
- moty = (delY + G * t) / (-100 * (Math.Pow(1 - d, t) - 1)) + 0.1;
- motz = delZ / (-100 * (Math.Pow(1 - d, t) - 1));
下载地址:
[groupid=546]Command Block Logic[/groupid]