কীভাবে আমার কোয়ার্টারিয়ন-ব্যবহার করে এফপিএস ক্যামেরাটি ঝুঁকতে এবং গোলযোগ থেকে রক্ষা করতে হবে?


17

আমি একটি এফপিএস-এর মতো ক্যামেরা ব্যবহার করছি এবং এটি কোয়ার্টারিয়ন ব্যবহার করে। তবে, যখনই আমি উপরে ও দিকে তাকানোর চেষ্টা করি তখন এটি কাত হয়ে যায় এবং কখনও কখনও এটি উল্টে যেতে পারে। আমি এটা কিভাবে ঠিক করবো?


3
(7 ঘন্টার মধ্যে স্ব-জবাব দেবে) ...
এওডেন

উত্তর:


16

আপনি আপনার চৌবাচ্চাটি ইয়া / পিচ / রোলের কোণে বিভক্ত করতে পারেন তবে এটি সাধারণত ওভারকিল।

আপনার চতুর্ভুজগুলি এভাবে রচনা করার পরিবর্তে:

cameraOrientation = cameraOrientation * framePitch * frameYaw;

এটা চেষ্টা কর:

cameraOrientation = framePitch * cameraOrientation * frameYaw;

এরপরে এটি কখনও iltালু / রোল উত্পন্ন করে না এবং ইয়াও এবং পিচ পৃথকভাবে সঞ্চয় করার সমতুল্য


3
এই. আমি ঠিক এটিই খুঁজছিলাম। ওয়ান-লাইনারে আমার সমস্যা সমাধান করুন। নিস!
aardvarkk

1
হয় framePitchএবং frameYaw floatধরনের? এছাড়াও, আমি আপনার প্রথম বাক্যে কিছু স্পষ্টতার জন্য কৃতজ্ঞ হব।
sirank

1
@ সিরডাঙ্ক cameraOrientation, framePitchএবং frameYawসমস্ত কোয়ার্টারিয়ন (প্রতিটি চৌম্বকটি 4 টি ফ্লোট বা ডাবল)।
ড্যান

8

এটি আমার কিছু সময়ের জন্য সমস্যা ছিল এবং এর কোনও উত্তর আমি খুঁজে পাইনি, তাই আমি ভেবেছিলাম আমি এটি এখানে পোস্ট করব।

এটা আসলে বেশ সহজ। আপনি কীভাবে ঘোরানগুলি সম্ভবত করছেন তা হ'ল:

currentDirection * newRotation;

তবে, এটি এরকমভাবে করা কোনওভাবেই কাজ করে না।

newRotation * currentDirection;

আপনাকে যা করতে হবে তা হ'ল এটি প্রথম এবং ক্রমটি নীচে ঘোরানোর জন্য এবং দ্বিতীয় ক্রমে পাশের আবর্তনের জন্য।

আমার জন্য, এটি এমন ছিল:

        if (keyboard.IsKeyDown(Keys.Up))
            Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
        if (keyboard.IsKeyDown(Keys.Down))
            Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
        if (keyboard.IsKeyDown(Keys.Left))
            Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
        if (keyboard.IsKeyDown(Keys.Right))
            Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;

একটি কারণের জন্য, প্রথম উপায়ে বর্তমান পাশের দিকের সাথে ঘোরানো ঘূর্ণন রয়েছে যা আপনি উপরে এবং নীচের জন্য চান তবে আপনি চান না যে পাশের পাশের আবর্তনের জন্য, দ্বিতীয় কারণটি প্রয়োজন।


আমার নিজের উত্তর দেওয়ার জন্য আমাকে 7 ঘন্টা অপেক্ষা করতে হয়েছিল ...
এওডেন

দুঃখিত, আপনি কিছু স্ক্রিনশট দিয়ে এটি ব্যাখ্যা করতে পারেন? "প্রথম আদেশ" এবং "দ্বিতীয় আদেশ" কিছুটা বিভ্রান্তিকর - ধন্যবাদ!
আতাভ 32

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

ওহ, যদিও চতুর্দিকের বিন্দুটি হ'ল এটি জিম্বল লক এড়ায় এবং ঘূর্ণনগুলি সমস্তই স্বাধীন ছিল তবে আমি পাঠ্যপুস্তকটি ভুলভাবে লিখেছি। সুতরাং কেবল স্পষ্ট করে বলার জন্য, আপনি কি বলছেন যে আপনি যদি ঘূর্ণন ট্রান্সফর্মেশনগুলির ক্রমটি বিপরীত করেন, আপনি ক্যামেরাকে কাত করা থেকে আটকাতে পারবেন? অথবা আপনি ইয়াবা ঘোরানোর সময় ম্যানুয়ালি রোল এবং পিচ রূপান্তরগুলি 0 এ সেট করছেন?
আটভ 32

5

কোনও এফপিএস ক্যামেরার জন্য আপনি সাধারণত রোল চান না এবং +/- 90 ডিগ্রি পিচ সীমাবদ্ধ, সুতরাং আমি কেবল ইয়া এবং পিচ কোণ ব্যবহার করে বর্তমান অবস্থার উপর নজর রাখি। চতুষ্পদের পূর্ণ শক্তি এর জন্য সত্যই সহায়ক নয়।

আপনি যদি কোয়ার্টারিয়ন কীফ্রেম ইন্টারপোলেশন বা এ জাতীয় কিছু ব্যবহার করে এফপিএস ক্যামেরা এবং অ্যানিমেটেড ক্যামেরার মধ্যে রূপান্তর করতে চান তবে আপনি ইয়াও / পিচ কোণগুলিকে এবং কোয়ার্ট্রিয়নে রূপান্তর করতে পারেন।


0

আর একটি সহজ কৌশল হ'ল ক্যামেরাটি একটি গেমোবজেক্টে রাখা এবং ইয়া রোটেশনটি গেম অবজেক্টকে নিয়ন্ত্রণ করতে হবে, যখন শিশু ক্যামেরাটি পিচ স্থানাঙ্কগুলির সাথে কনফিগার করা হয়েছে:

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