1

現在、Android の OpenGL ES 2 で建物を視覚化しようとしています。左にスワイプすると、シーン全体が左に移動するはずです (右、下、上と同じ)。モデルを 90° 回転させると、軸が入れ替わります。右にスワイプすると、モデルが右ではなく上に移動します (他の軸と同じ)。

シーンの現在の回転に問題を起こさずにカメラを移動するにはどうすればよいですか? 私は電話で作業しているので、常にスワイプしている方向にオブジェクトを移動したいと考えています。最初に翻訳を呼び出すと、翻訳は正常に機能しますが、回転にはいくつかのエラーがあります。

更新:ほと​​んどのカメラクラスを作成しました(回答で提案されています):

private Vector3D c = new Vector3D(eye); // copy of eye
private Vector3D l = Vector3D.getNormalized
        (Vector3D.subtract(center, eye)); // normalized center-eye
private Vector3D u = new Vector3D(up); // up (normalized)

public void rotateX(float angle) {
    // Now you can rotate L vector left and
    // right by rotating it around U by any angle. ??
}

public void rotateY(float angle) {
    // If you also need to look up and down
    // (rotate) you need to rotate both L and U around S ??
}

public void rotateZ(float angle) {
    // to tilt left and right you need to rotate U around L. ??
}

// move left and right
// C = C+S * inputfactor
public void translateX(float inputFactor) {
    Vector3D s = Vector3D.cross(l, u);
    Vector3D sTimesInput = mul(s, inputFactor);
    c = new Vector3D(c).add(sTimesInput);
}

// move forward and backward
// C = C+L*inputfactor
public void translateY(float inputFactor) {
    Vector3D lTimesInput = mul(l, inputFactor);
    c = new Vector3D(c).add(lTimesInput);
}

// move up and down
// C = C+U * inputfactor
public void translateZ(float inputFactor) {
    Vector3D uTimesInput = mul(u, inputFactor);
    c = new Vector3D(c).add(uTimesInput);
}

// reconstruct lookAt - eye,center,up

public Vector3D getEye() {
    return new Vector3D(c);
}

public Vector3D getCenter() {
    return new Vector3D(c).add(new Vector3D(l));
}

public Vector3D getUp() {
    return new Vector3D(u);
}

public float[] createLookAt() {
    Vector3D eye = getEye();
    Vector3D center = getCenter();
    Vector3D up = getUp();
    return new float[] { eye.getX(), eye.getY(), eye.getZ(), center.getX(),
            center.getY(), center.getZ(), up.getX(), up.getY(), up.getZ() };
}

// helper-function
public Vector3D mul(Vector3D vec, float factor) {
    return new Vector3D(vec.getX() * factor, vec.getY() * factor,
            vec.getZ() * factor);
}

ベクトルを別のベクトルの周りで角度だけ回転するにはどうすればよいですか?

4

2 に答える 2