কীভাবে বিশ্ব বিন্যস্ত অক্ষের চারপাশে কোনও বস্তু ঘোরানো যায়?


15

আমার একটি ভেক্টর 3 রয়েছে যা প্রতিটি অক্ষের জন্য একটি আইলারের কোণ রয়েছে।

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

যাইহোক, এই পদ্ধতিটি অবজেক্ট স্পেসে ঘূর্ণনের একটি সেট তৈরি করবে। এটি হল, আমার পদ্ধতিতে (90, 0, 90) এর কোনও ভেক্টরকে পাস করা কার্যকরভাবে (90, 90, 0) বিশ্ব মহাকাশে একটি ঘূর্ণন তৈরি করবে।

আমার ঘূর্ণন ভেক্টরের প্রতিটি উপাদান সর্বদা বিশ্বব্যাপী সম্পর্কিত স্থানটি অক্ষরেখা অক্ষের চারদিকে ঘোরানোর ফলাফল নিশ্চিত করার কোনও উপায় আছে?

সম্পাদনা করুন:

এটি বর্তমানে যা ঘটছে তার একটি অ্যানিমেশন - আমি নীল অক্ষের চারদিকে ঘুরানোর উপায় চাই, লাল নয়।

ইউলার অ্যাঙ্গেলস

সম্পাদনা 2:

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


কেবল তিনবার ডিফারনেট ফাংশনগুলিতে কল করা এবং আপনি চান না এমন ভেক্টরগুলির অংশগুলি ফিল্টার করে (ফাংশনটি বলার আগে সেগুলিতে 0 এ সেট করে) কী ভুল? অন্যথায় আমি নিশ্চিত না আপনি কী অর্জন করতে চাইছেন।
ট্র্যাভিসজি

ফিল্টারিং কি আউট? আমি 3 টি পৃথক ফাংশন কল করি এবং তারপরে রূপান্তর ম্যাট্রিক্স তৈরি করতে তাদের গুণ করি। যদিও এটি স্থানীয় ঘূর্ণন আর্কাইভ করে।
সিনট্যাক_১১

আপনি কি অ্যালার অ্যাঙ্গেল চান, বা বিশ্ব অক্ষ সম্পর্কে ঘোর? নোট করুন যে অয়লার কোণগুলির সংজ্ঞা অনুসারে (উদাহরণস্বরূপ en.wikedia.org/wiki/Euler_angles ), কেবলমাত্র আলফা কোণটি একটি বিশ্ব অক্ষ সম্পর্কে কঠোরভাবে। অন্য দুটি কোণ টিল্টেড অক্ষগুলির সাথে সম্পর্কিত যা অগত্যা বিশ্ব অক্ষের সাথে মিলে না।
ডিএমগ্রিগরি

1
ইউলারের কোণগুলি ব্যবহার করে আপনি ভার্টেক্সে প্রয়োগের আগে তিনটি ঘূর্ণন ম্যাট্রিককে গুণাচ্ছেন। যদি এম, এন, হে ঘূর্ণন ম্যাট্রিক হয় তবে ফলাফল অপারেশনটি এমএনও ভি। আমি যা প্রস্তাব করেছি তা হ'ল প্রতিটি ম্যাট্রিক্স পৃথকভাবে প্রয়োগ করা উচিত: v1 = O v0, তারপরে v2 = N v1 এবং শেষ পর্যন্ত v3 = এম ভি 2। এইভাবে প্রতিটি ভিআই বিশ্ব সমন্বয়কারী হতে হবে এবং আপনাকে কেবল বিশ্বের স্থানাঙ্কগুলিতে বর্তমান অক্ষের জন্য একটি ঘূর্ণন ম্যাট্রিক্স ব্যবহার করতে হবে।
dsilva.vinicius

3
@ dsilva.vinicius আপনার পৃথক রূপান্তরগুলি সম্মিলিতটির মতোই হ'ল বা এটি অন্য কোনও উপায়ে রাখুন: এমএনও ভি == এম * (এন * (ও ভি))
গায়আরটি

