ঘূর্ণন মিরর ঝাঁকুনি


9

আমি নিম্নলিখিত কোডটি ব্যবহার করে লক্ষ্য দেখার জন্য আমার গেমের চরিত্রটি ঘোরান:

        transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f)

নতুন লক্ষ্য দেওয়া হলে startQuaternion হ'ল চরিত্রের বর্তমান ঘূর্ণন।

লুক কিউটারিয়াননটি চরিত্রটির দিকে নজর দেওয়া উচিত এবং এটি এর মতো সেট করা থাকে:

    destinationVector = currentWaypoint.transform.position - transform.position;
    lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up);

TurnNormalizer কেবলমাত্র Time.deltaTimeবর্ধিত এবং turningSpeedএটি সম্পাদকে দেওয়া একটি স্থির মান।

সমস্যাটি হ'ল চরিত্রটি বেশিরভাগ সময় যেমন বদলে যায় সেদিকে 180 ডিগ্রি ঘনিয়ে যাওয়ার সময় সমস্যা হয়। তারপরে এটি ঘুরতে ঘুরতে এবং মিরর করে:

এখানে চিত্র বর্ণনা লিখুন

এই খারাপ চিত্রায়িত অক্ষরে অক্ষরটি (ডানদিকে) বাম দিকের বৃত্তের দিকে ঘুরতে শুরু করে। কেবল বাম বা ডানদিকে ঘোরার পরিবর্তে এটি "আয়না নৃত্য" শুরু করে:

  1. এটি নতুন মুখের দিকে ঘোরানো শুরু করে
  2. তারপরে এটি হঠাৎ একই কোণে অন্যদিকে স্ন্যাপ করে এবং ঘোরাতে থাকে

লক্ষ্যটির দিকে না তাকানো এটি এতক্ষণ এই "মিররিং" করে। এটি কি চতুষ্কোণ, স্লার্পিং / লার্পিং বা অন্য কিছু দিয়ে জিনিস?

এডিআইটি 1: স্পষ্টতই সমস্যাটি ঘোরানো থেকে উদ্ভূত হয় না। আরও সম্ভবত সমস্যাটি হ'ল চরিত্রটি ঘোরার সময় মুখের দিকে এগিয়ে যায়। কোণটি সীমিত করার সময়, মুখোমুখি এবং টার্গেটের মধ্যে, যখন চরিত্রটি চলার অনুমতি দেওয়া হয় তখন হ্রাস হয় এবং অনেক সময় ঝাঁকুনী / মিররিং ঘূর্ণন দূর হয়।

এটি অবশ্যই আরও প্রশ্ন উত্থাপন করে, কেন চরিত্রগুলি ইস্যু ছাড়াই একই সময়ে চলতে এবং ঘোরতে পারে না? আন্দোলনের জন্য ব্যবহৃত কোড:

transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);

'লুক কিউটার্নিয়ন' কি প্রতিটি ফ্রেম আপডেট করা হচ্ছে? যদি তাই হয়, তবে আমার অনুমান হবে যে কিছু ছোট সম্প্রচার নার্ভাসভাবে কেমন যেখানে খেলোয়াড় 'overshoots' বর্ণন-ঘূর্ণন এবং তাই চেহারায় নতুন দিক মাত্র চালু রয়েছে নেতৃস্থানীয় হয় অন্যান্য এর 'সরাসরি পিছনে' পাশ ... ।
স্টিভেন স্টাডনিকি

উত্তর:


5

3 ডি স্পেসে প্রতিটি অরিয়েন্টেশন 2 টি স্বতন্ত্র ইউনিট কোয়ার্টার্ন qএবং -q(উপাদান অনুসারে উপেক্ষিত q) দ্বারা প্রতিনিধিত্ব করা যেতে পারে । উদাহরণস্বরূপ 3x3 আইডেন্টিটি ম্যাট্রিক্সের দ্বারা প্রতিনিধিত্ব করা ওরিয়েন্টেশনটি I2 কোয়াটারিয়ন দ্বারা প্রতিনিধিত্ব করা যেতে পারে:

 q:  { 0,  0,  0},  1
-q:  {-0, -0, -0}, -1

উভয়ই 3 ডি স্পেসে একই অরিয়েন্টেশনকে উপস্থাপন করে, তাদের বিন্দুর পণ্যটি -1হুবস্থার বিপরীত দিকে ঠিক একে অপরকে অন্য গোলার্ধে শুয়ে রয়েছে।

যে ফলাফলটি আপনি পর্যবেক্ষণ করেন যখন স্ট্রিল্পটি ঘোরার জন্য আরও দীর্ঘ চাপ দেয়, যখন একই গোলার্ধে থাকে না এমন 2 কোয়ার্টেরিয়নের মধ্যে স্টার্পিং হয়। যদি এটি ঘটে থাকে তবে তাদেরকে স্টার্পিং করার আগে কেবল তাদের মধ্যে একটিটিকে তুচ্ছ করুন, তবে স্ট্রিল্পটি ছোট আর্কটি গ্রহণ করবে।

