Những gì bạn đang yêu cầu được gọi là xoay Arcball. Đệ tứ là giải pháp dễ dàng chỉ khi bạn hiểu cách chúng hoạt động. Bạn có thể đạt được điều tương tự mà không cần tứ phương.
Điều kiện tiên quyết
Bạn có biết làm thế nào để xoay đối tượng nói chung? Giả sử bạn có một đối tượng ở điểm gốc. Bạn có biết làm thế nào bạn xoay nó (gợi ý: nhân với một số ma trận xoay vòng)? Nếu có, thì tôi giả sử bạn biết điều gì sẽ xảy ra nếu bạn dịch đối tượng trước và sau đó xoay nó?
Bạn phải biết cách tính ma trận xoay từ trục góc (dễ như ăn bánh, nhìn vào vô số phương trình trực tuyến, rất nhiều trong số chúng cũng cung cấp cho bạn mã)
Dung dịch
- Đưa máy ảnh lên và vectơ phải . Lưu ý rằng chúng nên được chuẩn hóa.
- Lấy vector từ điểm lấy nét đến máy ảnh (camPocation - Lấy nét). Đây là vector mà bạn sẽ được quay. Hãy gọi đây là camF FocusVector .
- Quyết định mức độ bạn muốn xoay trong ngáp / cao độ so với máy ảnh
- Tạo hai ma trận quay. Ma trận xoay thứ 1 sẽ sử dụng góc lên của máy ảnh làm trục và góc ngáp mà bạn quyết định. Ma trận xoay 2 sẽ sử dụng đúng của máy ảnh như trục và sân góc mà bạn quyết định.
- Bây giờ xoay camF FocusVector với ma trận xoay mới. Đây là vị trí mới của máy ảnh của bạn so với nguồn gốc. Tất nhiên, chúng tôi muốn nó liên quan đến điểm tập trung ...
- Thêm vị trí điểm lấy nét vào camF FocusVector . Đây là vị trí mới của máy ảnh của bạn. Dịch máy ảnh của bạn cho phù hợp.
- Cuối cùng, yêu cầu máy ảnh lấy nét vào điểm lấy nét bằng cách gọi hàm lookAt () của bạn
Hãy cẩn thận
Bạn sẽ phải tìm kiếm một số trường hợp hoặc điểm kỳ dị mà máy ảnh của bạn sẽ ngừng hoạt động. Nhìn thẳng xuống / lên chẳng hạn. Tôi sẽ cho bạn tìm ra cách đối phó với những điều đó.
EDIT1: Cách tính toán lại các vectơ trực giao của máy ảnh
Bạn đã biết hướng của máy ảnh ((cameraPos - FocusPoint) .n normalize ()). Bây giờ giả sử rằng máy ảnh của bạn lên là + Y (hoặc w / e trục hiện tại của thế giới của bạn là ... điều đó tùy thuộc vào bạn). Bây giờ chỉ cần vượt qua hướng với lên để có được quyền . Làm xong? Không! Vector lên của bạn không còn trực giao với hai cái kia. Để khắc phục điều đó, chéo đúng với hướng và bạn nhận mới của bạn lên .
Lưu ý rằng Gram-Schmidt thực sự là thứ nên được sử dụng để chỉnh hình vectơ.
Một lần nữa, hãy lưu ý các cảnh báo vì điều này sẽ không hoạt động trong một số trường hợp ( ví dụ như hướng song song với hướng lên ).