আমার প্রথম ব্যক্তির ক্যামেরা কীভাবে প্রয়োগ করা উচিত?


12

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

আমি যে কোনও ক্যামেরা ক্লাস ব্যবহার করতে পারি বা কোনও দরকারী কোডের দিকে কেউ আমাকে নির্দেশ করতে পারে?


উত্তর:


7

ক্যামেরা রোটেশন (মাউসলুক) সম্পর্কিত কয়েকটি টিপস এখানে দেওয়া হল। স্ক্র্যাচ থেকে সার্থকভাবে একটি ক্যামেরা ক্লাস প্রয়োগ করার পরে, আমি দেখতে পেলাম যে ভাল ঘূর্ণায়মান আচরণের জন্য আমাকে কয়েকটি অতিরিক্ত টুইট করতে হয়েছিল:

  1. মাউস স্থানাঙ্কগুলি প্রতিটি ফ্রেমের সেন্টার-অফ-স্ক্রিনে রিসেট করুন, যাতে মাউসটি কখনই স্ক্রিনের সীমানায় না যায়

  2. ক্যামেরার "আপ" ভেক্টর বজায় রাখুন (রোল বাতিল করবেন না) এবং "পাশের রাস্তা" ভেক্টরকে পুনরুদ্ধার করুন

  3. উল্লম্ব + y অক্ষের অতীত বা-অক্ষের অতীত (খুব দূরে / নিচে) থেকে সন্ধান করার অনুমতি দিন

  4. আবর্তনের ক্রমটি সঠিক পান (প্রথমে উপরে / নিচে, তারপরে বাম / ডান)

  5. প্রতিটি ফ্রেমের "আপ", "লক্ষ্য" এবং "পাশের দিকে" ভেক্টরকে নতুন করে তৈরি করুন

আশা করি আপনি এই কোডটির কিছুটি আপনার সুবিধার জন্য ব্যবহার করতে পারেন:

    const int mouseDeltaX = mouseAxisX * (input.GetMouseX() - int(app.GetWidth()/2));
    const int mouseDeltaY = -mouseAxisY * (input.GetMouseY() - int(app.GetHeight()/2));  // mouse y-offsets are upside-down!

    // HACK:  reset the cursor pos.:
    app.SetCursorPosition(app.GetWidth()/2, app.GetHeight()/2);

    float lookRightRads = mouseDeltaX * CAMERA_ANGULAR_SPEED_DEG * DEG_TO_RAD;
    float lookUpRads    = mouseDeltaY * CAMERA_ANGULAR_SPEED_DEG * DEG_TO_RAD;

    // Limit the aim vector in such a way that the 'up' vector never drops below the horizon:
    static const float zenithMinDeclination = DEG_TO_RAD * MIN_UPWARDS_TILT_DEG;
    static const float zenithMaxDeclination = DEG_TO_RAD * (180.0f - MIN_UPWARDS_TILT_DEG);

    const float currentDeclination = std::acosf(camera.aim_.y_);  ///< declination from vertical y-axis
    const float requestedDeclination = currentDeclination - lookUpRads;

    // Clamp the up/down rotation to at most the min/max zenith:
    if(requestedDeclination < zenithMinDeclination)
        lookUpRads = currentDeclination - zenithMinDeclination;
    else if(requestedDeclination > zenithMaxDeclination)
        lookUpRads = currentDeclination - zenithMaxDeclination;

    // Rotate both the "aim" vector and the "up" vector ccw by 
    // lookUpRads radians within their common plane -- which should 
    // also contain the y-axis:  (i.e. no diagonal tilt allowed!)
    camera.aim_.rotateAboutAxis(camera.right_, lookUpRads);
    camera.up_.rotateAboutAxis(camera.right_, lookUpRads);
    ASSERT_ORTHONORMAL(camera.aim_, camera.up_, camera.right_);

    // Rotate both the "aim" and the "up" vector ccw about the vertical y-axis:
    // (again, this keeps the y-axis in their common plane, and disallows diagonal tilt)
    camera.aim_.rotateAboutAxis(Y_AXIS, -lookRightRads);
    camera.up_.rotateAboutAxis(Y_AXIS, -lookRightRads);
    camera.updateRightAxis();

