জিম্বল লক সমস্যা কীভাবে জমে থাকা ম্যাট্রিক্স রূপান্তর ব্যবহার করে সমাধান করা হয়


12

আমি জেসন এল। ম্যাককেসনের লেখা "লার্নিং মডার্ন 3 ডি গ্রাফিক্স প্রোগ্রামিং" বইটি পড়ছি

এখন পর্যন্ত, আমি গিম্বল লক সমস্যা এবং কীভাবে চতুর্থাংশ ব্যবহার করে এটি সমাধান করব তা অবধি।

তবে ঠিক এখানে, কোয়ার্টারিয়নস পৃষ্ঠায়

সমস্যার অংশটি হ'ল আমরা 3 টি জমে থাকা অক্ষীয় আবর্তনের সিরিজ হিসাবে একটি ওরিয়েন্টেশন সংরক্ষণ করার চেষ্টা করছি। ওরিয়েন্টেশন হ'ল ওরিয়েন্টেশন, আবর্তন নয়। এবং ওরিয়েন্টেশন অবশ্যই আবর্তনের একটি সিরিজ নয়। সুতরাং আমাদের জাহাজের ওরিয়েন্টেশনকে একটি নির্দিষ্ট পরিমাণ হিসাবে অভিহিত হিসাবে বিবেচনা করতে হবে।

আমি অনুমান করি এটি প্রথম স্থান যা আমি বিভ্রান্ত হওয়া শুরু করি কারণ এর কারণ হ'ল আমি ওরিয়েন্টেশন এবং আবর্তনের মধ্যে নাটকীয় পার্থক্য দেখি না। আমিও বুঝতে পারি না কেন কেন একটি কেন্দ্রীভূতিকে ধারাবাহিকভাবে ঘোরানো দ্বারা প্রতিনিধিত্ব করা যায় না ...

এছাড়াও:

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

এর অর্থ হ'ল বর্তমান ওরিয়েন্টেশনের সাথে প্রযোজ্য প্রতিটি ইয়াও, পিচ এবং রোল সেই বর্তমান ওরিয়েন্টেশনের সাথে সম্পর্কিত। যা আমাদের অবিকল প্রয়োজন। যদি ব্যবহারকারী কোনও ইতিবাচক ইয়াবা প্রয়োগ করে তবে আপনি চান যে ইয়াবা সেগুলি বর্তমান পয়েন্টিংয়ের সাথে সম্পর্কিত করে কোনও নির্দিষ্ট স্থানাঙ্ক ব্যবস্থার তুলনায় নয় them

ধারণাটি, আমি বুঝতে পারি, তবে আমি বুঝতে পারি না যে কীভাবে ম্যাট্রিক্স ট্রান্সফর্মেশনগুলি জড়ো করা যদি এই সমস্যার সমাধান হয় তবে পূর্ববর্তী পৃষ্ঠায় প্রদত্ত কোডটি কীভাবে তা নয়।

কোডটি এখানে:

void display()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutil::MatrixStack currMatrix;
    currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f));
    currMatrix.RotateX(g_angles.fAngleX);
    DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f));
    currMatrix.RotateY(g_angles.fAngleY);
    DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
    currMatrix.RotateZ(g_angles.fAngleZ);
    DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f));

    glUseProgram(theProgram);
    currMatrix.Scale(3.0, 3.0, 3.0);
    currMatrix.RotateX(-90);
    //Set the base color for this object.
    glUniform4f(baseColorUnif, 1.0, 1.0, 1.0, 1.0);
    glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(currMatrix.Top()));

    g_pObject->Render("tint");

    glUseProgram(0);

    glutSwapBuffers();
}

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

ম্যাট্রিক্স সম্পর্কে আমার বোঝাটি হল যে এগুলি একটি বিন্দুতে ব্যবহার করা হয় যা একটি উত্সের সাথে সম্পর্কিত (আসুন বলা যাক ... মডেল), এবং এটিকে অন্য উত্সের (ক্যামেরা) সাথে সম্পর্কিত করে তোলা হয়। আমি নিশ্চিত যে এটি একটি নিরাপদ সংজ্ঞা, তবে আমার মনে হচ্ছে এমন কিছু আছে যা আমাকে এই জিম্বল লক সমস্যাটি বুঝতে বাধা দিচ্ছে।

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

