আমি একটি বস্তুকে দুটি অক্ষে আবর্তন করছি, তবে এটি তৃতীয় অক্ষের চারপাশে ঘোরে কেন?


38

আমি দেখি যে প্রশ্নগুলি প্রায়শই আসে যাগুলির অন্তর্নিহিত সমস্যাটি থাকে তবে তারা সকলেই একটি প্রদত্ত বৈশিষ্ট্য বা সরঞ্জামের বিবরণে ধরা পড়ে। প্রচুর অ্যানিমেটেড উদাহরণ সহ - আমরা যখন এটি আসে তখন ব্যবহারকারীদের উল্লেখ করতে পারি একটি প্রচলিত উত্তর তৈরি করার চেষ্টা এখানে! :)


ধরা যাক আমরা প্রথম ব্যক্তির ক্যামেরা তৈরি করছি। মূল ধারণাটি হ'ল বাম এবং ডানদিকের দিকে তাকানো উচিত এবং নীচে এবং নীচের দিকে তাকানো উচিত। সুতরাং আমরা এর মতো কিছুটা কোড লিখি (asক্যকে উদাহরণ হিসাবে ব্যবহার করে):

void Update() {
    float speed = lookSpeed * Time.deltaTime;

    // Yaw around the y axis using the player's horizontal input.        
    transform.Rotate(0f, Input.GetAxis("Horizontal") * speed, 0f);

    // Pitch around the x axis using the player's vertical input.
    transform.Rotate(-Input.GetAxis("Vertical") * speed,  0f, 0f);
}

অথবা হতে পারে

// Construct a quaternion or a matrix representing incremental camera rotation.
Quaternion rotation = Quaternion.Euler(
                        -Input.GetAxis("Vertical") * speed,
                         Input.GetAxis("Horizontal") * speed,
                         0);

// Fold this change into the camera's current rotation.
transform.rotation *= rotation;

এবং এটি বেশিরভাগ ক্ষেত্রেই কাজ করে তবে সময়ের সাথে সাথে ভিউটি আঁকাবাঁকা হতে শুরু করে। ক্যামেরাটি তার রোল অক্ষটি (z) চালু করছে বলে মনে হচ্ছে যদিও আমরা কেবল এটি এক্স এবং ওয়াইয়ের উপর ঘোরানোর জন্য বলেছি!

পাশের দিকে প্রথম ব্যক্তির ক্যামেরা ঝুঁকির অ্যানিমেটেড উদাহরণ

যদি আমরা ক্যামেরার সামনে কোনও বস্তুটি চালিত করার চেষ্টা করি তবে এটিও ঘটতে পারে - বলুন এটি এমন একটি গ্লোব যা আমরা চারপাশে ঘুরে দেখতে চাই:

পাশের দিকে ঝুঁকছে এমন একটি গ্লোবের অ্যানিমেটেড উদাহরণ

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

অনেক ইঞ্জিনে আপনি এটি পরিদর্শকের মধ্যেও দেখতে পাবেন - পৃথিবীতে বস্তুটি ঘোরান, এবং হঠাৎ এমন একটি অক্ষরে সংখ্যা পরিবর্তন হয় যা আমরা এমনকি স্পর্শও করি নি!

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

তো, এটি কি ইঞ্জিন বাগ? আমরা কীভাবে প্রোগ্রামটিকে বলব যে আমরা এটির অতিরিক্ত আবর্তন যুক্ত করতে চাই না?

এটির কি অয়লার কোণগুলির সাথে কিছু করার আছে? আমি কি এর পরিবর্তে কোয়ার্টারিয়নস বা রোটেশন ম্যাট্রিক্স বা বেসিস ভেক্টর ব্যবহার করব?



1
আমি নীচের প্রশ্নের উত্তর খুব সহায়কও পেয়েছি। গেমদেব.স্ট্যাকেক্সেঞ্জার.কমিশন
ট্র্যাভিস পেট্রি

উত্তর:


51

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

ত্রিমাত্রিক স্থানে ঘূর্ণন কীভাবে কাজ করে সে সম্পর্কে আপনি একটি আসল সত্যটি আবিষ্কার করেছেন এবং অনুবাদ হিসাবে অন্যান্য রূপান্তরগুলি সম্পর্কে এটি আমাদের অন্তর্দৃষ্টি থেকে প্রস্থান করে:

অ্যানিমেটেড উদাহরণ দেখায় যে বিভিন্ন ক্রমে আবর্তন প্রয়োগ করা বিভিন্ন ফলাফল দেয়

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

সময়ের সাথে অক্ষের সম্পর্কের পরিবর্তনগুলি প্রতিটি অক্ষকে "অনুমিত" করা উচিত তা সম্পর্কে আমাদের স্বজ্ঞাকে বিভ্রান্ত করতে পারে। বিশেষত, ইয়াবা এবং পিচ ঘূর্ণনের নির্দিষ্ট সংমিশ্রণগুলি রোল রোটেশনের একই ফলাফল দেয়!

স্থানীয় পিচ-ইয়াও-পিচের অনুক্রম দেখানো অ্যানিমেটেড উদাহরণ একক স্থানীয় রোলের সমান আউটপুট দেয়

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

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

সুতরাং, আমরা এটি সম্পর্কে কি করব?

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

এখানে পিচ-ইয়াও-পিচের একই অনুক্রমটি যা উপরের উদাহরণে রোল হয়ে উঠেছে, তবে এখন আমরা আমাদের ইয়াজটিকে বস্তুর পরিবর্তে বিশ্বব্যাপী Y অক্ষের চারপাশে প্রয়োগ করি

কোনও রোল সমস্যা ছাড়াই স্থানীয় পিচ এবং গ্লোবাল ইওয়ের সাথে একটি মগ ঘুরানোর অ্যানিমেটেড উদাহরণগ্লোবাল ইও ব্যবহার করে প্রথম ব্যক্তি ক্যামেরার অ্যানিমেটেড উদাহরণ

সুতরাং আমরা "স্থানীয়ভাবে পিচ, বিশ্বব্যাপী ইয়াও" মন্ত্রটি দিয়ে প্রথম ব্যক্তির ক্যামেরাটি ঠিক করতে পারি:

void Update() {
    float speed = lookSpeed * Time.deltaTime;

    transform.Rotate(0f, Input.GetAxis("Horizontal") * speed, 0f, Space.World);
    transform.Rotate(-Input.GetAxis("Vertical") * speed,  0f, 0f, Space.Self);
}

যদি আপনি গুণগুলি ব্যবহার করে আপনার ঘূর্ণনগুলি মিশ্রণ করে থাকেন তবে একই প্রভাবটি পেতে আপনি কোনও একটিটির বাম / ডান ক্রমটি ফ্লিপ করতে চান:

// Yaw happens "over" the current rotation, in global coordinates.
Quaternion yaw = Quaternion.Euler(0f, Input.GetAxis("Horizontal") * speed, 0f);
transform.rotation =  yaw * transform.rotation; // yaw on the left.

// Pitch happens "under" the current rotation, in local coordinates.
Quaternion pitch = Quaternion.Euler(-Input.GetAxis("Vertical") * speed, 0f, 0f);
transform.rotation = transform.rotation * pitch; // pitch on the right.

(নির্দিষ্ট ক্রমটি আপনার পরিবেশে গুণমানের সম্মেলনের উপর নির্ভর করবে তবে বামে = আরও বেশি গ্লোবাল / ডান = আরও স্থানীয় একটি সাধারণ পছন্দ)

এটি নেট টোটাল ইয়াও এবং মোট পিচটি আপনি ভাসমান ভেরিয়েবল হিসাবে সংরক্ষণ করার সমান, তারপরে সর্বদা নেট ফলাফল একবারে প্রয়োগ করুন, এই কোণগুলি থেকে একা নতুন নতুন ওরিয়েন্টেশন কোয়ার্টেরিয়ন বা ম্যাট্রিক্স তৈরি করুন (আপনি যদি totalPitchক্ল্যাম্পড রাখেন তবে ):

// Construct a new orientation quaternion or matrix from Euler/Tait-Bryan angles.
var newRotation = Quaternion.Euler(totalPitch, totalYaw, 0f);
// Apply it to our object.
transform.rotation = newRotation;

বা সমতুল্য ...

// Form a view vector using total pitch & yaw as spherical coordinates.
Vector3 forward = new Vector3(
                    Mathf.cos(totalPitch) * Mathf.sin(totalYaw),
                    Mathf.sin(totalPitch),
                    Mathf.cos(totalPitch) * Mathf.cos(totalYaw));

