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