উত্তর:


1

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

// in player input handling:
if (axis == AXIS_X) object.angleX += dir;
else if (axis == AXIS_Y) object.angleY += dir;
else if (axis == AXIS_Z) object.angleZ += dir;

// in physics update and/or draw code:
matrix = eulerAnglesToMatrix(object.angleX, object.angleY, object.angleZ);

চার্লস বিটি নোট হিসাবে , কারণ আবর্তনগুলি কমবে না, প্লেয়ার বস্তুটিকে একই ক্রমে ঘোরাতে না পারে যতক্ষণ eulerAnglesToMatrix()না ঘূর্ণনগুলি প্রয়োগ করে this

বিশেষত, ঘূর্ণনের নিম্নলিখিত ক্রমটি বিবেচনা করুন:

  1. এক্স অক্ষের চারপাশে এক্স ডিগ্রি দ্বারা বস্তুটি ঘোরান ;
  2. Y অক্ষের চারপাশে y ডিগ্রি দ্বারা বস্তুকে ঘোরান ;
  3. এক্স অক্ষের চারপাশে x ডিগ্রি দ্বারা বস্তুটি ঘোরান ;
  4. - ঘোরান বস্তুর Y Y অক্ষের চারপাশে ডিগ্রী।

উপরের সিউডোকোডে যেমন নির্বিকার ইউলারের কোণ উপস্থাপনায় প্রয়োগ করা হয়েছে, এই ঘূর্ণনগুলি বাতিল হয়ে যাবে এবং অবজেক্টটি তার মূল অরিয়েন্টেশনে ফিরে আসবে। প্রকৃত বিশ্বে, এটি ঘটে না - আপনি যদি আমাকে বিশ্বাস না করেন, ছয়তরফা মারা বা রুবিকের কিউবটি ধরুন, x = y = 90 let দিন , এবং নিজেই চেষ্টা করে দেখুন!

সমাধানটি, যেমন আপনি নিজের উত্তরটিতে লক্ষ্য করেছেন , হ'ল আবর্তন ম্যাট্রিক্স (বা একটি চৌম্বক) হিসাবে বস্তুর ওরিয়েন্টেশন সংরক্ষণ করা এবং ব্যবহারকারীর ইনপুটের ভিত্তিতে সেই ম্যাট্রিক্স আপডেট করা। এটি, উপরের সিউডোকোডের পরিবর্তে আপনি এমন কিছু করতে চাইছেন:

// in player input handling:
if (axis == AXIS_X) object.orientation *= eulerAnglesToMatrix(dir, 0, 0);
else if (axis == AXIS_Y) object.orientation *= eulerAnglesToMatrix(0, dir, 0);
else if (axis == AXIS_Z) object.orientation *= eulerAnglesToMatrix(0, 0, dir);

// in physics update and/or draw code:
matrix = object.orientation;  // already in matrix form!

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


হ্যাঁ আপনি সঠিক এটি সমাধান ছিল। আমি মনে করি ধারণা 3 ডি এর উত্তরের চেয়ে এটি কিছুটা ভাল, কারণ তিনি এই ধারণাটি দেন যে একটি চৌকোণ প্রয়োজন তবে এটি সত্য নয়। যতক্ষণ না আমি বর্তমান ঘূর্ণনটি ম্যাট্রিক্স হিসাবে সংরক্ষণ করেছি এবং তিনটি অয়লার কোণ নয় এটি ভাল ছিল।
সিনট্যাক_

15

আবর্তনের সমস্যাটি হ'ল, বেশিরভাগ লোক এটিকে এলিউর অ্যাঙ্গেলগুলির ক্ষেত্রে বিবেচনা করে, কারণ তারা বুঝতে সহজ।

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

আপনি দুটি ম্যাট্রিককে গুণ করলে এটি সরাসরি ম্যাট্রিকগুলিতে অনুবাদ হয়, আপনি এই গুণটিকে একটি ম্যাট্রিক্সকে অন্য ম্যাট্রিক্সের স্পেসে রূপান্তরকারী হিসাবে ভাবতে পারেন।