ডট পণ্য হ'ল এটি ঘটে কিনা তা সন্ধান করার একটি সহজ সরঞ্জাম। উভয় চতুর্ভুজগুলির বিন্দু পণ্য যদি এর চেয়ে কম হয় 0তবে তারা একই গোলার্ধে পড়ে না। সুতরাং যদি তাদের উভয়ের বিন্দু পণ্য কম হয় 0, তবে কেবল উপাদান অনুসারে এয়ার স্ট্র্যাপিংয়ের আগে অন্য চৌম্বকটিকে তুচ্ছ করুন।


আমি আশ্চর্য হয়েছি যদি আমি এটির চেষ্টা করেছিলাম ঠিকমতো আপনাকে বুঝতে পেরেছি if(Quaternion.Dot (lookQuaternion, startQuaternion) < 0) { startQuaternion = Quaternion.Inverse(startQuaternion); }তবে এটি সমস্যার সমাধান করেনি। দুর্বল ফর্ম্যাটিংয়ের জন্য দুঃখিত, আমি এই মন্তব্য বিভাগে কৃতজ্ঞ হতে পারি না।
এশা

প্রায়, তবে তা নয় Inverse, এটি এর চেয়ে আলাদা অপারেশন Negateif(Quaternion.Dot (lookQuaternion, q) < 0) { q.x = -q.x; q.y = -q.y; q.z = -q.z; q.w = -q.w; }আমি সি # ব্যবহার করি না, তবে নথির চেহারা থেকে মনে হয় আপনি সরাসরি নেগেট-ফাংশনটিও ব্যবহার করতে পারেন ।
মাইক সেমদার

if(Quaternion.Dot (lookQuaternion, startQuaternion) < 0) { startQuaternion = Quaternion.Negate(startQuaternion); }
মাইক সেমদার

আমি আশঙ্কা করছি এগুলি সমস্যার সমাধান করেনি। আমি প্রশ্ন আপডেট করেছি।
এশা

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

1

আচ্ছা আপনার সমস্যাটি হ'ল কারণ আপনার চতুষ্কোণগুলি তৈরি করে এমন দুটি ভেক্টর 180 ডিগ্রি তৈরি করে, তাই কোন প্রশ্নটি ফাঁসানোর সময় এটি প্রশ্ন করা উচিত যা এটি গ্রহণ করার কথা? উপরের চাপ বা নীচের এক ??

এটি মূলত মিররিংয়ের কারণ, যখনই আপনি কোণটি বজায় রাখার সময় প্রতিটি সময় ঘুরিয়ে ফেলছেন তখন এটি অন্য পথে চলছে।

এই লিঙ্ক অনুযায়ী ।

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

আপনার যা করা দরকার তা হ'ল আপনার প্রারম্ভিক চৌম্বকটি একটি মধ্যবর্তী চতুষ্কোণের সাথে বিভক্ত করা (কোন চাপটি নেওয়া উচিত তা নির্ধারণের জন্য) এবং যখন পৌঁছতে মধ্যবর্তী চৌম্বকটি ব্যবহার করে আসল লক্ষ্য চৌম্বকটি অবিরত রাখুন।


1

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

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

আমার সন্দেহ হয় যে আপনি যা দেখছেন তা মেরিডিয়ান - বা অন্য কথায়, দ্বিখণ্ডক খিলানের মধ্যে এই অস্থিরতার প্রকাশ। যখন চেহারা লক্ষ্যটি সরাসরি চরিত্রের পিছনে থাকে, তখন আপনার চরিত্রের অবস্থানের 'আউলার সংহতকরণ' এবং প্রথম দিকের ত্রুটির মতো চেহারা যেমন ফ্রেম-টু ফ্রেমের চেহারা বদলে দেয়, ততক্ষণ এগুলি বন্যতার দিকে নিয়ে যেতে চলেছে এক ফ্রেম থেকে পরের ফ্রেমে আলাদা আলাদা আলাদা চাপ তৈরি করা হয় এবং এটি সম্ভবত আপনি দেখতে পাচ্ছেন এমন 'স্ট্যাগার' বাড়ে।

যতদূর এর সাথে করণীয়, সবচেয়ে ভাল যে বিষয়টি মনে মনে আসে তা হ'ল প্রতিটি লক্ষ্যকে 'টার্গেট' বর্ণন দৃষ্টিকোণটি সংশোধন না করা; পরিবর্তে, একাধিক ফ্রেমের স্প্যানের জন্য একইটি ব্যবহার করুন, তারপরে একটি নতুনকে গণনা করুন এবং এটি বিভিন্ন ফ্রেমের জন্য ব্যবহার করুন need গতির দিক খুব আকস্মিকভাবে পরিবর্তিত হয় না।

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