3 ডি ক্যামেরা ঘূর্ণন


9

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

এই বিষয়টিকে কী সবচেয়ে বিভ্রান্তিকর করে তুলেছে তা হ'ল প্রত্যেকে যেভাবে কনভেনশন বা নিয়মগুলির বিভিন্ন সেট ব্যবহার করে এবং তাদের উত্তরগুলি তারা কী তা নির্ধারণ না করেই তাদের নিজস্ব সম্মেলনের উপর ভিত্তি করে।

সুতরাং আমি সাধারণ এবং যৌক্তিক বলে মনে হচ্ছে তার উপর ভিত্তি করে আমি যে সম্মেলনগুলি গঠন করেছি সেগুলির সেট এখানে দেওয়া হয়েছে:

  1. অক্ষের জন্য ডান হাতের নিয়ম।
  2. ধনাত্মক ওয়াই আপ, পজিটিভ জেড দর্শকের দিকে, পজিটিভ এক্স ডানদিকে।
  3. স্যাডারে পাঠানো হলে সারি মেজর ম্যাট্রিক্সগুলি স্থানান্তরিত হয়।
    • পিচ: এক্স অক্ষ সম্পর্কে ঘূর্ণন
    • ইয়াও: y অক্ষের আবর্তন
    • রোল: z অক্ষ সম্পর্কে ঘূর্ণন
  4. আবর্তনের ক্রম: রোল, পিচ, ইয়াও (এটি কি সঠিক? কেউ কি আমাকে এটি পরীক্ষা করতে পারে?)
  5. একটি অক্ষের ধনাত্মক প্রান্ত থেকে নীচে তাকানো ধনাত্মক ঘূর্ণন মানগুলির ফলে ঘড়ির কাঁটার ঘোরানো হয়।
  6. সমস্ত অক্ষ জুড়ে 0 টি ঘূর্ণনের জন্য ডিফল্ট দিকনির্দেশ হ'ল একটি ভেক্টর যা নেতিবাচক Y এর দিকে নির্দেশ করে is

.. এই সম্মেলনগুলি দেওয়া (যদি তারা ভুল হয়ে থাকে তবে আমাকে সংশোধন করুন!), কীভাবে এটি করা হয়:

  • একটি lookAt ফাংশন লিখুন? (চেহারা দেখুন (ভেক্টরের অবস্থান, ভেক্টর আইফোকাস, ভেক্টর আপ))
  • একটি ঘূর্ণন ম্যাট্রিক্স গণনা করুন। (ঘূর্ণন (x, y, z))

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

আমি গত রাতে বাদে প্রতি রাতে এই নিয়ে কাজ করছি কারণ বারবার ব্যর্থতায় আমি এতটাই হতাশ হয়ে পড়েছিলাম যে আমাকে থামতে হয়েছিল এবং বিরতি নিতে হয়েছিল।

দয়া করে, আমাকে সঠিক পদ্ধতিটি কী তা দেখান যাতে আমি সেখান থেকে পিছনে কাজ করতে পারি এবং এটি কীভাবে কাজ করে তা বুঝতে পারি, আমি ঠিক সঠিক উত্তর পাচ্ছি না এবং এটি আমাকে একটু পাগল করছে!

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

আপডেট: সলভড

আপনার সাহায্যের জন্য ধন্যবাদ! আমার এখন একটি কার্যকরী লুকআউট ফাংশন রয়েছে যা আমি আসলে বুঝতে পারি এবং আমি আরও সুখী হতে পারি না (যদি কেউ এটি কোনও উপায়ে জিজ্ঞাসা করতে চান তবে)।

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

অন্য কারও যদি অনুরূপ সমস্যার মুখোমুখি হয় এবং আমাকে প্রশ্ন জিজ্ঞাসা করতে চান তবে নির্দ্বিধায়।

অন্তত আমি আর আটকে নেই, সাহায্যের জন্য ধন্যবাদ!

উত্তর:


15

আপনি যা খুঁজছেন তা এই খুব ভাল ব্যাখ্যায় পাওয়া যাবে: http://www.songho.ca/opengl/gl_transfor.html

তবে যেহেতু আমি এটি হাত না ধরেই এক ধরণের বিভ্রান্তিকর দেখতে পেয়েছি আমি এখানে এটি ব্যাখ্যা করার চেষ্টা করব।

এই মুহুর্তে আপনার 5 টি সমন্বিত সিস্টেম এবং সেগুলি একে অপরের সাথে সম্পর্কিত কী তা বিবেচনা করা উচিত। এগুলি হ'ল উইন্ডো স্থানাঙ্ক, সাধারণ ডিভাইস স্থানাঙ্ক, চোখের স্থানাঙ্ক, বিশ্ব স্থানাঙ্ক এবং বস্তু স্থানাঙ্ক।

