আমার অবজেক্টটি 90 ডিগ্রির চেয়ে 45 ডিগ্রি গতিতে কেন সরবে?


32

আমার গেমটিতে আমার কাছে এমন অবজেক্ট রয়েছে যা 45 ডিগ্রি এবং তারপরে 90 ডিগ্রীতে দ্রুত চলে।

প্রতিটি বস্তুর আছে

  • পয়েন্ট (x, y) অবস্থান
  • ভেক্টর 2 ডি (x, y) দিক
  • ইন্টার স্পিড

এবং একটি আপডেটের সময় আমি যা করি তা হ'ল নতুন অবস্থান হিসাবে গণনা করা হয়:

position.x += direction.x * speed
position.y += direction.y * speed

আমি কীভাবে এটি সংশোধন করব? আমি চাই যে এটি কোনও গতিতে একই গতিতে অগ্রসর হয়।


8
ব্যবহারের আগে আপনার দিকনির্দেশক ভেক্টরকে সাধারণ করুন; সমস্যা সমাধান.
মিথ্যাচারিত


: আর আপনি যদি এই বস্তু নিয়ন্ত্রণ করতে ব্যবহারকারীর ইনপুট ব্যবহার করছেন, 12,3,6,9 নির্দেশ লক এখানে XNA devs জন্য ব্যাখ্যা সচেতন হতে xona.com/2010/05/03.html । এটি আপনি চান এমন কিছু হতে পারে (যেমন কোনও আরপিজি গেমের মধ্যে) বা না (যেমন জ্যামিতি ওয়ার্স স্টাইল গেমের ক্ষেত্রে)।
Xonatron

পুরানো খেলা বংশদ্ভুত মধ্যে , এটি একটি বৈশিষ্ট্য ছিল ।
জে হোমস

উত্তর:


55

এটি পাইথাগোরিয়ান উপপাদ্য দিয়ে ব্যাখ্যা করা যেতে পারে , যা নিম্নলিখিত সূত্রটি:

a² + b² = c²

আপনার ক্ষেত্রে, ডানদিকে চলার সময়, আপনি (x: 1, y: 0) ব্যবহার করছেন যা আমাদের দেয়

c² = 1 + 0 = 1
c = sqrt(1) = 1.00

উপরে এবং ডানে সরে যাওয়ার সময়, আপনি (x: 1, y: 1) ব্যবহার করছেন যা আমাদের দেয়

c² = 1 + 1 = 2
c = sqrt(2) = 1.41

যেমন আপনি দেখতে পাচ্ছেন, ত্রিভুজ দৈর্ঘ্যটি কার্ডিনাল অক্ষের দৈর্ঘ্যের চেয়ে দীর্ঘ।

অন্যরা যেমন উল্লেখ করেছে, আপনার কেবল আপনার দিকনির্দেশক ভেক্টরকে স্বাভাবিক করা উচিত। আপনি যদি এক্সএনএ ব্যবহার করেন তবে এটি এটির মতো হয়ে গেছে:

var normalizedDirection = direction;
normalizedDirection.Normalize();
position += normalizedDirection * speed

আমার প্রশ্নে আপনার সহায়তার জন্য আমি আপনাকে +1 দিচ্ছি :)
মার্টিন।

12

ব্যবহারের আগে আপনার দিকনির্দেশক ভেক্টরটিকে সাধারণ করুন।

মাইন্ড ওয়ারাক্স ব্যাখ্যা অনুসারে, এটিকে সহজভাবে বোঝা যেতে পারে, যদি আপনার দিকনির্দেশক ভেক্টর সম্ভবত আপনার শোক দেওয়ার বিষয়ে উদ্বিগ্ন হন তবে নিশ্চিত হন যে তারা ইউনিট ভেক্টর (দৈর্ঘ্যের দৈর্ঘ্য 1)।

Length(Vector2(1, 1)) == 1.4142135623730951 // first hint of grief
Length(Vector2(1, 0)) == 1

Vector2(1, 1) * 2 == Vector2(2, 2)
Vector2(1, 0) * 2 == Vector2(2, 0)

Length(Vector2(2, 2)) = 2.8284271247461903 // second hint
Length(Vector2(2, 0)) = 2

যদি সাধারণ করা হয়:

normal(Vector2(1, 1)) == Vector2(0.707107, 0.707107)
Length(Vector2(0.707107, 0.707107)) == 1 // perfect

