আমি কীভাবে কোনও ক্যামেরার লক্ষ্য বিন্দু সম্পর্কে কক্ষপথ পরিদর্শন করতে পারি?


18

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

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

এটি করার কোন সহজ উপায় আছে?

আমি (সংক্ষেপে) চতুর্থাংশ সম্পর্কে পড়েছি, তবে আমি দেখতে চেয়েছিলাম আমার দৃশ্যের তুলনামূলক সহজ নির্মাণের চেয়ে আরও সহজ সমাধান আছে কিনা।


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

কোয়ার্ট্রিন্স সম্পর্কে আমার শিথিল বুঝতে ছাড়া আর কিছুই নয়, না no আমি এটিকে যত বেশি দেখছি, আমি মনে করি কোয়ার্টেরিয়ানস এর উত্তর হতে পারে। তবে, কোয়ার্টেরিয়নের সূত্রে অক্ষ, x, y এবং z মানগুলি কীভাবে গণনা করতে হবে তা আমি নিশ্চিত নই ।
লুক 16

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

আপনি কোন ক্রমটিতে আবর্তন করছেন তা বিবেচনা করুন world বিশ্ব মহাকাশে যাওয়ার জন্য বা ক্যামেরার স্পেসে যাওয়ার জন্য আবর্তন প্রয়োগ করা পৃথক হয়
চার্লি

উত্তর:


25

আপনি যেটির জন্য জিজ্ঞাসা করছেন তাকে আর্কবল রোটেশন বলে। তারা কীভাবে কাজ করে তা যদি আপনি বুঝতে পারেন তবে কোয়ার্টেরিয়ানগুলি সহজ সমাধান। আপনি তবে কোয়ার্ট্রেশন ছাড়াই এটি অর্জন করতে পারেন।

আগ্রহী

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

কোণ-অক্ষ থেকে কোনও ঘূর্ণন ম্যাট্রিক্স গণনা করতে হবে তা অবশ্যই আপনাকে জানতে হবে (পাই হিসাবে সহজ, অনলাইনে সমীকরণের অগণিত দিকটি দেখুন, তাদের মধ্যে অনেকগুলি আপনাকে কোড দেয়)

সমাধান

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

আদেশ সহকারে

আপনাকে নির্দিষ্ট কিছু কেস বা এককতার জন্য সন্ধান করতে হবে যেখানে আপনার ক্যামেরা কাজ করা বন্ধ করবে। উদাহরণস্বরূপ সোজা নিচে / উপরে খুঁজছেন। এইগুলি কীভাবে মোকাবেলা করতে হয় তা আমি আপনাকে জানাতে দেব।

EDIT1: ক্যামেরার অরথনোমাল ভেক্টরকে কীভাবে পুনরায় গণনা করা যায়

আপনি ইতিমধ্যে ক্যামেরার দিকটি জানেন ((ক্যামেরাপোস - ফোকাসপয়েন্ট)। সাধারণ করুন ())। এখন ধরে নিন যে আপনার ক্যামেরার আপটি + ই (বা ডাব্লু / ই আপনার বিশ্বের বর্তমান অক্ষটি ... এটি আপনার উপর নির্ভরশীল)। এখন কেবল ক্রস দিক দিয়ে আপ পেতে অধিকার । সম্পন্ন? নাঃ! আপনার আপ ভেক্টর অন্য দুটির পক্ষে আর আর্থোগোনাল নয়। এটি ঠিক করার জন্য, দিকনির্দেশ সহ ডানদিকে ক্রস করুন এবং আপনি আপনার নতুন আপ পান

দ্রষ্টব্য যে গ্রাম-শ্মিড্ট প্রকৃতপক্ষে ভেক্টরগুলিকে অর্থোন্নত করতে ব্যবহার করা উচিত।

আবার, এই যেমন আদেশ সহকারে একটি নোট নিতে কিছু ক্ষেত্রে কাজ করতে ব্যর্থ হবে ( দিক সমান্তরাল আপ উদাহরণস্বরূপ)।


