Vì vậy, tôi hiện đang cố gắng tạo một hàm sẽ lấy hai điểm 3D A và B và cung cấp cho tôi một bậc bốn biểu thị góc quay cần thiết cho điểm A để "quan sát" điểm B (sao cho trục Z cục bộ của điểm A đi qua Điểm B , nếu bạn muốn).
Ban đầu tôi tìm thấybài đăng này , câu trả lời hàng đầu dường như đã cho tôi một điểm khởi đầu tốt. Tôi tiến hành đoạn mã sau; như câu trả lời ban đầu gợi ý, thay vì giả định hướng mặc định (0, 0, -1), tôi cố gắng trích xuất một vectơ đơn vị biểu thị hướng thực tế của máy ảnh.
void Camera::LookAt(sf::Vector3 Target)
{
///Bắt nguồn từ mã giả được tìm thấy ở đây:
///https://stackoverflow.com/questions/13014973/quaternion-rotate-to
// Lấy vectơ chuẩn hóa từ vị trí camera tới Target
sf::Vector3 VectorTo(Target.x - m_Position.x,
Target.y - m_Position.y,
Target.z - m_Position.z);
// Lấy độ dài của VectorTo
float VectorLength = sqrt(VectorTo.x*VectorTo.x +
VectorTo.y*VectorTo.y +
VectorTo.z*VectorTo.z);
//Bình thường hóa VectorTo
VectorTo.x /= VectorLength;
VectorTo.y /= VectorLength;
VectorTo.z /= VectorLength;
//Vectơ tiến thẳng
sf::Vector3 LocalVector = m_Orientation.MultVect(sf::Vector3(0, 0, -1));
// Lấy tích chéo làm trục quay
sf::Vector3 Axis(VectorTo.y*LocalVector.z - VectorTo.z*LocalVector.y,
VectorTo.z*LocalVector.x - VectorTo.x*LocalVector.z,
VectorTo.x*LocalVector.y - VectorTo.y*LocalVector.x);
//Lấy tích chấm để tìm góc
Góc float = acos(VectorTo.x*LocalVector.x +
VectorTo.y*LocalVector.y +
VectorTo.z*LocalVector.z);
//Xác định góc có dương hay không
//Lấy tích chéo của trục và vectơ cục bộ
sf::Vector3 ThirdVect(Axis.y*LocalVector.z - Axis.z*LocalVector.y,
Axis.z*LocalVector.x - Axis.x*LocalVector.z,
Axis.x*LocalVector.y - Axis.y*LocalVector.x);
// Nếu tích vô hướng của cái đó và vectơ cục bộ âm thì góc cũng âm
if (ThirdVect.x*VectorTo.x + ThirdVect.y*VectorTo.y + ThirdVect.z*VectorTo.z < 0)
{
Góc = -Góc;
}
//Cuối cùng, tạo một quaternion
Góc trục Đệ tứ;
AxisAngle.FromAxisAngle(Angle, Axis.x, Axis.y, Axis.z);
// Và nhân nó theo hướng hiện tại
m_Orientation = Góc trục * m_Orientation;
}
cái nàyhầu hếtcó hiệu quả. Điều xảy ra là máy ảnh dường như xoay một nửa khoảng cách về phía điểm mục tiêu. Nếu tôi cố gắng xoay lại, nó sẽ thực hiện một nửa số vòng quay còn lại, lặp đi lặp lại vô tận để nếu tôi giữ "Nút nhìn", hướng của máy ảnh ngày càng gần hơn để nhìn thẳng vào mục tiêu, nhưng nó cũng tiếp tục chậm lại nó giảm tốc độ quay để nó không bao giờ完全Đến đó.
Lưu ý rằng tôi không muốn sử dụng gluLookAt() vì cuối cùng tôi cũng cần mã này để hướng các đối tượng không phải là máy ảnh vào nhau và các đối tượng của tôi đã sử dụng quaternions để định hướng. Ví dụ: tôi có thể muốn tạo một nhãn cầu theo dõi vị trí của một vật thể đang chuyển động phía trước nó hoặc một viên đạn cập nhật hướng của nó để tìm mục tiêu.
trước khi chuyển nó tới TừAxisGóc
Bình thường hóa trước Trục
vectơ.
Tôi là một lập trình viên xuất sắc, rất giỏi!