আমি কীভাবে চতুর্ভুজ ভিত্তিক ক্যামেরাটি প্রয়োগ করব?


14

আপডেট এখানে ত্রুটিটি বেশ সহজ একটি ছিল। আমি একটি রেডিয়ান ডিগ্রি রূপান্তর মিস করেছি। আপনার অন্য কিছু সমস্যা হলে পুরো জিনিসটি পড়ার দরকার নেই।

আমি এ সম্পর্কে বেশ কয়েকটি টিউটোরিয়ালের দিকে নজর রেখেছিলাম এবং যখন আমি ভেবেছিলাম বুঝতে পেরেছি আমি একটি চতুর ভিত্তিক ক্যামেরাটি প্রয়োগ করার চেষ্টা করেছি। সমস্যাটি এটি প্রায় সঠিকভাবে ঘোরার পরে, সঠিকভাবে কাজ করে না। 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 এখানে সম্পূর্ণ প্রকল্প।


2
আমি সমস্যা বুঝতে পারি না। আপনি যে রৌদ্রাগুলি রেন্ডার করতে ব্যবহার করছেন তা কি মুদ্রণের চেষ্টা করেছেন?
নিকল বোলাস

1
সম্মত হন, আপনার rx, ry এবং Quaternion মানগুলি ডিবাগ করুন।
মিথ্যাচারিত ক্যাভিয়ার

আপনি কেন নিজের পুরো প্রকল্পটি কোথাও র‌্যাপিডশেয়ারে আপলোড করবেন না? আরও সহজ হবে।
বোবোবোবো

ঠিক আছে আমি ঘরে এলে এটি আপলোড করব।
gyozo kudor

উত্তর:


9

আপনি এখানে আমার অনুমান যাচাই করার জন্য প্রয়োজনীয় কোডটি প্রদর্শন করেন নি, আমি প্রায় গ্যারান্টি দিতে পারি যে আপনার সমস্যাটি আসলে এই লাইনটি:

cameraRot.ToAxisAngle(out axis, out angle);

রেডিয়ানগুলিতে প্রকাশিত একটি কোণ মান ফিরিয়ে দিচ্ছে , যখন

GL.Rotate(angle, axis);

চায় কোণ প্রদান করা থেকে ডিগ্রী

এটির সমাধানের জন্য, আপনাকে GL.Rotate () এ পাস করার সময় কোণ মানের রূপান্তর করতে হবে:

GL.Rotate(angle * 180.0/3.141593, axis);

হ্যাঁ, সমস্যা ছিল। :) অনেক ধন্যবাদ. আমি জানতাম ওপেনগল ডিগ্রি প্রত্যাশা করে, আমি ধরে নিয়েছিলাম যে টোঅ্যাক্সিস্যাঙ্গেল ডিগ্রি ফেরত দেয়। আমি কেবল ওপেনটকের কোডটি দেখেছি এবং এটি রেডিয়ান। বিটিডাব্লু আমি শেষে সম্পূর্ণ উত্স কোড সরবরাহ করেছি।
gyozo kudor

@ নিকক্যাপলিংগার সঠিকভাবে উল্লেখ করেছেন যে সি # তে একটি Math.Piধ্রুবক উপলব্ধ রয়েছে, যা চূড়ান্ত 3.141593 মানের ক্ষেত্রে আমি চূড়ান্ত গণনায় ব্যবহার করেছি।
ট্রেভর পাওয়েল

1

না। মনে হতে পারে এমন একটি ক্যামেরা থাকা কম কাজ হবে যা অন্যান্য দৃশ্যের জিনিসগুলির মতো চালিত হতে পারে তবে দীর্ঘমেয়াদে একটি ক্যামেরা থাকা ভাল যেখানে আপনি কোনও অবস্থান, চোখের দিক এবং ভেক্টর সংজ্ঞায়িত করতে পারবেন। বিশেষত আপনি যখন মোশন মডেলগুলি প্রোগ্রামিং শুরু করেন তখন কোয়ার্টেরিনগুলির সাথে কাজ করা সত্যিই একটি ব্যথা।


1
একমত। আমার অ্যাপ্লিকেশনগুলি ডিজাইনের পদ্ধতিতে যদি এটি "উচ্চারণ করা শক্ত হয় তবে অবশ্যই এটি আরও ভাল") এর আমি অনুরাগী নই
প্যাট্রিক হিউজেস

কোয়ার্টারিয়ন উচ্চারণ কঠিন?
notlesh

1
একটু রসিকতা অনেকটা এগিয়ে যায় = ডি ইনফারেন্স দিয়ে আমি বুঝিয়েছি যে প্রশ্নটি এমন একজনের কাছ থেকে এসেছে যার ধারণা নেই কেন সে কোয়ার্ট্রিন ক্যামেরা চায়, কেবল এটি একটি ঝরঝরে বাজওয়ার্ড এবং ওএমজি চাই এটা এখন খুব খারাপ! উপরের ভাঙা কোডে রেডিয়ানস এবং ডিগ্রি প্যারামিটারগুলি সঠিকভাবে পরিচালনা করার মতো কোনও জিনিস সঠিকভাবে মোকাবেলা করা হয় না এটি অবশ্যই মোকাবিলার বিষয় নয়।
প্যাট্রিক হিউজেস

3
এই প্রশ্নটি আসলে ক্যামেরা সম্পর্কে নয়; এটি কীভাবে গেম কোডে আবর্তন উপস্থাপন করতে পারে এবং কীভাবে ওপেনজিএল সেগুলি ব্যবহার করতে পারে সেই গেম উপস্থাপনাগুলিকে এমন রূপে রূপান্তর করতে পারে। এটি পুরোপুরি বৈধ প্রশ্ন, এবং আমি মনে করি না যে ওপির ডোমেনের অভিজ্ঞতার অভাবকে উপহাস করা কোনওভাবেই সহায়ক। এটি ওপি একটি বোকা ভুল করেছে এমন নয়; কোণ প্রকাশ করার সময় ওপেনজিএল ডিগ্রি ব্যবহারের জেদ নিখরচায় উদ্ভট। ওপেনজিএল ব্যবহার করে প্রত্যেকে প্রথমবার এই ভুলটি করে। আপনার উচ্চ ঘোড়া থেকে নেমে যাও, মানুষ। গীজ।
ট্রেভর পাওয়েল

আমি কেবল বুঝতে চাইছিলাম যে কীভাবে একটি চতুর্ভুজ ভিত্তিক ক্যামেরাটি কাজ করে এবং এমন একদিনে আমি এই প্রকল্পটি তৈরি করেছিলাম যখন আমার আর কিছু করার ছিল না। এটি নিয়ে আমার কোনও বাস্তব পরিকল্পনা নেই।
gyozo kudor

0

ওপেনটকে ইন্টার্নাল সম্পর্কে বেশি কিছু জানেন না। আমার অভিজ্ঞতায় আমি কোটটির যথাযথ প্রয়োগের সাথে গণিতের গ্রন্থাগারটি দেখতে পাই নি যা প্রয়োজনীয় নির্ভুলতা (মেশিন) রাখে, কারণ এগুলির সমস্ত ই ^ 2-ই ^ 3 ত্রুটিগুলিকে প্রভাবিত করে। সুতরাং আপনি যে প্রভাবটি দেখছেন: যথার্থতা (এবং এপসিলন মান) প্রায় 10 ^ -5 হয় এবং এটি শূন্যের কাছাকাছি 'লাফিয়ে' যায়। এটি আমার অনুমান :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.