ধীরে ধীরে গতির সাথে A (x, y) থেকে বি (x1, y1) এ সরানো হচ্ছে?


21

আমার কাছে বর্তমানে এর মতো কিছু রয়েছে:

float deltaX = point0.getX() - point1.getX();
float deltaY = point0.getY() - point1.getY();

এবং প্রতি 0.01 সেকেন্ডে আমি আমার অবজেক্টের অবস্থানটি এভাবে রিফ্রেশ করি:

object.setPosition(object.getX()-deltaX/100,object.getY()-deltaY/100);

সুতরাং এটি আমার পয়েন্টটি 1 সেকেন্ডে পয়েন্ট 1 থেকে পয়েন্ট 1 এ সরিয়ে দেয়। ধ্রুবক গতিতে পয়েন্ট 1 এর মুখোমুখি (দিকের দিকে) পয়েন্ট 0 থেকে অবজেক্টটি সরাতে সক্ষম হওয়ার জন্য আমার 2 পয়েন্ট থাকা দরকার। সুতরাং, আমার যখন আমার প্রাথমিক বিন্দুর নিকটবর্তী হবে তখন বস্তুটি একই গতিতে তার দিকে এগিয়ে যাবে যদি আমার আরও দূরে থাকে তবে এটি হয়। কোন পরামর্শ প্রশংসা করা হয়। ধন্যবাদ।


সম্ভাব্য সদৃশ: গেমদেব.স্ট্যাকেক্সচেঞ্জ / প্রশ্নগুলি / ২৩৪30০/২ আমি অন্য প্রশ্নের যে উত্তর দিয়েছিলাম সেভাবে আমি পোস্ট করব। তবে এটি আমার অংশটি নির্লজ্জ হবে।
গুস্তাভো ম্যাকিয়েল

উত্তর:


26

আমি কিছু লিনিয়ার বীজগণিত কাঠামো ব্যবহার করব যেহেতু অপারেশনগুলি এভাবে বর্ণনা করা সহজ। আপনি যদি এই ভেক্টর অপারেশনগুলি কীভাবে বাস্তবায়ন করতে না জানেন তবে আমি শেষে একটি দ্রুত ব্যাখ্যা দেব।

সুতরাং আসুন আমরা এই মানগুলি দিয়ে শুরু করার কথা বলি: startএবং endআন্দোলনের শেষ পয়েন্টগুলি চিহ্নিত করুন speedএটি কত পিক্সেল সেকেন্ডে স্থানান্তরিত হবে এবং elapsedএটি হ'ল হার যা আপনি আপনার অবজেক্টের অবস্থান আপডেট করবেন (কিছু ইঞ্জিন ইতিমধ্যে আপনার জন্য এই মানটি সরবরাহ করে ):

Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;

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

float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;

তারপর আপনার আপডেটের পদ্ধতির উপর, আপনি একটি গুণ যোগ করে বস্তু সরাতে direction, speedএবং elapsedতার অবস্থান করতে। এরপরে, চলাচল শেষ হয়েছে কিনা তা পরীক্ষা করতে আপনি দেখতে পাবেন যে সূচনা পয়েন্ট এবং অবজেক্টের বর্তমান অবস্থানের মধ্যবর্তী দূরত্বটি আপনি গণনা করা প্রাথমিক দূরত্বের চেয়ে বেশি is যদি এটি সত্য হয় তবে আমরা অবজেক্টের অবস্থান শেষ বিন্দুতে স্ন্যাপ করব এবং অবজেক্টটি স্থানান্তর করা বন্ধ করব:

if(moving == true)
{
    object.Position += direction * speed * elapsed;
    if(Vector2.Distance(start, object.Position) >= distance)
    {
        object.Position = end;
        moving = false;
    }
}

দ্রুত ভেক্টর অপারেশনস রেফারেন্স

প্রতিনিধিত্ব

Vector2 A = float aX, aY;

যোগফল / বিয়োগ

A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;

