อัพเดทข้อผิดพลาดที่นี่เป็นเรื่องง่าย ฉันพลาดเรเดียนถึงการแปลงองศา ไม่จำเป็นต้องอ่านทุกอย่างถ้าคุณมีปัญหาอื่น
ฉันดูบทเรียนหลายอย่างเกี่ยวกับเรื่องนี้และเมื่อฉันคิดว่าฉันเข้าใจฉันพยายามที่จะใช้กล้องที่เป็น quaternion ปัญหาคือมันทำงานไม่ถูกต้องหลังจากหมุนไปประมาณ 10 องศากระโดดกลับไปที่ -10 องศา ฉันไม่รู้ว่าเกิดอะไรขึ้น ฉันใช้ openTK และมีคลาส quaternion อยู่แล้ว ฉันเป็น noob ที่ opengl ฉันกำลังทำเพื่อความสนุกและไม่เข้าใจ quaternions ดังนั้นฉันอาจจะทำอะไรโง่ ๆ ที่นี่ นี่คือรหัสบางส่วน: (จริงๆแล้วเกือบทั้งหมดรหัสยกเว้นวิธีการที่โหลดและวาด vbo (มันถูกนำมาจากตัวอย่าง OpenTK ที่แสดงให้เห็นถึง vbo-s))
ฉันโหลดลูกบาศก์ลงใน vbo และเริ่มต้น quaternion สำหรับกล้อง
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);
}
ฉันโหลดภาพมุมมองที่นี่ นี่เป็นจุดเริ่มต้นและทุกครั้งที่ฉันปรับขนาดหน้าต่าง
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);
}
ที่นี่ฉันจะได้รับค่าการหมุนครั้งสุดท้ายและสร้างควอเทอเนียนใหม่ที่แสดงเฉพาะการหมุนครั้งสุดท้ายและคูณมันด้วยควอเทอร์เนียนของกล้อง หลังจากนี้ฉันเปลี่ยนมันเป็นมุมแกนเพื่อให้ OpenGL สามารถใช้งานได้ (นี่คือวิธีที่ฉันเข้าใจจากบทเรียนออนไลน์ quaternion หลายบท)
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();
}
ต่อไปนี้เป็นภาพ 2 ภาพที่อธิบายได้ดีกว่า: ฉันหมุนไปซักพักแล้ว:
มันกระโดดเข้าไปในนี้
ความช่วยเหลือใด ๆ ที่ชื่นชม
Update1 : ฉันเพิ่มสิ่งเหล่านี้ลงในสตรีมที่เขียนลงไฟล์:
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);
เข้าสู่ระบบได้ที่นี่: http://www.pasteall.org/26133/text ที่บรรทัดที่ 770 คิวบ์จะกระโดดจากขวาไปซ้ายเมื่อคาเมอโรต์ Y เปลี่ยนสัญญาณ ฉันไม่รู้ว่านี่เป็นเรื่องปกติหรือไม่
Update2 นี่คือโครงการที่สมบูรณ์