В настоящее время я пытаюсь визуализировать здание в OpenGL ES 2 на Android. Когда я прокручиваю влево, вся сцена должна двигаться влево (то же самое с правым, нижним и верхним). Теперь, когда я поворачиваю модель на 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);
}
Как я могу повернуть вектор вокруг другого вектора на угол?