2

以下代码每 50 毫秒调用一次。

// Start point
private double x;
private double y;
private double z;

private double y1;
@Override
public void run() {
    double x1 = Math.cos(y1);
    double z1 = Math.sin(y1);
    double y2 = 4D - y1;
    double x2 = Math.sin(y2);
    double z2 = Math.cos(y2);
    // First new point
    double pX1 = x + x1;
    double pY1 = y + y1;
    double pZ1 = z + z1;
    // Second new point
    double pX2 = x + x2;
    double pY2 = y + y2;
    double pZ2 = z + z2;

    if (y1 > 4D) {
        y1 = 0D;
    } else {
        y1 = y1 + 0.1D;
    }
}

这是游戏中的输出。它产生两个螺旋。除了半径之外,我无法控制。

我正在寻找可以轻松自定义以适合我的喜好的代码。如何控制以下几个方面?

  • 螺旋上升的速度有多快。

  • 螺旋开始的地方。

4

3 回答 3

2

螺旋是圆形的,平面的“线性”运动

  • 您使用平面 xz 作为螺旋底,使用 y 轴作为高度
  • 所以你需要:
  • r- 半径
  • d- 两个螺丝之间的距离(整圈后的 y 运动)
  • t-<0,1>确定螺旋位置的参数
  • h0,h1- 螺旋线的起始端高度(y 轴)
  • a0- 角度起始位置 [rad]

现在如何将螺旋上的点作为参数的函数这些参数

aa=fabs(h1-h0)*2.0*M_PI/d; // angular speed coefficient
// if you need opposite angular direction then add aa=-aa;
x=r*cos(a0+aa*t);
z=r*sin(a0+aa*t);
y=h0+((h1-h0)*t);
  • aa可以预先计算一次
  • 现在如果t=0.0那么你得到螺旋的起点
  • 如果t=1.0那么你得到了螺旋的端点
  • t所以速度就是你在每个计时器周期的动画中添加多少
  • d控制螺旋环的数量
  • h1-h0是螺旋高度
  • 代码在 C++ 中(对不起,我不是 JAVA 编码器)
于 2015-01-29T08:23:15.017 回答
2

螺旋的一部分开始于:

(x, y, z) = (1.0, 0.0, 0.0)

另一个在:

(x, y, z) = (-0.8, 4.0, -0.7)

0.1并且粒子以(从y1 = y1 + 0.1D)的速率上升。

因此,要控制粒子上升的速度,只需更改此值即可。

要控制螺旋线的起点,您需要更改角度。例如,为正弦和余弦添加一些值。像这样:

Math.cos(y1 + dy);

要在从地面重新开始之前进行更多旋转,您可以乘以角度。让它快两倍:

Math.cos(2 * y1);
于 2015-01-28T16:20:23.257 回答
1

螺旋是具有渐进 Y 值的圆形。

// Start point
private double x;
private double y;
private double z;

private double degree;
private double rY;
@Override
public void run() {
    // We use the same formula that is used to find a point of a circumference
    double rX = Math.cos(degree);
    double rZ = Math.sin(degree);
    // New point
    double pX = x + rX;
    double pY = y + rY;
    double pZ = z + rZ;

    if (degree > 2D * Math.PI) {
        degree = 0D;
    } else {
        degree = degree + 0.2D;
    }
    if (pY > 2D) {
        pY = 0D;
    } else {
        pY = pY + 0.02D;
    }
}

于 2015-01-29T14:27:34.483 回答