এটি কোয়ার্টারিয়নগুলি ব্যবহার করার পরেও কোনও 3 ক্রমিক রোটেশনের সাথে সংঘবদ্ধ হওয়া বোঝানো হয়েছে।

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

আমি এই চাপটি চাপতে চাই যে চতুষ্কোণ জিম্বল লকের সমাধান নয় । প্রকৃতপক্ষে গেম্বল লকটি ঘটবে যদি আপনি কোয়ার্টারিয়নস ব্যবহার করে ইউলারের কোণগুলি উপস্থাপন করেন। সমস্যা নেই, উপস্থাপনা নয় সমস্যা 3 অনুক্রমিক ধাপ।

সমাধান?

3 টি অক্ষকে স্বতন্ত্রভাবে ভেক্টর ঘোরানোর সমাধানটি হল একটি একক অক্ষ এবং একটি একক কোণে একত্রিত করা, এই পদ্ধতিতে আপনি যে ধাপটি অনুক্রমিক গুণ করতে হবে সেখান থেকে আপনি মুক্তি পেতে পারেন। এটি কার্যকরভাবে অনুবাদ করবে:

আমার ঘূর্ণন ম্যাট্রিক্স X এবং Y এবং Z এর চারদিকে ঘোরার ফলাফলকে উপস্থাপন করে

বরং ইউলার ব্যাখ্যার চেয়ে

আমার ঘূর্ণন ম্যাট্রিক্স X এর পরে ঘরের আবর্তন প্রতিনিধিত্ব করে Y তারপর জেড Z

এটি স্পষ্ট করার জন্য আমি উইকিপিডিয়া ইউলারের ঘূর্ণন উপপাদ্য থেকে উদ্ধৃত করব:

ইউলারের ঘূর্ণন উপপাদ্য অনুসারে, কোনও নির্দিষ্ট বিন্দু সম্পর্কে কোনও অনমনীয় দেহ বা স্থানাঙ্ক সিস্টেমের আবর্তনের ক্রম বা ক্রম একটি নির্দিষ্ট কোণ দ্বারা একটি আবর্তনের সমতুল্য a একটি নির্দিষ্ট অক্ষ (যাকে ইউলারের অক্ষ) বলা হয় যা নির্দিষ্ট বিন্দুর মধ্য দিয়ে চলে। Euler অক্ষ সাধারণত একটি ইউনিট ভেক্টর u represented দ্বারা প্রতিনিধিত্ব করা হয়। অতএব, তিন মাত্রায় কোনও ঘূর্ণন একটি ভেক্টর ইউ → এবং একটি স্কেলারের সংমিশ্রণ হিসাবে উপস্থাপন করা যেতে পারে θ কোয়ার্টেরিয়ানগুলি এই অক্ষটি-চারটি সংখ্যার কোণ উপস্থাপনাকে এনকোড করার একটি সহজ উপায় দেয় এবং আর 3-এর উত্সের সাথে সম্পর্কিত কোনও বিন্দুর প্রতিনিধিত্ব করে এমন অবস্থান ভেক্টরের সাথে সম্পর্কিত ঘূর্ণন প্রয়োগ করে।

লক্ষ্য করুন যে 3 ম্যাট্রিককে গুণিত করা সর্বদা 3 অনুক্রমিক ঘূর্ণন উপস্থাপন করে।

প্রায় 3 টি অক্ষের আবর্তকে একত্রিত করার জন্য, আপনাকে একটি একক অক্ষ এবং একক কোণ পাওয়া দরকার যা এক্স, ওয়াই, জেড এর চারদিকে ঘূর্ণনকে উপস্থাপন করে। অন্য কথায় ক্রমিক ক্রম ঘূর্ণন থেকে মুক্তি পেতে আপনার অক্ষ / কোণ বা চতুষ্পদ প্রতিনিধিত্ব ব্যবহার করতে হবে।

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


অন্তর্দৃষ্টিপূর্ণ বলে মনে হয় উত্তর হিসাবে চিহ্নিত করা হয়েছে।
সিনট্যাক_

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