14
সহায়ক উত্তর নয়। প্রশ্নকারী যদি "আপনার দিকনির্দেশক ভেক্টরকে সাধারণীকরণ" বলতে বোঝায় তবে তিনি প্রশ্ন জিজ্ঞাসা করবেন না।
ক্রিস্টোফার জনসন

@ ক্রিস্টোফার জনসন এটি পরিষ্কার করেননি যে প্রশ্নকারী কোনও ভেক্টরকে কীভাবে সাধারণ করতে পারবেন তা জানেন না। তবুও প্রশ্নকর্তা যথেষ্ট সম্পদশালী বলে মনে হচ্ছে এটি কোনওভাবেই আসে না।
ডিসলেরেটকাভিয়ার

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

6

আপনি কিভাবে আপনার দিক নির্ণয় করছেন? যদি 45 ডিগ্রি হয় (1,1), তবে এটি অবশ্যই 90 ডিগ্রির চেয়ে দ্রুত হতে চলেছে (1,0)

আমি আপনাকে এই জাতীয় কিছু ব্যবহার করার পরামর্শ দিচ্ছি:

direction.x = Math.Cos(angleInRadians);
direction.y = Math.Sin(angleInRadians);

রেডিয়ানে কোণ পেতে, আপনাকে আপনার ডিগ্রিগুলি PI / 180আরও ভাল বা আরও উন্নত করতে হবে, ব্যবহার করতে হবে MathHelper। যেমন।

angleInRadians = 45.0 * Math.PI / 180.0; // first method
angleInRadians = MathHelper.ToRadians(45f); //second method

6

জেসন,

তিনটি অবজেক্ট অ্যাট্রিবিউট থাকার চেয়ে,

  • পয়েন্ট (x, y) অবস্থান
  • ভেক্টর 2 ডি (x, y) দিক
  • ইন্টার স্পিড

দিক এবং গতিটি বেগ বেগের সাথে একত্রিত করা প্রায়শই অনেক সহজ। তারপরে আপনার দুটি মাত্র বৈশিষ্ট্য রয়েছে,

  • পয়েন্ট (x, y) অবস্থান
  • ভেক্টর 2 ডি (এক্স, ওয়াই) বেগ

অবস্থান আপডেট হচ্ছে

যখন আপনাকে অবজেক্টের অবস্থান আপডেট করতে হবে তখন এটি এতটা সহজ:

position.x += velocity.x * Δt;
position.y += velocity.y * Δt;

যেখানে Δtবা সময় পার্থক্য - - বা সময় পদক্ষেপ আপনার সময় ব-দ্বীপ নয়।

অবস্থান এবং বেগ আপডেট করা হচ্ছে

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

position.x += (velocity.x * Δt) + (0.5 * acceleration.x * Δt * Δt);
position.y += (velocity.y * Δt) + (0.5 * acceleration.y * Δt * Δt);

velocity.x += acceleration.x * Δt;
velocity.y += acceleration.y * Δt;

(এটি মূলত ফিজিক্স 101 এর s = vt + ²at² সূত্র)

গতি প্রয়োগ করা হচ্ছে

আপনি যদি কিছু স্বাভাবিক দিকটিতে প্রদত্ত গতি প্রয়োগ করতে চান তবে আপনি বেগটি এভাবে সেট করতে পারেন:

velocity.x = normalizedDirection.x * speed;
velocity.y = normalizedDirection.y * speed;

একটি গতি ডাইরিং

এবং যদি আপনাকে বিপরীতটি করতে হয় - প্রদত্ত বেগ ভেক্টর থেকে গতি এবং দিকনির্দেশ - আপনি কেবল পাইথাগোরিয়ান উপপাদ্য বা .Length()পদ্ধতিটি ব্যবহার করতে পারেন :

speed = velocity.Length();

এবং একবার গতিটি জানা গেলে, গতি দ্বারা গতি বিভাজক করে (শূন্য দ্বারা বিভাজন এড়াতে সতর্কতা অবলম্বন করে) স্বাভাবিক দিকটি গণনা করা যেতে পারে:

if (speed != 0) {
    normalizedDirection.x = velocity.x / speed;
    normalizedDirection.y = velocity.y / speed;
} else {
    normalizedDirection.x = 0;
    normalizedDirection.y = 0;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.