মনে রাখবেন যে:

মাউসএক্সিসএক্স এবং মাউস অ্যাক্সিসিওয়াকে +/- 1 হিসাবে সংজ্ঞায়িত করা হয়েছে, আপনি x বা y অক্ষটি মাউসলুক উল্টা করতে চান তার উপর নির্ভর করে। সাধারণত গেমস কমপক্ষে উল্লম্ব অক্ষের জন্য এই বিকল্পটি সরবরাহ করে।

এমএইচপিওয়ার্ডস_আইপিএলডিডিইজি ১.০ ডিগ্রি হিসাবে সংজ্ঞায়িত হয়েছে (সুতরাং দর্শকের উপরে -৯৯ ডিগ্রি থেকে নীচে +৯৯ ডিগ্রি পর্যন্ত দেখার অনুমতি দেওয়া হয়েছে, যা দেখতে পুরোপুরি দৃ 180়তার সাথে পুরো 180 ডিগ্রি উল্লম্ব পরিসরের মতো দেখায় - চূড়ান্ত স্থানে 2 ডিগ্রি অনুপস্থিত বেশ নগণ্য) ।

ক্যামেরা.এইম_, ক্যামেরা.সাইট_, এবং ক্যামেরা.আপ_ অবশ্যই 3 ডি ভেক্টর এবং রোটেট আউটআউটঅ্যাক্সিস () পদ্ধতিটি আপনি উইকিপিডিয়া এবং যে কোনও অনলাইন উত্স থেকে একসাথে কোবল করতে পারেন। Y_AXIS একটি স্থির ধ্রুবক (0,1,0) ভেক্টর।

ASSERT_ORTHONORMAL () একটি ডিবাগ-মোড-কেবল স্যানিটি চেক, যা কখনই অনুকূলিত / রিলিজ মোডে সংকলিত হয় না।

সি-স্টাইল কোডের জন্য আগাম ক্ষমা চাই ... তারপরে আবার এখানে আপনি মেডিওক্রিটাস নামের একজনের কাছ থেকে পরামর্শ নিচ্ছেন! ; ^)


আপনি কি বিষয়ে কথা হয়? সি-স্টাইলের কোড হ্যাকার স্পিরিটের মূল ভিত্তি! 8-)
1313 অনন্তকাল re

5

সেখানে (টিউটোরিয়াল দেখুন এই সম্পর্কে যাচ্ছে বিভিন্ন উপায় আছে এখানে , এখানে এবং এখানে Google এর মাধ্যমে ইন্টারনেটে আরো প্রাপ্তিসাধ্য উদাহরণস্বরূপ, প্রচুর সহ)। অনলাইনে আপনি যে সংস্থানগুলি খুঁজে পেতে পারেন সেগুলিতে ব্যবহৃত প্রযুক্তিটি কিছুটা পৃথক হতে পারে (ডি 3 ডি, এক্সএনএ, ওপেনজিএল, এবং অন্যদিকে) তবে অন্তর্নিহিত নীতিগুলি একই হতে চলেছে:

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

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


2

ডাইরেক্ট 3 ডি ব্যবহার করে ক্যামেরা সিস্টেমের প্রয়োগের একটি নির্দিষ্ট রেফারেন্সের জন্য, আমি এই নিবন্ধটি সুপারিশ করছি: http://www.toymaker.info/Games/html/camera.html । লেখক অন্যান্য পদ্ধতি এবং বৈশিষ্ট্যগুলিও বর্ণনা করেছেন যা প্রয়োগের ক্ষেত্রে প্রসারিত করতে ব্যবহৃত হতে পারে।

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