// Construct an orientation or view matrix pointing in that direction.
var newRotation = Quaternion.LookRotation(forward, new Vector3(0, 1, 0));
// Apply it to our object.
transform.rotation = newRotation;

এই গ্লোবাল / স্থানীয় বিভাজনটি ব্যবহার করে, ঘূর্ণনগুলির একে অপরকে মিশ্রণ এবং প্রভাবিত করার কোনও সুযোগ নেই, কারণ সেগুলি অক্ষের স্বতন্ত্র সেটগুলিতে প্রয়োগ করা হয়।

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

আরও ভাল আচরণ করা ঘূর্ণন দেখানো একটি গ্লোবের অ্যানিমেটেড উদাহরণ

সীমাবদ্ধতা

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

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

উদাহরণস্বরূপ, আমরা আমাদের "ফরোয়ার্ড" ভেক্টরটি আপডেট করতে স্থানীয় ঘূর্ণনগুলি ব্যবহার করতে পারি, তারপরে আমাদের চূড়ান্ত ওরিয়েন্টেশনটি তৈরি করতে সেই ফরোয়ার্ড ভেক্টরকে "আপ" ভেক্টর সহ একসাথে ব্যবহার করতে পারি। (উদাহরণস্বরূপ, ইউনিটির কোয়ার্টারিওন.লুকরোটেশন পদ্ধতি ব্যবহার করে বা ম্যানুয়ালি এই ভেক্টরগুলি থেকে অর্থনরমাল ম্যাট্রিক্স তৈরি করে) আপ ভেক্টরটি নিয়ন্ত্রণ করে আমরা রোল বা মোড়কে নিয়ন্ত্রণ করি।

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


1
আমি জিজ্ঞাসা করতে পারি আপনি gifs কিভাবে তৈরি? তারা দেখতে সুন্দর লাগছে।
বিলিন্ট

1
@ বিলিন্ট আমি লিসেক্যাপ নামে একটি নিখরচায় প্রোগ্রাম ব্যবহার করি - এটি আপনাকে আপনার স্ক্রিনের একটি অংশ জিআইএফ রেকর্ড করতে দেয়। তারপরে আমি অ্যানিমেশনটি ছাঁটা / অতিরিক্ত ক্যাপশন পাঠ্য যুক্ত / ফটোশপ ব্যবহার করে জিএফ সংকোচিত করি।
ডিএমগ্রিগরি

এই উত্তরটি কি কেবল ityক্যের জন্য? ওয়েবে আরও জেনেরিক উত্তর আছে?
posfan12

2
@ পজফ্যান 12 উদাহরণ কোডটি সংহততার জন্য ityক্য সিনট্যাক্স ব্যবহার করে, তবে জড়িত পরিস্থিতি এবং গণিতটি বোর্ড জুড়ে সমানভাবে প্রয়োগ হয়। আপনার পরিবেশে উদাহরণগুলি প্রয়োগ করতে আপনার কোনও অসুবিধা হচ্ছে?
ডিএমগ্রিগরি

2
গণিতটি ইতিমধ্যে উপরে উপস্থিত রয়েছে। আপনার সম্পাদনা দ্বারা বিচার করা, আপনি কেবল এর ভুল অংশগুলি ম্যাসেজ করছেন। দেখে মনে হচ্ছে আপনি এখানে সংজ্ঞায়িত ভেক্টর প্রকার ব্যবহার করছেন । উপরের বর্ণনা অনুসারে কোণগুলির একটি সেট থেকে ঘূর্ণন ম্যাট্রিক্স নির্মাণের একটি পদ্ধতি অন্তর্ভুক্ত। একটি পরিচয় ম্যাট্রিক্স দিয়ে কল করুন এবং কল করুন TCVector::calcRotationMatrix(totalPitch, totalYaw, identity)- এটি উপরের "সমস্ত একবারে এলিউর" উদাহরণের সমান।
ডিএমগ্রিগরি

1

প্যারেন্টিং এবং রোটেশনের 16 ঘন্টা পরে LOL।

আমি কেবল কোডটি খালি রাখতে চেয়েছিলাম, মূলত, চেনাশোনাগুলিতে ঘুরিয়ে দেওয়া এবং সামনে ঘুরিয়ে দেওয়ার সাথে সাথে সামনের দিকে উল্টানো।

বা অন্য কথায়, লক্ষ্যটি হল রোলের কোনও প্রভাব ছাড়াই ইয়া এবং পিচটি ঘোরানো।

