CẬP NHẬT Lỗi ở đây là một lỗi khá đơn giản. Tôi đã bỏ lỡ một radian để chuyển đổi độ. Không cần phải đọc toàn bộ nếu bạn có một số vấn đề khác.
Tôi đã xem xét một số hướng dẫn về điều này và khi tôi nghĩ rằng tôi hiểu tôi đã cố gắng thực hiện một máy ảnh dựa trên tứ phương. Vấn đề là nó không hoạt động chính xác, sau khi xoay khoảng. 10 độ nó nhảy trở lại -10 độ. Tôi không biết có chuyện gì. Tôi đang sử dụng openTK và nó đã có một lớp bậc bốn. Tôi là một người không biết gì về opengl, tôi làm việc này chỉ để giải trí và không thực sự hiểu được các mối quan hệ, vì vậy có lẽ tôi đang làm điều gì đó ngu ngốc ở đây. Đây là một số mã: (Trên thực tế hầu như tất cả các mã ngoại trừ các phương thức tải và vẽ vbo (nó được lấy từ một mẫu OpenTK thể hiện vbo-s))
Tôi tải một khối lập phương vào một vbo và khởi tạo bộ tứ cho máy ảnh
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
cameraPos = new Vector3(0, 0, 7);
cameraRot = Quaternion.FromAxisAngle(new Vector3(0,0,-1), 0);
GL.ClearColor(System.Drawing.Color.MidnightBlue);
GL.Enable(EnableCap.DepthTest);
vbo = LoadVBO(CubeVertices, CubeElements);
}
Tôi tải một hình chiếu phối cảnh ở đây. Điều này được tải ở đầu và mỗi khi tôi thay đổi kích thước cửa sổ.
protected override void OnResize(EventArgs e) {
base.OnResize(e);
GL.Viewport(0, 0, Width, Height);
float aspect_ratio = Width / (float)Height;
Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspect_ratio, 1, 64);
GL.MatrixMode(MatrixMode.Projection);
GL.LoadMatrix(ref perpective);
}
Ở đây tôi nhận được giá trị xoay cuối cùng và tạo ra một phần tư mới chỉ đại diện cho phần xoay cuối cùng và nhân nó với phần tư của máy ảnh. Sau đó, tôi chuyển đổi nó thành góc trục để opengl có thể sử dụng nó. (Đây là cách tôi hiểu nó từ một số hướng dẫn tứ phương trực tuyến)
protected override void OnRenderFrame(FrameEventArgs e) {
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
double speed = 1;
double rx = 0, ry = 0;
if (Keyboard[Key.A]) {
ry = -speed * e.Time;
}
if (Keyboard[Key.D]) {
ry = +speed * e.Time;
}
if (Keyboard[Key.W]) {
rx = +speed * e.Time;
}
if (Keyboard[Key.S]) {
rx = -speed * e.Time;
}
Quaternion tmpQuat = Quaternion.FromAxisAngle(new Vector3(0,1,0), (float)ry);
cameraRot = tmpQuat * cameraRot;
cameraRot.Normalize();
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
Vector3 axis;
float angle;
cameraRot.ToAxisAngle(out axis, out angle);
//////////////////////////////////////////////////////////////////////
// THIS IS WHAT I DID WRONG: I NEED TO CONVERT FROM RADIANS TO DEGREES
//////////////////////////////////////////////////////////////////////
//BEFORE
//GL.Rotate(angle, axis);
//AFTER
GL.Rotate(angle * (float)180.0/(float)Math.PI, axis);
GL.Translate(-cameraPos);
Draw(vbo);
SwapBuffers();
}
Dưới đây là 2 hình ảnh để giải thích rõ hơn: Tôi xoay một lúc và từ đây:
nó nhảy vào đây
Bất kỳ trợ giúp được đánh giá cao.
Update1 : Tôi thêm những thứ này vào một streamwriter ghi vào một tệp:
sw.WriteLine("camerarot: X:{0} Y:{1} Z:{2} W:{3} L:{4}", cameraRot.X, cameraRot.Y, cameraRot.Z, cameraRot.W, cameraRot.Length);
sw.WriteLine("ry: {0}", ry);
Nhật ký có sẵn ở đây: http://www.pasteall.org/26133/text . Tại dòng 770, khối lập phương nhảy từ phải sang trái, khi người quay phim.Y thay đổi dấu hiệu. Tôi không biết nếu điều này là bình thường.
Update2 Đây là dự án hoàn chỉnh.