计算圆上的点以进行3D旋转

时间:2015-07-13 14:12:59

标签: java 3d rotation geometry

所以我决定玩一些基本的3D。我想通过在屏幕上放置一个立方体并能够在所有方向上旋转这个立方体来启动它。我首先在x plane上旋转它。 我遇到的问题是立方体顶部和底部的两个点(即0-180º标记附近的点)比其他所有点都快。之后的更多解释。

public Integer[] circleMath(int rotation, int x_rot, Double main_x, Double main_z){
    Double d = Math.sqrt(Math.pow(100, 2) * 2); // Calculating diametre of circle. Ends up around 141

    int tx_rot = x_rot + rotation; // Each point has an offset in rotation from main cube, these are at intervals of 90ª
    boolean over = false; // For deciding if to use positive or negative result from sqr
    if (tx_rot >= 360){ tx_rot -= 360; } // This occurs when rotation offset is added
    if (tx_rot > 180){ tx_rot = 360 - tx_rot; over = true; } // Has gone past 180 degrees, use neg result from sqr

    Double z = (main_z - (tx_rot * d / 180) + (d/2)); // Explained below (1)
    Double x = (Math.sqrt(Math.pow(d / 2, 2) - Math.pow(z - main_z, 2))); // Uses x^2 + y^2 == r^2
    if (over){ x *= -1; } // Neg result

    // Returning values
    Integer ret[] = new Integer[2];
    ret[0] = (int) Math.round((x + main_x));
    ret[1] = (int) Math.round(z);
    return ret;

}

这是我用来计算各个区域的点数的函数。基本逻辑如下。

  1. 根据z(对象的旋转)计算x_rot
  2. 将其用作y值来查找x (x^2 + y^2 = r^2)
  3. 计算z包括将圆的直径除以180(180º),其余部分不言自明。

    以下是我录制的一些结果。

    tx_rot: 175 x: -23.240556292613196 z: -66.78230711206282
    tx_rot: 176 x: -20.846292265881893 z: -67.56798131338121
    tx_rot: 177 x: -18.104634152000347 z: -68.3536555146996
    tx_rot: 178 x: -14.824071182362571 z: -69.13932971601798
    tx_rot: 179 x: -10.511604404680254 z: -69.92500391733637
    tx_rot: 180 x: 0.0 z: -70.71067811865476
    

    您可以看到z不变为~0.7,但x似乎为exponential-ish。当tx_rot180时,z达到完美的半径,预计x将达到最低点。

    非常感谢任何有关x为何如此不一致的想法。

    如果您需要更多信息,请告诉我,我不知道出了什么问题

    旋转0º时的样子:)

0 个答案:

没有答案