উইন্ডো স্থানাঙ্কগুলি আপনার স্ক্রিনে "শারীরিক" পিক্সেল হিসাবে দেখা যেতে পারে। এগুলি সেই স্থানাঙ্ক যা উইন্ডোটিং সিস্টেমটি বোঝায় এবং যদি আপনি আপনার মনিটরের নেটিভ রেজোলিউশনে পরিচালনা করেন তবে এগুলি আসলে পৃথক পিক্সেল। উইন্ডো সমন্বয় ব্যবস্থা 2D পূর্ণসংখ্যা এবং আপনার উইন্ডোর সাথে সম্পর্কিত। এখানে এক্স + টি বাম এবং y + নীচে বাম কোণার উপরের উত্স সহ রয়েছে। উদাহরণস্বরূপ কল করার সময় আপনি এগুলির মুখোমুখি হন glViewport

দ্বিতীয় সেটটি হ'ল সাধিত ডিভাইস স্থানাঙ্ক। এগুলি সক্রিয় ভিউ পোর্ট দ্বারা স্থান সেটআপকে উল্লেখ করে। ভিউ পোর্টটির দৃশ্যমান অঞ্চলটি -1 থেকে +1 এ যায় এবং এভাবে কেন্দ্রে উত্স হয়। এক্স + রেখে গেছে এবং y + উপরে রয়েছে। আপনার কাছে z + দৃশ্যটি "আউট" রয়েছে। আপনি যা বর্ণনা করেছেন এটিই।

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

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

পরেরটি চোখের স্থানাঙ্ক। ক্যামেরা থেকে দেখা গেছে এই পৃথিবী। ফলস্বরূপ উত্সটি ক্যামেরায় রয়েছে এবং ডিভাইসের স্থানাঙ্কের মতো একই অক্ষের এলিমেন্টগুলি প্রয়োগ হয়।

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

অবশেষে আপনার কাছে বিশ্বের সমন্বয় ব্যবস্থা রয়েছে। এটি সেই সমন্বয় ব্যবস্থা যেখানে আপনার বিশ্বের সংজ্ঞা দেওয়া হয়েছে এবং আপনার ক্যামেরাটি এই বিশ্বের অংশ। এখানে এটি লক্ষণীয় গুরুত্বপূর্ণ যে অক্ষগুলির ওরিয়েন্টেশনগুলি যেমন আপনি তাদের সংজ্ঞায়িত করেন ঠিক তেমনই । আপনি যদি z + পছন্দ করেন তবে তা সম্পূর্ণরূপে ঠিক আছে।

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

দেখার ম্যাট্রিক্সটি আশ্চর্যজনকরূপে সহজ গণনা করতে আপনাকে ক্যামেরার রূপান্তর করতে হবে। আপনাকে মূলত নিম্নলিখিত ম্যাট্রিক্স তৈরি করতে হবে:

M=x[1]y[1]z[1]p[1]x[2]y[2]z[2]p[2]x[3]y[3]z[3]p[3]0001

এক্স, ওয়াই এবং জেড ভেক্টর সরাসরি ক্যামেরা থেকে নেওয়া যেতে পারে। ক্ষেত্রে নজরে আপনি লক্ষ্য, চোখ (কেন্দ্র) এবং আপ মান থেকে তাদের প্রাপ্ত হবে। তাই ভালো:

z=normalize(eyetarget)x=normalize(up×z)y=zx

তবে যদি আপনার এই মানগুলি কেবলমাত্র পড়ে থাকে তবে আপনি সেগুলি ঠিক সেভাবে নিতে পারেন।

পি পাওয়া কিছুটা বেশি জটিল। এটি বিশ্বের স্থানাঙ্কগুলিতে অবস্থান নয় তবে ক্যামেরার স্থানাঙ্কে অবস্থান। এখানের একটি সহজ কাজটি হ'ল দুটি ম্যাট্রিক্সের সূচনা করা, একটিতে কেবল x, y এবং z এবং দ্বিতীয়টি -eye দিয়ে এবং তাদের একসাথে বহুগুণ করা। ফলাফল ভিউ ম্যাট্রিক্স।

এটি কোডে কীভাবে দেখতে পারে তার জন্য:

mat4 lookat(vec3 eye, vec3 target, vec3 up)
{
    vec3 zaxis = normalize(eye - target);    
    vec3 xaxis = normalize(cross(up, zaxis));
    vec3 yaxis = cross(zaxis, xaxis);     

    mat4 orientation(
       xaxis[0], yaxis[0], zaxis[0], 0,
       xaxis[1], yaxis[1], zaxis[1], 0,
       xaxis[2], yaxis[2], zaxis[2], 0,
         0,       0,       0,     1);

    mat4 translation(
              1,       0,       0, 0,
              0,       1,       0, 0, 
              0,       0,       1, 0,
        -eye[0], -eye[1], -eye[2], 1);

    return orientation * translation;
}

পুরো কোড

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


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

এটি কিছুটা বিভ্রান্তি, ম্যাট্রিক্সগুলি কলাম প্রধান, কিন্তু কলামটি সারি। সুতরাং কোডটিতে আসল গণিতের মানচিত্রের জন্য আপনাকে ম্যাট্রিক্স ট্র্যানপোজ করতে হবে। দেখুন github.com/rioki/glm/blob/master/src/matrix.h#l72 ঠিক OpenGL এই মানচিত্র এবং কিভাবে এটা ব্যবহার করা হয় তবে হবে float[16]
রিওকি

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