জিম্বল লক ঠিক তাই হয়? এর কারণ আমরা বস্তুটিকে তার নিজের, আপেক্ষিক অক্ষের চারপাশে ঘোরানোর চেয়ে সেট এক্স, ওয়াই এবং জেড অক্ষের চারপাশে ঘোরান । নাকি আমি ভুল করছি?

যেহেতু আপাতদৃষ্টিতে এই কোডটি আমি সংযুক্ত করেছি সেটি ম্যাট্রিক্স রূপান্তরগুলির সঞ্চিতি নয়, আপনি দয়া করে এই পদ্ধতিটি ব্যবহার করে কোনও সমাধানের উদাহরণ দিতে পারেন।

সুতরাং সংক্ষেপে:

  • একটি ঘূর্ণন এবং একটি ওরিয়েন্টেশন মধ্যে পার্থক্য কি?
  • কোডটি কেন ম্যাট্রিক্স রূপান্তরকেন্দ্রিক সংস্থার উদাহরণ নয়?
  • ম্যাট্রিক্সের আসল, নির্দিষ্ট উদ্দেশ্যটি কী, যদি আমার এটি ভুল হয়?
  • জিম্বল লক সমস্যার সমাধান কীভাবে ম্যাট্রিক্স ট্রান্সফর্মেশনের সংশ্লেষ ব্যবহার করে প্রয়োগ করা যেতে পারে?
  • এছাড়াও, বোনাস হিসাবে: ঘূর্ণনের পরে রূপান্তরগুলি এখনও "মডেল স্পেস" এর সাথে তুলনামূলক কেন?
  • আরেকটি বোনাস: আমি কি এই ধারণায় ভুল করছি যে একটি রূপান্তরের পরে আরও রূপান্তরগুলি বর্তমানের তুলনায় ঘটবে?

এছাড়াও, যদি এটি বোঝানো না হয়, তবে আমি ওপেনজিএল, জিএলএসএল, সি ++, এবং জিএলএম ব্যবহার করছি, সুতরাং প্রয়োজনীয়তা না থাকলে এগুলির ক্ষেত্রে উদাহরণ এবং ব্যাখ্যাগুলি প্রশংসিত হয়।

আরও বিস্তারিত আরও ভাল!

আগাম ধন্যবাদ.

উত্তর:


11

আমি এটির উপস্থাপনের কোনও ভাল উপায় সম্পর্কে নিশ্চিত নই, অন্যথায় আমি আশা করি এটি শেষ পর্যন্ত ভালভাবে একসাথে জড়িয়েছে। এটি বলেছিল, আসুন ডুব দেই:

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

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

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

এখন, আমি ম্যাট্রিক্স জমা করার বিষয়ে এটির সম্পূর্ণ সমাধান হিসাবে সন্দিহান, কারণ জড়িত ম্যাট্রিকেস (সুতরাং ঘূর্ণনগুলি জমে থাকা) হ'ল জিম্বল লকের সমস্যাটি প্রথম স্থানে আনতে পারে। একটি চতুষ্কোণ দ্বারা রূপান্তর পরিচালনার সঠিক উপায় হয় একটি বিন্দুতে কোয়ার্টারিয়ন গুণন করা:

pTransformed = q * pAsQuaternion * qConjugate

বা চৌম্বকটি একটি ম্যাট্রিক্সে রূপান্তর করে এবং সেই ম্যাট্রিক্সটি ব্যবহার করে বিন্দুটি রূপান্তর করে।

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

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

glutil::MatrixStack bookMatrix;
bookMatrix.RotateX(45);

এখন ধরা যাক আপনি 45 ডিগ্রি বইয়ের ইয়াগুলি সামঞ্জস্য করতে চেয়েছিলেন (আমি মনে করি আমি একটি ডান হাতের সমন্বয় ব্যবস্থা গ্রহণ করছি, সুতরাং এটি বাম দিকে শিরোনাম বদলে যাবে), এবং আপনি এটি বইয়ের স্থানীয় ক্ষেত্রে প্রয়োগ করতে চান স্থান স্থানাঙ্ক, যাতে বইয়ের প্রচ্ছদটি এখনও আপনার মুখোমুখি হবে:

bookMatrix.RotateY(45);

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

glutil::MatrixStack bookMatrix;
bookMatrix.RotateY(45);
bookMatrix.RotateX(45);

