Я использую JOGL для создания средства просмотра облаков точек и внедрил собственные средства управления орбитой.Некоторое время это работает очень хорошо, но в какой-то момент (я думаю, что после перетаскивания мыши влево и вправо очень быстро) сцена полностью исчезает.Вот мой код:
public void mouseDragged(MouseEvent e) {
if (oldX < 0.0005 && oldY < 0.0005) {
// when the mouse drag starts initially
oldX = e.getX();
oldY = e.getY();
} else {
float differenceX = e.getX() - oldX;
float differenceY = e.getY() - oldY;
oldX = e.getX();
oldY = e.getY();
float speedX = differenceX / 2;
float speedY = differenceY / 2;
Vector3f velocityX = new Vector3f();
Vector3f velocityY = new Vector3f();
Vector3f oldTarget = camera.getTarget();
Vector3f cameraRight = new Vector3f();
// getting right vector of the camera in the world space
camera.getDirection().cross(camera.getWorldUp(), cameraRight);
/* moving the camera first along its right vector
* then setting its target to what it was originally
* looking at */
cameraRight.mul(-speedX, velocityX);
camera.translate(velocityX);
camera.setTarget(oldTarget);
/* moving the camera second along its up vector
* then setting its target to what it was originally
* looking at */
camera.getUp().mul(-speedY, velocityY);
camera.translate(velocityY);
camera.setTarget(oldTarget);
}
}
Сначала я подумал, что это произойдет потому, что когда вектор направления камеры и вектор вверх совпадают, правый вектор камеры (перекрестное произведение между ними) будет равен нулю,но это будет означать, что органы управления потеряют одно измерение движения;это не должно привести к исчезновению всей сцены.