স্কেলারের দ্বারা গুণ করুন (ভাসা)

A*float = a.x*float; a.y*float;

দৈর্ঘ্য / দূরত্ব

length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)

নিয়মমাফিক করা

normalize(A) = a.X/length(A); a.Y/length(A);

উপরোক্ত কোডটি আপনার কাছে কোনও Vectorক্লাস উপলব্ধ না থাকলে নিয়মিত ক্রিয়াকলাপে রূপান্তর করার জন্য এটি পর্যাপ্ত হওয়া উচিত ।


রূপান্তর উদাহরণ

// Your Variables
float startX, startY, endX, endY;
float speed = 100;
float elapsed = 0.01f;

// On starting movement
float distance = Math.sqrt(Math.pow(endX-startX,2)+Math.pow(endY-startY,2));
float directionX = (endX-startX) / distance;
float directionY = (endY-startY) / distance;
object.X = startX;
object.Y = startY;
moving = true;

// On update
if(moving == true)
{
    object.X += directionX * speed * elapsed;
    object.Y += directionY * speed * elapsed;
    if(Math.sqrt(Math.pow(object.X-startX,2)+Math.pow(object.Y-startY,2)) >= distance)
    {
        object.X = endX;
        object.Y = endY;
        moving = false;
    }
}

1
@ ফোফোল সেজন্য আমি শেষে ভেক্টরগুলিতে ব্যাখ্যাটি দিয়েছি। উত্তরটি জেনেরিক হওয়ার কথা ছিল। আপনার যদি ভেক্টর শ্রেণি না থাকে তবে দুটি পৃথক ফ্লোট ব্যবহার করুন। উদাহরণস্বরূপ Vector2 start;হয়ে যায় float startX, startY;। এবং আপনি সহজেই দূরত্বটি ম্যানুয়ালি গণনা করতে পারেন, যেমন আমি শেষে ব্যাখ্যা করি। অর্থাৎ float dX = bX - aX; float dY = bY - aY; float distance = Math.sqrt(dx*dx+dy*dy);
ডেভিড গাউভিয়া

@ ফ্যাফোল সম্পাদনাটি দেখুন, আমি একটি উদাহরণ যুক্ত করেছি। যদিও আমি কিছু মিস করেছি কিনা তা নিশ্চিত নই।
ডেভিড গৌভিয়া

3 বছর পরে এবং আপনি কেবল আমাকে ভেক্টরগুলির সাহায্যে কীভাবে বস্তুগুলি স্থানান্তর করতে হবে তা আমাকে বোঝানোর জন্য তৈরি করেছেন। চিয়ার্স!
অলিভার শোনিং

3

একটি ভেক্টর তৈরি করুন এবং এটি স্বাভাবিক করুন। সতর্কতা, কিছু ভুল নম্বর সহ সিউডো কোড:

Vector = new Vector(point0.getX() - point1.getX(), point0.getY() - point1.getY());

এটি আপনাকে এর মতো ভেক্টর দেবে:

25.96; 85.41

এখন ভেক্টরটিকে স্বাভাবিক করুন এবং আপনি এটি পাবেন :

0.12; 0.75

এখান থেকে এটি আপনার ব-দ্বীপের মতো একই আন্দোলন।


2

আমার উত্তরটি অনুলিপি করে আটকানো হয়েছে: দুটি পয়েন্টের মধ্যে একটি লাইনে পয়েন্ট পান

সিউডোকোডে:

speed_per_tick = 0.05 //constant speed you want the object to move at
delta_x = x_goal - x_current
delta_y = y_goal - y_current
goal_dist = sqrt( (delta_x * delta_x) + (delta_y * delta_y) )
if (dist > speed_per_tick)
{
    ratio = speed_per_tick / goal_dist
    x_move = ratio * delta_x  
    y_move = ratio * delta_y
    new_x_pos = x_move + x_current  
    new_y_pos = y_move + y_current
}
else
{
    new_x_pos = x_goal 
    new_y_pos = y_goal
}

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