अद्यतन यहाँ त्रुटि एक बहुत आसान था। मैंने एक रेडियन को डिग्री रूपांतरण में याद किया है। अगर आपको कोई और समस्या है तो पूरी बात पढ़ने की ज़रूरत नहीं है।
मैंने इस बारे में कई ट्यूटोरियल देखे और जब मुझे लगा कि मैं समझ गया हूं कि मैंने एक चतुष्कोणीय आधारित कैमरा लागू करने की कोशिश की है। समस्या यह है कि यह सही ढंग से काम नहीं करता है, लगभग घूमने के बाद। 10 डिग्री यह वापस -10 डिग्री तक कूदता है। मुझे नहीं पता कि क्या गलत है। मैं OpenTK का उपयोग कर रहा हूं और इसमें पहले से ही एक चतुष्कोणीय वर्ग है। मैं opengl में एक noob हूँ, मैं यह सिर्फ मनोरंजन के लिए कर रहा हूँ, और वास्तव में 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);
}
यहां मुझे अंतिम रोटेशन वैल्यू मिलती है और एक नया क्वाटर्नियन बनाता है जो केवल अंतिम रोटेशन का प्रतिनिधित्व करता है और इसे कैमरा क्वाटरनियन से गुणा करता है। इसके बाद मैंने इसे एक्सिस-एंगल में बदल दिया ताकि ऑपनेंग इसका इस्तेमाल कर सके। (यह है कि मैं इसे कई ऑनलाइन 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 के दशक में क्यूब दाईं से बाईं ओर उछलता है, जब कैमराट्रॉट। मैं संकेत बदलता है। मुझे नहीं पता कि क्या यह सामान्य है।
Update2 यहाँ पूरी परियोजना है।