এখানে আসলে কয়েক জন যা আমার অ্যাপ্লিকেশনটিতে কাজ করেছিল

Unক্যে:

  1. একটি খালি তৈরি করুন। এটিকে ফরওয়্য বলুন।
  2. ফোরপাইচ নামে একটি শিশুকে খালি দিন।
  3. শেষ পর্যন্ত, একটি ঘনক তৈরি করুন এবং এটিকে z = 5 (এগিয়ে) এ সরান। এখন আমরা দেখতে পাচ্ছি যে আমরা কী এড়াতে চাইছি, যা ঘনকটি মোচড় দিবে (আমরা ইয়া ও পিচ করার সময় দুর্ঘটনাজনক "রোল")

এখন ভিজ্যুয়াল স্টুডিওতে স্ক্রিপ্টিং, আপনার সেটআপ করুন এবং আপডেটে এটি শেষ করুন:

objectForYaw.Rotate(objectForYaw.up, 1f, Space.World);
    objectForPitch.Rotate(objectForPitch.right, 3f, Space.World);

    //this will work on the pitch object as well
    //objectForPitch.RotateAround
    //    (objectForPitch.position, objectForPitch.right, 3f);

মনে রাখবেন যে আমি যখন প্যারেন্টিংয়ের ক্রমটি পরিবর্তনের চেষ্টা করেছি তখন এটি আমার জন্য ভেঙে যায়। বা যদি আমি স্থান পরিবর্তন করি the চাইল্ড পিচ অবজেক্টের জন্য ওয়ার্ল্ড (পিতা বা মাতা ইয়াও স্পেসের মাধ্যমে ঘোরানো কিছু মনে করে না) elf বিভ্রান্তিকর। কেন আমি স্থানীয় একটি অক্ষ নিতে হয়েছিল তবে বিশ্ব স্পেসের মাধ্যমে এটি প্রয়োগ করতে হয়েছিল - আমি স্পষ্টভাবে কিছু স্পষ্টতা ব্যবহার করতে পারি - কেন স্পেস.সেল্ফ সবকিছু নষ্ট করে দেয়?


এটি প্রশ্নের উত্তর দেওয়ার উদ্দেশ্যে করা হয়েছে কিনা, বা আপনি যে কোডটি লিখেছেন তা কেন এইভাবে কাজ করে তা বোঝার জন্য যদি আপনি জিজ্ঞাসা করেন তবে এটি আমার কাছে স্পষ্ট নয়। যদি এটি পরে থাকে তবে আপনার একটি নতুন প্রশ্ন পোস্ট করা উচিত, যদি আপনি চান তবে প্রসঙ্গের জন্য এই পৃষ্ঠায় লিঙ্ক করুন। একটি ইঙ্গিত me.Rotate(me.right, angle, Space.World)হিসাবে me.Rotate(Vector3.right, angle, Space.Self, একই , এবং আপনার নেস্টেড রূপান্তরগুলি গৃহীত উত্তরের "পিচ স্থানীয়ভাবে, ইয়াও বিশ্বব্যাপী" উদাহরণগুলির সমান।
ডিএমগ্রিগরি

দুটোই একটু। আংশিকভাবে উত্তরে ভাগ করে নেওয়ার জন্য (যেমন এটি আমার পক্ষে ঠিক কীভাবে কাজ করেছিল)। এবং এছাড়াও প্রশ্ন পরিচয় করিয়ে দিতে। সেই ইঙ্গিতটি আমাকে ভাবতে পেয়েছে। অনেক ধন্যবাদ!
Jeh,

আশ্চর্যরূপে এটি উত্সাহিত হয়নি। ঘন ঘন বিস্তৃত উত্তরগুলি পড়ার পরে যা শিক্ষাগত এখনও কাজ করে নি, জেনেরিক ভেক্টর 3 এর পরিবর্তে অবজেক্ট রোটেশন অক্ষটি ব্যবহার করার সহজ উত্তরটি ডানদিকে ঘূর্ণন স্থির রাখতে কেবল এটিই লাগে। অবিশ্বাস্য যেটি আমি সন্ধান করছিলাম তা এখানে 0 টি ভোট দিয়ে এবং অনেকগুলি, একই অনুরূপ প্রশ্নের গুগলের ২ য় পৃষ্ঠায় সমাহিত করা হয়েছিল।
ইউজার 4779
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.