চেষ্টা কর! বইটি আবার সিলিংয়ের মুখোমুখি শুরু করুন। এর ইয়ু 45 ডিগ্রি পরিবর্তন করুন এবং তারপরে এটি 45 ডিগ্রিটি বিশ্বব্যাপী এক্স অক্ষের সাথে পিক করুন (আপনার বাম থেকে ডানে চলমান)। আপনি এই বইটি স্থানীয় স্পেসে 45 এর পিচ এবং 45 ইয়াও দিয়ে প্রত্যাশা করেছেন।

এটার মানে কি? এটি যা আসলেই নেমে আসে তা হ'ল অপারেশনগুলির ক্রমটি গুরুত্বপূর্ণ। রূপান্তরগুলি পরে সম্পন্ন রূপান্তরগুলির প্রসঙ্গে প্রথমে স্থানীয় রূপান্তর হয়। আপনার মাথাটি চারপাশে মুড়ে ফেলার জন্য এটি অনেকটা হয়ে যায়, এবং এভাবেই চতুর্ভুজগুলি অনেক ঝামেলা বাঁচায়। সমস্ত অর্ডার-নির্ভর স্টাফ এড়িয়ে যান।

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

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

আশাকরি এটা সাহায্য করবে :)


4
কেবল রেকর্ডের জন্য, কোয়ার্টারিয়নস এখনও জিম্বল লকটি পরিচয় করিয়ে দিতে পারে যদি অয়লার কোণগুলির মাধ্যমে বর্ণিত হয়; যেহেতু আপনি একই গণনাটি অন্যভাবে করবেন (ম্যাট্রিকের চেয়ে চতুর্থাংশ)
ধারণা

1
@ ধারণাগুলি 3 ডি - এটি উল্লেখ করার জন্য অভিনন্দন! জিম্বল প্রক্রিয়াটি কীভাবে কিছুটা স্বাধীনতা হারাতে প্রবণ করে তোলে তা বোঝা গুরুত্বপূর্ণ: এটি রোবোটিক যৌথের মতো যা অন্তর্নিহিতভাবে সমীকরণগুলির একটি অত্যধিক নির্ধারিত সিস্টেমকে বর্ণনা করে। যদি আপনি এই প্রক্রিয়াটি কোয়ার্ট্রিয়েনস, ম্যাট্রিক্স বা যাদু দিয়ে তৈরি করেন তবে আপনি এখনও দ্ব্যর্থহীনতার সাথে সমাপ্ত হন - এটি এটি বোঝা এবং এটি প্রথম স্থানে ব্যবহার না করা যা এটি একটি আসল সমাধান (যদি না আপনি কিছু প্রদর্শনী বা প্রযুক্তিগত উদ্দেশ্যে ব্যবহার করার প্রয়োজন না হন) ।
teodron

কোয়ার্টেরিয়নগুলি কল্পনা করা শক্ত, আমি যেভাবে সর্বদা এটি সম্পর্কে চিন্তা করি তা হ'ল তারা (ইউনিট কোয়ার্টারিয়নস) একটি 3-গোলক স্থানকে উপস্থাপন করে, সুতরাং যে কোনও অভিমুখকে উপস্থাপন করতে পারে, আমি যখন বুঝতে পারি ইউরার কোণগুলি প্রতিটি বৃত্ত / তুরস্ককে উপস্থাপন করে, সুতরাং এটি সম্পূর্ণ গোলক নয় অভিমুখীকরণের প্রতিনিধিত্ব করার খুব সঠিক উপায় নয় (3 টি বৃত্ত / টরাসটি যথাসম্ভব প্রতিটি সম্ভাব্য অভিব্যক্তি তৈরি করতে পারে না যদি না তারা স্বতঃরূপে আবর্তিত হয় যা এলিউর অ্যাঙ্গেলগুলির ক্ষেত্রে সম্ভব নয়), নিশ্চিত না যে আমি সঠিকভাবে ব্যাখ্যা করেছি কিনা :)
ধারণা

1

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

glutil::MatrixStack bookMatrix;
bookMatrix.RotateX(90);
bookMatrix.RotateY(90);
bookMatrix.RotateZ(90);

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

glutil::MatrixStack bookMatrix;
bookMatrix.RotateX(90);
bookMatrix.RotateY(90);
bookMatrix.RotateZ(90);
bookMatrix.RotateY(90);

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

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