@ ইলমারি কারোনেন এটি আরও স্পষ্টভাবে বলা যেতে পারে, তবে আমার ধারণা ধারণা 3 ডি অক্ষ-কোণের উপস্থাপনা প্রচার করছে; অক্ষ-কোণ এবং চতুর্ভুজগুলির মধ্যে সম্পর্কের জন্য এই নথির ২.২.২ অংশটি দেখুন । অক্ষ-কোণ উপস্থাপনা উপরোক্ত কারণে কার্যকর করা সহজ, এটি জিম্বল-লক থেকে ভোগেনা এবং (আমার পক্ষে কমপক্ষে) এটি ইউলারের কোণগুলির মতো বোঝা ঠিক তত সহজ।
নটিক্যালমাইল

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

@gmagno অ্যাপ্রোচটি হ'ল অবজেক্ট বা দৃশ্যে মাউস মুভমেন্টটি প্রজেক্ট করা এবং সেই জায়গাতে ডেল্টাস গণনা করা, আপনি একটি রশ্মি ফেলে এবং ছেদটি গণনা করে এটি করেন। রে কাস্টিং, প্রজেক্ট এবং আনপ্রসেক্টের জন্য অনুসন্ধান করুন, আমি বিশদগুলিতে মোটামুটি কারণ আমি এখন কয়েক বছর ধরে সিজি তে কাজ করি নি। আশা করি এইটি কাজ করবে.
ধারণার 3

2

অবজেক্ট স্পেস থেকে বিশ্ব স্পেসে রোটেশনের সংমিশ্রণটি ন্যূনতম: আপনাকে কেবল ক্রমটি ঘুরিয়ে দিতে হবে যেখানে ঘূর্ণনগুলি প্রয়োগ করা হয়।

আপনার ক্ষেত্রে, ম্যাট্রিকগুলি গুণিত করার পরিবর্তে Z × X × Yআপনার কেবল গণনা করা দরকার Y × X × Z

এর একটি যুক্তি উইকিপিডিয়ায় পাওয়া যাবে: অভ্যন্তরীণ এবং বহির্মুখী ঘোরার মধ্যে রূপান্তর


যদি এটি সত্য হয় তবে আপনার উত্স থেকে নিম্নলিখিত বিবৃতিটি সত্য হবে না, কারণ আবর্তনগুলি পৃথক হবে: "যে কোনও বহির্মুখী ঘূর্ণন একই কোণ দ্বারা কিন্তু প্রাথমিক আবর্তনের বিপরীত ক্রম সহ একটি অভ্যন্তরীণ ঘূর্ণনের সমান and । "
সিনট্যাক_

1
আমি এখানে কোন বৈপরীত্য দেখতে পাচ্ছি। আমার উত্তর এবং উক্তিটি উভয়ই সত্য। এবং হ্যাঁ, অবজেক্ট স্পেসে এবং ওয়ার্ল্ড স্পেসে আবর্তন সম্পাদন করলে বিভিন্ন আবর্তন আসে; ঠিক এটাই কথা, তাই না?
সাম হোচেভার

এই বিবৃতিতে বলা হয়েছে যে ক্রম পরিবর্তন করার ফলে সর্বদা একই ঘূর্ণনের ফলাফল হবে। যদি একটি ক্রমটি ভুল ঘূর্ণন উত্পাদন করে থাকে তবে অন্য আদেশটিও অর্ডার করবে, মানে এটি কোনও সমাধান নয়।
সিনট্যাক_

1
আপনি ভুল লিখছেন। অর্ডার পরিবর্তন করলে একই ঘূর্ণায়মান হয় না। ক্রম পরিবর্তন করে এবং অভ্যন্তরীণ আবর্তনগুলি থেকে বহির্মুখী ঘোরার দিকে স্যুইচ করার ফলে একই ঘূর্ণনের ফলাফল হয়।
সাম হোচেভার

