প্রথমত, আমার অঙ্কন সমস্যাটি ঠিক কী তা আমি জানি এবং এটির সমাধানে কীভাবে যোগাযোগ করা যায় সে সম্পর্কে আমার বিভিন্ন ধারণা রয়েছে। আমি এখানে কোন ফ্রেমটি আঁকতে হবে তা সামঞ্জস্য করতে কীভাবে আইসোমেট্রিক "বিভ্রম" বজায় থাকবে তা নির্ধারণ করতে এখানে এসেছি am
আমি একটি 2 ডি লিখছি, পাখি-চোখের খেলা গেম যা মহাকাশে স্থান নেয়। আমি এমন একটি পৃথিবীতে আইসোমেট্রিক গ্রাফিক্স ব্যবহার করার চেষ্টা করছি যেখানে isতিহ্যবাহী আইসোমেট্রিক গেমসের মতো গেম জগতের কোনও ঘূর্ণন নেই (মনে রাখবেন, গেমটি স্থানটিতে স্থান নেয়, কোনও অঞ্চল নেই)। এখানে একটি উদাহরণ স্প্রিট যা আমি ব্যবহার করার চেষ্টা করছি তা: http : // सेल. stat- Life.com/images/stories/AteroidOutpost/Spaceship64.png এর নিজস্ব উল্লম্ব অক্ষ সম্পর্কে প্রায় 35৪ ডিগ্রি ঘড়ির সাথে দেখা হচ্ছে 35 ডিগ্রি (ওরফে, ISO)। ইমেজ জেনারেট ছিল, তাই এই করতে পরিবর্তন করা।
স্পষ্টতার স্বার্থে, আমি স্থির করেছি যে উত্তর (উপরে) 0 ডিগ্রি এবং পূর্ব (ডান) 90
আমার সমস্যা যে আমার পরী সবসময় না চেহারা যেখানে খেলা মনে করে এটি ব্যবহৃত 3D প্লেন মধ্যে একটি পার্থক্য কারণে মত মুখোমুখি হচ্ছে। আমি পরিভাষাটি সঠিকভাবে ব্যবহার করছি কিনা তা নিশ্চিত নয় তবে আমার স্পেসশিপটি একটি বিমানে আবর্তিত হয়েছিল এবং ভিউ প্লেনটি তার নিজস্ব বিমানে জিনিসগুলি ঘোরানোর প্রত্যাশা করছে। সমস্যার একটি চিত্র এখানে দেওয়া হল:
http://सेल.stat- Life.com/images/stories/AteroidOutpost/ProicationIssue.png বামদিকে আমার পাশের দৃষ্টিভঙ্গি রয়েছে, ডানদিকে আমার উপরের-ডাউন দর্শন রয়েছে। শীর্ষে, আমার কাছে বিশ্বের স্পেস শিপ / স্প্রিট শিট ভিউ রয়েছে। নীচে, আমার কাছে স্প্রাইট যা দেখায় তা আছে স্ক্রিনে কেমন ।
উপরের ডানদিকে কীভাবে আমার স্পেসশিপটি ঘোরানো হয়েছিল (প্রতিটি ফ্রেমের মধ্যে এমনকি ডিগ্রি পৃথকীকরণ) এর সরলিকৃত সংস্করণ। নীচে ডানদিকে স্প্রাইটটি দেখতে পেল এমন একটি কোণ যা পর্দার উপর একটি নির্দিষ্ট কোণ আঁকলে দেখা যাচ্ছে facing সমস্যাটি প্রায় 45 ডিগ্রীতে সবচেয়ে স্পষ্ট। এখানে একটি চিত্র যা একটি "স্ক্রিন প্লেন" লাইন দ্বারা আবৃত রয়েছে যা জাহাজটি যে মুখের মুখোমুখি হওয়ার কথা ছিল তার দিকে নির্দেশ করা হয়েছে: লাল রেখাটি সর্বদা জাহাজের মতো ঠিক একই দিকে নির্দেশ করা উচিত তবে আপনি দেখতে পাচ্ছেন, অভিক্ষেপ সমস্যাটি একটি সমস্যা তৈরি করছে। আমি আশা করি আমি বিষয়টি যথেষ্ট ভালভাবে বর্ণনা করছি।
সম্পাদনা: লাল রেখাটি স্ক্রিনের বিমানটিতে আবর্তিত হয়, যখন স্পেস শিপটি "শিপ প্লেন" এ আবর্তিত হয়, সুতরাং এটি যখন আঁকানো হয় তখন জাহাজের কোণ এবং পর্দার কোণের মধ্যে বড় পার্থক্য। শেষ সম্পাদনা
এটি অদ্ভুত লাগছে যখন এই জাহাজটি একটি লক্ষ্যে একটি লেজার রশ্মির শুটিং করছে যা একপাশে চলে গেছে, যখন সরাসরি সামনে শুটিং করা উচিত।
সুতরাং ... আমি যে সমাধানগুলি নিয়ে এসেছি সেগুলি হ'ল:
- আইসোমেট্রিক ভিউ জাল করার চেষ্টা বন্ধ করুন, বড় হন বা বাড়িতে যান। ইতিমধ্যে আমার বিশ্বকে ঘোরান। (পিএস: এটি আমার সমস্যার সমাধান করবে, তাই না?)
- আমার স্প্রিট শীটটি (কোনওভাবে) এমন ফ্রেম রাখতে পরিবর্তন করুন যা "স্ক্রিন এঙ্গেল" উপস্থাপন করে যা মডেলটি দেখবে। সুতরাং আমি যখন 45 ডিগ্রি চিত্রের জন্য জিজ্ঞাসা করি তখন এটি দেখতে পর্দার 45 ডিগ্রির মুখোমুখি হয়।
- "স্বাভাবিক" ফ্রেমটি ধরা মজাদার দেখাবে তা জেনেও স্প্রাইট শীট থেকে আলাদা ফ্রেম ধরার জন্য আমার স্প্রাইট রেন্ডারিং সিস্টেমটি পরিবর্তন করুন some সুতরাং 45 ডিগ্রি ফ্রেমটি ধরার পরিবর্তে এটি ... 33 ডিগ্রি ফ্রেমটি ধরে ফেলবে (কেবল অনুমান করা) যাতে এটি দেখতে লাগে ব্যবহারকারীর কাছে সঠিক ।
- শুধু 3D ব্যবহার করুন! এটা অনেক সহজ মানুষ
একটির জন্য: আপনি কোন সমাধানটি সুপারিশ করবেন? আমি ভুল হয়েছি যদিও আমি জানি 2 এর দিকে ঝুঁকছি। মনে রাখবেন স্প্রাইট জেনারেশন সরঞ্জামটিতে আমার সম্পূর্ণ অ্যাক্সেস রয়েছে। পদ্ধতি 3 আমার দ্বিতীয় পছন্দ হবে। এই দুটি পদ্ধতির জন্যই আমার কাঙ্ক্ষিত ফলাফল পেতে আমি কোণ (গুলি) -এ কিছু গণিত প্রয়োগ করতে পারি। বিটিডব্লিউ, আমি সেখানে রসিকতা হিসাবে # 4 যুক্ত করেছি, আমি 3D তে যেতে চাই না।
দু'জনের জন্য: 2 বা 3 পদ্ধতি ব্যবহার করে, কীভাবে আমি ইনপুট বা আউটপুট কোণগুলি সামঞ্জস্য করব? আমি 3D প্রজেকশন এবং 3 ডি ম্যাট্রিক্স (2D ম্যাট্রিক্স একা ছেড়ে দাও) দিয়ে খুব ভাল নই, এবং আমার পছন্দসই ফলাফল অর্জনের জন্য অন্য যে কোনও ম্যাথ ব্যবহার করা যেতে পারে।
এখানে উচ্চস্বরে চিন্তা করা: আমি যদি জাহাজটি যে দিকে যেতে চাই (পর্দার বিমানে) যে দিকে যেতে চাই সেদিকে আমি যদি ইউনিট ভেক্টর নিয়ে যাই, তবে জাহাজের সমতলে এটি প্রজেক্ট করুন, তারপরে অনুমান করা রেখা এবং সমতলটির মধ্যবর্তী কোণটি কী তা নির্ধারণ করুন উত্তরটি হ'ল, আমি যে জাহাজের গ্রাফিকটি প্রদর্শন করতে চাইছি তার কোণটি থাকা উচিত। রাইট? (# 3 এর সমাধান?) মানুষ ... আমি এটি কাজ করতে পারি না।
সম্পাদনা করুন:
আমি জানি সমস্যা তাই আমি বিষয়টি প্রদর্শন করে আমার পরী লাইব্রেরী ভিসুয়াল পরীক্ষক মেনে স্ট্যাটিক ইমেজ সঙ্গে ঠাহর করা কষ্টকর: http://cell.stat-life.com/downloads/SpriteLibVisualTest.zip এটি প্রয়োজন XNA 4.0 এই অ্যাপ্লিকেশনটি হয় কেবল স্প্রিটকে ঘোরানো, এবং এর কেন্দ্র বিন্দু থেকে বাইরের দিকে কোণে একটি রেখা আঁকা গেমটি মনে করে যে জাহাজটির মুখোমুখি হওয়া উচিত।
8 সেপ্টেম্বর সম্পাদনা করুন
আমার "উচ্চস্বরে চিন্তা করা" অনুচ্ছেদ থেকে চালিয়ে যাওয়া: প্রজেকশনটি ব্যবহার করার পরিবর্তে (কারণ এটি কঠিন বলে মনে হচ্ছে) আমি ভাবছি যে আমি উত্তরমুখী ইউনিট ভেক্টর (0x, 1y, 0z) নিতে পারি, এটিকে কোণে ঘোরানোর জন্য একটি ম্যাট্রিক্স ব্যবহার করতে পারি স্প্রাইটটি আসলে মুখোমুখি হচ্ছে, তারপরে আবার এটিকে "দেখার বিমান" থেকে এক্স অক্ষের চারপাশে "স্প্রাইট প্লেন" তে ঘোরান, তারপরে ... সমতল? ভেক্টরটি (কেবলমাত্র এটি প্রজেক্ট করুন) কেবল এক্স এবং ওয়াই (জেড উপেক্ষা করে) ব্যবহার করে দেখার প্লেনে ফিরে যেতে হবে। তারপরে সেই নতুন সমতল ভেক্টরটি ব্যবহার করে, আমি এর কোণটি নির্ধারণ করতে এবং এটি ... কিছু একটা ব্যবহার করতে পারি। আমি আরও পরে চিন্তা করব।
8 সেপ্টেম্বর সম্পাদনা (2)
আমি কিছুটা সাফল্যের সাথে উপর থেকে আমার ধারণা অনুসরণ করার চেষ্টা করেছি, হ্যাঁ! সুতরাং ... এটি আমার স্পেসশিপ থেকে সরাসরি বেরিয়ে আসার মতো দেখতে একটি লাল রেখা পেতে (কেবলমাত্র পরীক্ষার উদ্দেশ্যে), আমি নিম্নলিখিতগুলি করেছি:
Vector3 vect = new Vector3(0, 1, 0);
vect = Vector3.Transform(vect, Matrix.CreateRotationZ(rotation));
vect = Vector3.Transform(vect, Matrix.CreateRotationY((float)((Math.PI / 2) - MathHelper.ToRadians(AngleFromHorizon))));
Vector2 flattenedVect = new Vector2(vect.X, vect.Y);
float adjustedRotation = (float)(getAngle(flattenedVect.X, flattenedVect.Y));
rotation
স্ক্রিন এঙ্গেলটি কোথায় এবং adjustedRotation
এখন সেই স্ক্রিন কোণটি স্প্রাইট বিমানের দিকে দেখায়। আমি জানি না কেন আমার পরিবর্তে এক্সের পরিবর্তে ওয়াই ঘোরানো দরকার, তবে সম্ভবত 3D এর সাথে এমন কিছু করার দরকার যা আমি জানিনা।
সুতরাং, এখন আমার কাছে অতিরিক্ত টুকরো তথ্য রয়েছে, তবে আরও উপযুক্ত ফ্রেম বাছতে আমি কীভাবে এটি ব্যবহার করব? সম্ভবত ভিউ প্লেন থেকে স্প্রাইট প্লেনে ঘোরার পরিবর্তে, আবার প্রজেক্ট করার পরিবর্তে আমার অন্যভাবে এটি করার চেষ্টা করা উচিত। সমন্বিত লাল রেখার সাথে আমার স্প্রিটটি এখানে, তবে আমি যা করতে চাই তা হ'ল লাইনটি নয়, মডেলটি সামঞ্জস্য করা: http : //सेल.stat- Life.com/images/stories/AteroidOutpost/Spaceship64RedLineCorreected.png
সম্পাদনা সেপ্টেম্বর 9
HORAY! এটা ঠিক! আমি এটি ঠিক করতে কী করেছি তা বর্ণনা করব:
আমি ই-বিজনেসের পরামর্শ এবং বিশ্ব সমন্বয় ব্যবস্থা (বা প্রসারিত ...?) দ্বারা "স্কোয়াড" অনুসরণ করেছি। এটি মূলত সমাধান # 1, যদিও আমি এই ধারণাটির মধ্যে ছিলাম যে আমার পর্দার সমন্বয় সিস্টেমের সাথে আমার বিশ্ব সমন্বয় ব্যবস্থাটি ঘোরানো হবে। সত্য না! উপরে এখনও + y, এবং ডান এখনও + এক্স। বিশ্ব এবং স্ক্রিন স্থানাঙ্কের মধ্যে সঠিকভাবে রূপান্তর করতে আমি আমার ওয়ার্ল্ডটোস্ক্রিন এবং স্ক্রিনটো ওয়ার্ল্ড পদ্ধতি পরিবর্তন করেছি। এই পদ্ধতিগুলি সর্বোত্তম নাও হতে পারে তবে আমার কোডবেসে কেবলমাত্র দুটি পদ্ধতি এখানে পরিবর্তন করতে হয়েছিল।
public Vector2 ScreenToWorld(float x, float y)
{
float deltaX = x - (size.Width / 2f);
float deltaY = y - (size.Height / 2f);
deltaX = deltaX * scaleFactor / (float)Math.Sqrt(3);
deltaY = deltaY * scaleFactor;
return new Vector2(focusWorldPoint.X + deltaX, focusWorldPoint.Y + deltaY);
}
public Vector2 WorldToScreen(float x, float y)
{
float deltaX = x - focusWorldPoint.X;
float deltaY = y - focusWorldPoint.Y;
deltaX = deltaX / scaleFactor * (float)Math.Sqrt(3);
deltaY = deltaY / scaleFactor;
return new Vector2(size.Width / 2f + deltaX, size.Height / 2f + deltaY);
}
ঐটা এটা ছিল! এই দুটি পদ্ধতির পরিবর্তন অন্য সমস্ত কিছুর উপর প্রভাব ফেলে: আমি কী দেখছিলাম, কোথায় আঁকানো বস্তু, যেখানে আমি ক্লিক করছি, সবকিছু। আমার স্পেসশিপ এখন সরাসরি লক্ষ্য করছে যে এটি শুটিং করছে এবং যা কিছু জায়গায় পড়েছে তার দিকে সরাসরি নজর দেয়। আমি অর্থোগ্রাফিক প্রজেকশন নিয়ে পরীক্ষা-নিরীক্ষা করব, দেখুন এটি সবকিছুকে আরও 'বাস্তব' বলে মনে করে কিনা।