আপডেট এখানে ত্রুটিটি বেশ সহজ একটি ছিল। আমি একটি রেডিয়ান ডিগ্রি রূপান্তর মিস করেছি। আপনার অন্য কিছু সমস্যা হলে পুরো জিনিসটি পড়ার দরকার নেই।
আমি এ সম্পর্কে বেশ কয়েকটি টিউটোরিয়ালের দিকে নজর রেখেছিলাম এবং যখন আমি ভেবেছিলাম বুঝতে পেরেছি আমি একটি চতুর ভিত্তিক ক্যামেরাটি প্রয়োগ করার চেষ্টা করেছি। সমস্যাটি এটি প্রায় সঠিকভাবে ঘোরার পরে, সঠিকভাবে কাজ করে না। 10 ডিগ্রি এটি -10 ডিগ্রীতে ফিরে আসে। আমার কী ধারণা আছে জানি না। আমি ওপেনটিকে ব্যবহার করছি এবং এটি ইতিমধ্যে একটি কোয়ার্ট্রিয়ন ক্লাস রয়েছে। আমি ওপেনগল এর নূব, আমি মজা করার জন্য এটি করছি, এবং প্রকৃতপক্ষে কোয়ার্টেরিয়ানগুলি বুঝতে পারি না, তাই সম্ভবত আমি এখানে বোকা কিছু করছি। এখানে কিছু কোড রয়েছে: (আসলে কোনও ভিবো লোড এবং আঁকানো পদ্ধতি ব্যতীত প্রায় সমস্ত কোড (এটি একটি ওপেনটিকে নমুনা থেকে নেওয়া যা ভিবিও-গুলি দেখায়))
আমি একটি ভিউতে একটি কিউব লোড করি এবং ক্যামেরার জন্য চৌম্বকটি শুরু করি
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);
}
এখানে আমি শেষ রোটেশনের মানটি পেয়েছি এবং একটি নতুন চৌম্বক তৈরি করেছি যা কেবলমাত্র শেষ রোটেশনটিকে উপস্থাপন করে এবং ক্যামেরা কোয়ার্টেরিয়নের সাথে এটির গুণ করি। এর পরে আমি এটিকে অক্ষ-কোণে রূপান্তর করি যাতে ওপেনজিএল এটি ব্যবহার করতে পারে। (বেশ কয়েকটি অনলাইন কোয়ার্টারিয়ন টিউটোরিয়াল থেকে আমি এটি বুঝতে পেরেছি)
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 টি চিত্র দেওয়া হয়েছে: আমি কিছুক্ষণ ঘোরান এবং এ থেকে:
এটি এই মধ্যে লাফ দেয়
কোন সাহায্য প্রশংসা করা হয়।
আপডেট 1 : আমি এগুলিকে একটি স্ট্রাইটারে যুক্ত করি যা কোনও ফাইলে লেখেন:
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 লাইনে ঘনক্ষেত্রটি ডান থেকে বামে লাফ দেয়, যখন ক্যামেরোট্রোট.ওয়াই চিহ্নগুলি পরিবর্তন করে। আমি জানি না এটি স্বাভাবিক কিনা।
আপডেট 2 এখানে সম্পূর্ণ প্রকল্প।