0

ワールド空間でカメラを翻訳したかった。思うように動かない。私のアルゴリズムは

  1. 最初に、ビュー スペースでカメラを移動します。カメラは常に (0,0,0) にあります。ビュースペースで新しいカメラの位置ポイントを計算した後、そのポイントに逆ビュー行列を掛けると、ワールド空間でカメラの位置を取得できると思いました。

  2. 次に、新しいビュー マトリックスを計算します。次に、OpenGL の setLookAtM 関数を使用してビュー マトリックスを計算します。新しいビューマトリックスを設定します。

しかし、私の問題は、新しい場所を計算できなかったことです。その値はNANです

ここに私のコードがあります。

private void pivotRotation(double angle,int[] pivot, double distance){
    float[] temp = new float[4];
    float[] temp2 = new float[4];

    float[] extObj = new float[16];     
    float[] startPointsOnViewSpace = new float[4];
    float[] newEyeOrigin = new float[4];
    float[] newLookOrigin = new float[4];

    int[] viewport = new int[16];

    viewport[0] = 0;
    viewport[1] = 0;
    viewport[2] = (int)myRenderer.screenWidth;
    viewport[3] = (int)myRenderer.screenHeight;

    int[] newEye = new int[2];
    newEye[0] = (int)((pivot[0] + ((viewport[2]/2) - pivot[0]) * Math.cos(angle)  - ((viewport[3]/2) - pivot[1]) * Math.sin(angle)));
    newEye[1] = (int)((pivot[1] + ((viewport[2]/2) - pivot[0]) * Math.sin(angle)  + ((viewport[3]/2) - pivot[1]) * Math.cos(angle)));

    GLU.gluUnProject((float)newEye[0], (float)(viewport[3] - newEye[1]), 0.0f, myRenderer.modelViewMatrix, 0, myRenderer.projectionMatrix, 0, viewport, 0, extObj, 0);
    Matrix.multiplyMV(startPointsOnViewSpace, 0, myRenderer.modelViewMatrix, 0, extObj, 0);
            // new camera location in viewspace
    startPointsOnViewSpace[0] /= startPointsOnViewSpace[3]; 
    startPointsOnViewSpace[1] /= startPointsOnViewSpace[3];
    startPointsOnViewSpace[2] /= startPointsOnViewSpace[3];


    newEyeOrigin[0] = startPointsOnViewSpace[0];   
    newEyeOrigin[1] = startPointsOnViewSpace[1];
    newEyeOrigin[2] += distance / pinchParameter;
    newEyeOrigin[3] = 1.0f;

    newLookOrigin[0] = newEyeOrigin[0]; 
    newLookOrigin[1] = newEyeOrigin[1];
    newLookOrigin[2] = newEyeOrigin[2] - 1.0f;
    newLookOrigin[3] = 1.0f;
    // temp[0], temp[1], temp[2] are new camera location in the world space. i think
    Matrix.multiplyMV(temp, 0, myRenderer.inverseViewMatrix, 0, newEyeOrigin, 0);
    Matrix.multiplyMV(temp2, 0, myRenderer.inverseViewMatrix, 0, newLookOrigin, 0);
    for(int i = 0; i < 3; i++){
        myRenderer.eyeLocation[i] = temp[i];
        myRenderer.lookPosition[i] = temp2[i];
    }

    myRenderer.eyeSettings();
4

0 に答える 0