1
আমি মনে করি না আমি আপনার প্রশ্নটি বুঝতে পেরেছি। আপনার জিআইএফ Z(অবজেক্ট স্পেস) চারপাশে প্রায় 50 ডিগ্রি, তারপরে 50 ডিগ্রি X(অবজেক্ট স্পেস), তারপরে 45 ডিগ্রি Y(অবজেক্ট স্পেস) এর চারদিকে ঘূর্ণন দেখায় । এটি Y( বিশ্বের স্থান ) প্রায় 45 ডিগ্রি , তারপরে 50 ডিগ্রি X( বিশ্ব স্থান ), তারপরে 50 ডিগ্রি Z( বিশ্বের স্থান ) এর চারদিকে ঘোরার মতোই exactly
সাম হোচেভার

1

আমি উত্তর হিসাবে আমার সমাধান সরবরাহ করব যতক্ষণ না কেউ ব্যাখ্যা করে যে এটি কেন কাজ করে।

প্রতি রেন্ডারটিতে আমি আমার ঘূর্ণন ভেক্টরে সঞ্চিত কোণগুলি ব্যবহার করে আমার চৌম্বকটি পুনর্নির্মাণ করছিলাম এবং তারপরে আমার চূড়ান্ত রূপান্তরটিতে কোয়ার্টারিয়নটি প্রয়োগ করছি।

তবে এটি বিশ্বজুড়ে অক্ষ ধরে রাখার জন্য আমাকে সমস্ত ফ্রেম জুড়ে চৌম্বকটি ধরে রাখতে হয়েছিল এবং কেবল কোণে একটি পার্থক্য ব্যবহার করে বস্তুগুলি ঘোরানো হয়েছিল, অর্থাৎ ..

// To rotate an angle around X - note this is an additional rotation.
// If currently rotated 90, apply this function with angle of 90, total rotation = 180.
D3DXQUATERNION q;
D3DXQuaternionRotation(&q, D3DXVECTOR3(1.0f, 0.0f, 0.0f), fAngle);
m_qRotation *= q; 

//...

// When rendering rebuild world matrix
D3DXMATRIX mTemp;
D3DXMatrixIdentity(&m_mWorld);

// Scale
D3DXMatrixScaling(&mTemp, m_vScale.x, m_vScale.y, m_vScale.z);
m_mWorld *= mTemp;

// Rotate
D3DXMatrixRotationQuaternion(&mTemp, m_qRotation);
m_mWorld *= mTemp;

// Translation
D3DXMatrixTranslation(&mTemp, m_vPosition.x, m_vPosition.y, m_vPosition.z);
m_mWorld *= mTemp;

(পাঠযোগ্যতার জন্য ভারবোজ)

আমার মনে হয় dsilva.vinicius এই জায়গায় পৌঁছানোর চেষ্টা করছিল।


1

আপনার আবর্তনের ক্রম সংরক্ষণ করতে হবে।

Rotating around x 90 then rotate around z 90 !=
Rotating around z 90 then rotate around x 90.

আপনার বর্তমান ঘূর্ণন ম্যাট্রিক্স সংরক্ষণ করুন এবং প্রতিটি ঘূর্ণন আসার সাথে সাথে তার পূর্বগুণ করুন।


0

@ কনসেপ্ট 3 ডি উত্তর ছাড়াও আপনি বিশ্বের স্থানাঙ্কগুলিতে অক্ষের চারদিকে ঘুরতে 3 বহিরাগত ঘূর্ণন ম্যাট্রিক্স ব্যবহার করতে পারেন। উইকিপিডিয়া থেকে উদ্ধৃতি :

এক্সট্রিনসিক রোটেশনগুলি প্রাথমিক ঘূর্ণন যা স্থির সমন্বয় সিস্টেম xyz এর অক্ষ সম্পর্কে ঘটে। এক্সওয়াইজেড সিস্টেমটি ঘোরায়, যখন এক্সওয়াইজ স্থির হয়। এক্সওয়াইজেড ওভারল্যাপিং এক্সএইজেড দিয়ে শুরু করে, এক্সওয়াইজেডের জন্য কোনও টার্গেট অরিয়েন্টেশন পৌঁছাতে তিনটি বহির্মুখী ঘূর্ণনের একটি সংমিশ্রণ ব্যবহার করা যেতে পারে। এলিউর বা টাইট ব্রায়ান কোণগুলি (α, β, γ) এই প্রাথমিক ঘূর্ণনের প্রশস্ততা। উদাহরণস্বরূপ, টার্গেট অরিয়েন্টেশনটি নিম্নলিখিত হিসাবে পৌঁছানো যেতে পারে:

এক্সওয়াইজেড-সিস্টেমটি-দ্বারা z- অক্ষের চারপাশে ঘোরে α এক্স-অক্ষটি এখন কোণে x এক্স-অক্ষের সাথে।

এক্সওয়াইজেড-সিস্টেমটি আবার-দ্বারা এক্স-অক্ষ সম্পর্কে ঘোরে β জেড-অক্ষগুলি এখন কোণে রয়েছে - জেড-অক্ষের সাথে সম্মত।

XYZ- সিস্টেমটি তৃতীয়বার z-axis সম্পর্কে by দ্বারা আবর্তিত হয় γ

আবর্তনের ম্যাট্রিকগুলি বহির্মুখী ঘূর্ণনের ক্রম উপস্থাপন করতে ব্যবহার করা যেতে পারে। এই ক্ষেত্রে,

আর = জেড (γ) ওয়াই (β) এক্স (α)

অক্ষ xyz সম্পর্কে বহির্মুখী ঘূর্ণনের একটি সমন্বিত প্রতিনিধিত্ব করে, যদি কলাম ভেক্টরগুলি প্রাক গুণিত করতে ব্যবহৃত হয়,

আর = এক্স (α) ওয়াই (β) জেড (γ)

সারি ভেক্টরগুলি পোস্ট-গুণিত করতে ব্যবহৃত হওয়ার সময় একই রচনাটি উপস্থাপন করে।

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

ম্যাট্রিক্স এখানে ব্যাখ্যা মূল্যবোধ করে ।

// Init things.
D3DXMATRIX *rotationMatrixX = new D3DXMATRIX();
D3DXMATRIX *rotationMatrixY = new D3DXMATRIX();
D3DXMATRIX *rotationMatrixZ = new D3DXMATRIX();
D3DXMATRIX *resultRotationMatrix0 = new D3DXMATRIX();
D3DXMATRIX *resultRotationMatrix1 = new D3DXMATRIX();

D3DXMatrixRotationX(rotationMatrixX, angleX);
D3DXMatrixRotationY(rotationMatrixY, angleY);
D3DXMatrixRotationZ(rotationMatrixZ, angleZ);

// yx extrinsic rotation matrix
D3DXMatrixMultiply(resultRotationMatrix0, rotationMatrixY, rotationMatrixX);
// yxz extrinsic rotation matrix
D3DXMatrixMultiply(resultRotationMatrix1, resultRotationMatrix0, rotationMatrixZ);

D3DXVECTOR4* originalVector = // Original value to be transformed;
D3DXVECTOR4* transformedVector = new D3DXVECTOR4();

// Applying matrix to the vector.
D3DXVec4Transform(transformedVector, originalVector, resultRotationMatrix1);

// Don't forget to clean memory!

আপনি বেশ কয়েকটি ডি 3 ডি এক্সএম্যাট্রিক্স ম্যাট্রিক্স পুনরায় ব্যবহার করতে পারার কারণে এই কোডটি আদর্শিক নয়, অনুকূল নয়।


1
দুঃখিত মানুষ এটা সঠিক নয়। ম্যাট্রিক্স / ভেক্টর গুণ গুণযুক্ত হয়। এটি হ'ল সম্মিলিত ম্যাট্রিক্স গুণনের সমান।
ধারণাগুলি

তুমি ঠিক. আমি বহিরাগত এবং অভ্যন্তরীণ ঘূর্ণনের ধারণাগুলি মিশ্রিত করেছি।
dsilva.vinicius

আমি এই উত্তর ঠিক করব।
dsilva.vinicius

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