মনে রাখবেন যে ডান ভেক্টর ব্যবহার করে normalize(up ^ camFocusVector)(বা বাম দিকে এর বিপরীতে) ব্যবহার করা যেতে পারে ।
সাম হোচেভার

এখনও অবধি ভাল লাগছে, বাম / ডান রোটেশনের জন্য সুন্দরভাবে কাজ করেছেন (আমার কাছে খুব সহজ ভেক্টর রয়েছে তাই সহজ)। আপনার মন্তব্য @ স্যাম হোসেভারে '^' এর অর্থ কী? যে ক্রস পণ্য? এছাড়াও, অনুবাদগুলি তৈরি করার পরে আমি কীভাবে আপ ভেক্টরকে পুনরায় সংশোধন করতে পারি?
লুক

@ লুক: আমার ইডিআইটি 1 টি দেখুন
সমরসা

1
@ সমরসায় আপনাকে অনেক ধন্যবাদ আপনার সমাধান নিখুঁতভাবে কাজ করে, এবং আমি প্রক্রিয়াটিতে অনেক কিছু শিখেছি!
লুক

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

1

আপনার যা প্রয়োজন তা হ'ল একটি টিপিক্যাল আরকবাল ক্যামেরা, যা মূলত এমন একটি ক্যামেরা যা লক্ষ্য লক্ষ্য রাখে এবং আপনাকে লক্ষ্যটিকে প্রায় "গোলাকৃতির" উপায়ে ক্যামেরাটি স্থানান্তর করতে দেয়।

এটি এক্সএনএ-তে রয়েছে তবে আইআইআরসি আমি আগেও এই বাস্তবায়নটি ব্যবহার করেছি এবং এটি বেশ ভালভাবে কাজ করেছে:

http://roy-t.nl/index.php/2010/02/21/xna-simple-arcballcamera/


যে বাস্তবায়ন শুধুমাত্র ডান ভেক্টর, যার ছোট মানের জন্য একটি arcball আনুমানিক হবে বরাবর সরাসরি সরাতে মনে হচ্ছে পরিমাণ । আমি লাকএট পয়েন্টটিও সরিয়ে নিয়েছি, যেখানে আমি ক্যামেরাটি সরিয়ে নিতে চাই (কাছাকাছি, তবে ভিন্নভাবে আলাদা)। আমি বিশ্বাস করি যে সমরসা এটি অর্জনের সহজতম সম্পূর্ণ উপায় সরবরাহ করেছে।
লুক

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

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

0

প্রায় এক বিন্দু ঘোরার জন্য আমার কোডটি এখানে পাওয়া গেছে, আমি নিজেকে এটি অনেকটা পুনরায় ব্যবহার করছি।

float distance;      // Straight line distance between the camera and look at point

// Calculate the camera position using the distance and angles
float camX = distance * -sinf(camAngleX*(M_PI/180)) * cosf((camAngleY)*(M_PI/180));
float camY = distance * -sinf((camAngleY)*(M_PI/180));
float camZ = -distance * cosf((camAngleX)*(M_PI/180)) * cosf((camAngleY)*(M_PI/180));

// Set the camera position and lookat point
gluLookAt(camX,camY,camZ,   // Camera position
          0.0, 0.0, 0.0,    // Look at point
          0.0, 1.0, 0.0);   // Up vector

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

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

আমি এখানে ক্যামেরার কোণগুলি কীভাবে পাব?
রাফভাস্ক

0

এটি অর্জনের জন্য এই খুব সাধারণ অ্যালগরিদটি বেশ দুর্দান্ত:

আপনার সম্পর্কে কেন্দ্রের পয়েন্ট হওয়া পয়েন্টটি ঘুরতে চান ("দেখুন" বা "লক্ষ্য" পয়েন্ট):

translate(-P)

rotate horizontal
rotate vertical

translate(P)

আমি এটি ব্যবহার করেছিলাম।

উত্সটি বোন-সাইটের স্ট্যাকওভারফ্লোতে পাওয়া গেছে: /programming/287655/opengl-rotating-a-camera-around-a- point

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