বল পদার্থবিজ্ঞান: বলটি বিশ্রামে আসার সাথে সাথে চূড়ান্ত বাউন্সগুলি মসৃণ করে


12

আমি আমার সামান্য বাউন্সিং বলের খেলায় অন্য সমস্যার বিরুদ্ধে এসেছি।

আমার বলটি যখন বিশ্রামে আসবে তখন শেষ মুহুর্তগুলি ব্যতীত সূক্ষ্মভাবে ঘুরে বেড়াচ্ছে। বলের চলাচল মূল অংশের জন্য মসৃণ তবে শেষের দিকে, বলটি পর্দার নীচে স্থির হয়ে যাওয়ার জন্য কিছুক্ষণের জন্য ঝাঁকুনি দেয়।

আমি বুঝতে পারি যে এটি কেন ঘটছে তবে আমি এটি মসৃণ করতে পারছি না।

আমি প্রস্তাব দেওয়া যেতে পারে যে কোনও পরামর্শের জন্য কৃতজ্ঞ।

আমার আপডেট কোডটি হ'ল:

public void Update()
    {
        // Apply gravity if we're not already on the ground
        if(Position.Y < GraphicsViewport.Height - Texture.Height)
        {
            Velocity += Physics.Gravity.Force;
        }            
        Velocity *= Physics.Air.Resistance;
        Position += Velocity;

        if (Position.X < 0 || Position.X > GraphicsViewport.Width - Texture.Width)
        {
            // We've hit a vertical (side) boundary
            // Apply friction
            Velocity *= Physics.Surfaces.Concrete;

            // Invert velocity
            Velocity.X = -Velocity.X;
            Position.X = Position.X + Velocity.X;
        }

        if (Position.Y < 0 || Position.Y > GraphicsViewport.Height - Texture.Height)
        {
            // We've hit a horizontal boundary
            // Apply friction
            Velocity *= Physics.Surfaces.Grass;

            // Invert Velocity
            Velocity.Y = -Velocity.Y;
            Position.Y = Position.Y + Velocity.Y;
        }
    }

সম্ভবত আমারও এটি উল্লেখ করা উচিত Gravity, Resistance Grassএবং Concreteসব ধরণের Vector2


কেবল এটি নিশ্চিত করতে: বলটি যখন কোনও পৃষ্ঠকে আঘাত করে আপনার "ঘর্ষণ" একটি মান <1, যা মূলত পুনরুদ্ধারের সহগটি সঠিক?
জর্জি লিটাও

@ জেসিএলিটো - সঠিক।
স্টে

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

অনুগ্রহ পরিচালনা করার পক্ষে এটি একটি খারাপ উপায়, মূলত আপনি বলছেন যে আপনি নিজেকে বিচার করতে পারবেন না তাই আপনি উপভোগকারীদের সিদ্ধান্ত নিতে দিন ... যাইহোক, আপনি যা अनुभव করছেন তা একটি সাধারণ সংঘর্ষের ঝাঁকুনি। এটি সর্বাধিক ইন্টারপেনেট্রেশন পরিমাণ, ন্যূনতম বেগ বা 'সীমা'র অন্য কোনও রূপ যা আপনার একবারে পৌঁছেছে তা স্থির করে আপনার রুটিনটি চলাচল বন্ধ করে দেবে এবং অবজেক্টটিকে বিশ্রামে রাখবে। অকেজো চেক এড়ানোর জন্য আপনি নিজের বস্তুগুলিতে বিশ্রামের স্থিতি যুক্ত করতেও পারেন।
ডার্কওয়িংস

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

উত্তর:


19

আপনার পদার্থবিজ্ঞানের সিমুলেশন লুপটি উন্নত করার জন্য প্রয়োজনীয় পদক্ষেপ এখানে।

1. টাইমসটেপ

আপনার কোড সহ আমি যে প্রধান সমস্যাটি দেখতে পাচ্ছি তা হ'ল এটি পদার্থবিজ্ঞানের পদক্ষেপের জন্য অ্যাকাউন্ট করে না। এটি সুস্পষ্ট হওয়া উচিত যে এর সাথে কিছু ভুল আছে Position += Velocity;কারণ ইউনিটগুলি মেলে না। হয় Velocityপ্রকৃতপক্ষে গতি নয়, বা কিছু অনুপস্থিত।

এমনকি যদি আপনার গতিবেগ এবং মাধ্যাকর্ষণ মানগুলি এমনভাবে পরিমাপ করা হয় যা প্রতিটি ফ্রেম এক সময় ইউনিটে ঘটে থাকে 1(যার অর্থ উদাহরণস্বরূপ Velocity আসলে দূরত্বটি এক সেকেন্ডে ভ্রমণ করা হয়েছিল), সময় অবশ্যই আপনার কোডের কোথাও উপস্থিত হওয়া উচিত , হয় স্পষ্টতই (ভেরিয়েবলগুলি স্থির করে যাতে করে) তাদের নামগুলি তারা কী আসলে সঞ্চয় করে) বা স্পষ্টতই (টাইমস্টেপ প্রবর্তন করে ) প্রতিফলিত করে। আমি বিশ্বাস করি সবচেয়ে সহজ কাজটি হচ্ছে সময় ইউনিট ঘোষণা করা:

float TimeStep = 1.0;

এবং যে মানটি এটি প্রয়োজন সেখানেই ব্যবহার করুন:

Velocity += Physics.Gravity.Force * TimeStep;
Position += Velocity * TimeStep;
...

মনে রাখবেন যে কোনও শালীন সংকলক এর দ্বারা গুণাগুলি সহজ করে দেবে 1.0, যাতে অংশটি জিনিসগুলিকে ধীর করে না।

এখন Position += Velocity * TimeStepএখনও ঠিক সঠিক নয় ( কেন এই সমস্যাটি বোঝার জন্য এই প্রশ্নটি দেখুন ) তবে এটি সম্ভবত আপাতত করবে।

এছাড়াও, এই অ্যাকাউন্টে সময় নেওয়া প্রয়োজন:

Velocity *= Physics.Air.Resistance;

এটি ঠিক করতে কিছুটা কৌশলযুক্ত; একটি সম্ভাব্য উপায় হ'ল:

Velocity -= Vector2(Math.Pow(Physics.Air.Resistance.X, TimeStep),
                    Math.Pow(Physics.Air.Resistance.Y, TimeStep))
          * Velocity;

2. ডাবল আপডেট

বাউন্স করার সময় আপনি কী করেন তা পরীক্ষা করুন (কেবলমাত্র প্রাসঙ্গিক কোড দেখানো হয়েছে):

Position += Velocity * TimeStep;
if (Position.Y < 0)
{
    Velocity.Y = -Velocity.Y * Physics.Surfaces.Grass;
    Position.Y = Position.Y + Velocity.Y * TimeStep;
}

আপনি দেখতে পাচ্ছেন যে TimeStepবাউন্সের সময় দুবার ব্যবহৃত হয়। এটি মূলত বলটিকে নিজের আপডেট করার জন্য দ্বিগুণ সময় দেয়। পরিবর্তে এটি হওয়া উচিত:

Position += Velocity * TimeStep;
if (Position.Y < 0)
{
    /* First, stop at Y = 0 and count how much time is left */
    float RemainingTime = -Position.Y / Velocity.Y;
    Position.Y = 0;

    /* Then, start from Y = 0 and only use how much time was left */
    Velocity.Y = -Velocity.Y * Physics.Surfaces.Grass;
    Position.Y = Velocity.Y * RemainingTime;
}

3. মাধ্যাকর্ষণ

কোডের এই অংশটি এখনই পরীক্ষা করুন:

if(Position.Y < GraphicsViewport.Height - Texture.Height)
{
    Velocity += Physics.Gravity.Force * TimeStep;
}            

আপনি ফ্রেমের পুরো সময়কালের জন্য মাধ্যাকর্ষণ যোগ করুন। কিন্তু বলটি যদি সেই ফ্রেমের সময় আসলে বাউন্স করে? তারপরে গতিবেগটি উল্টে যাবে, তবে যে মাধ্যাকর্ষণটি যুক্ত হয়েছিল তা বলটিকে মাটি থেকে দূরে সরিয়ে দেবে! সুতরাং বাউন্স করার সময় অতিরিক্ত মাধ্যাকর্ষণ অপসারণ করতে হবে , তারপরে সঠিক দিকে পুনরায় যুক্ত করতে হবে।

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

4. স্থির কোড

এবং এখানে সম্পূর্ণ আপডেট হওয়া কোডটি রয়েছে:

public void Update()
{
    float TimeStep = 1.0;
    Update(TimeStep);
}

public void Update(float TimeStep)
{
    float RemainingTime;

    // Apply gravity if we're not already on the ground
    if(Position.Y < GraphicsViewport.Height - Texture.Height)
    {
        Velocity += Physics.Gravity.Force * TimeStep;
    }
    Velocity -= Vector2(Math.Pow(Physics.Air.Resistance.X, RemainingTime),
                        Math.Pow(Physics.Air.Resistance.Y, RemainingTime))
              * Velocity;
    Position += Velocity * TimeStep;

    if (Position.X < 0 || Position.X > GraphicsViewport.Width - Texture.Width)
    {
        // We've hit a vertical (side) boundary
        if (Position.X < 0)
        {
            RemainingTime = -Position.X / Velocity.X;
            Position.X = 0;
        }
        else
        {
            RemainingTime = (Position.X - (GraphicsViewport.Width - Texture.Width)) / Velocity.X;
            Position.X = GraphicsViewport.Width - Texture.Width;
        }

        // Apply friction
        Velocity -= Vector2(Math.Pow(Physics.Surfaces.Concrete.X, RemainingTime),
                            Math.Pow(Physics.Surfaces.Concrete.Y, RemainingTime))
                  * Velocity;

        // Invert velocity
        Velocity.X = -Velocity.X;
        Position.X = Position.X + Velocity.X * RemainingTime;
    }

    if (Position.Y < 0 || Position.Y > GraphicsViewport.Height - Texture.Height)
    {
        // We've hit a horizontal boundary
        if (Position.Y < 0)
        {
            RemainingTime = -Position.Y / Velocity.Y;
            Position.Y = 0;
        }
        else
        {
            RemainingTime = (Position.Y - (GraphicsViewport.Height - Texture.Height)) / Velocity.Y;
            Position.Y = GraphicsViewport.Height - Texture.Height;
        }

        // Remove excess gravity
        Velocity.Y -= RemainingTime * Physics.Gravity.Force;

        // Apply friction
        Velocity -= Vector2(Math.Pow(Physics.Surfaces.Grass.X, RemainingTime),
                            Math.Pow(Physics.Surfaces.Grass.Y, RemainingTime))
                  * Velocity;

        // Invert velocity
        Velocity.Y = -Velocity.Y;

        // Re-add excess gravity
        float OldVelocityY = Velocity.Y;
        Velocity.Y += RemainingTime * Physics.Gravity.Force;
        // If velocity changed sign again, clamp it to zero
        if (Velocity.Y * OldVelocityY <= 0)
            Velocity.Y = 0;

        Position.Y = Position.Y + Velocity.Y * RemainingTime;
    }
}

5. আরও সংযোজন

এমনকি উন্নত সিমুলেশন স্থায়িত্বের জন্য, আপনি উচ্চতর ফ্রিকোয়েন্সিতে আপনার পদার্থবিজ্ঞানের সিমুলেশন চালানোর সিদ্ধান্ত নিতে পারেন। এই তৈরি করা হয় তুচ্ছ উপরে জড়িত পরিবর্তন দ্বারা TimeStep, কারণ আপনি শুধু অনেক খন্ডে হিসাবে আপনার ফ্রেম বিভক্ত করতে হিসাবে আপনি ইচ্ছুক প্রয়োজন। এই ক্ষেত্রে:

public void Update()
{
    float TimeStep = 1.0;
    Update(TimeStep / 4);
    Update(TimeStep / 4);
    Update(TimeStep / 4);
    Update(TimeStep / 4);
}

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

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

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

2
@eBusiness: সত্যি বলতে, এটা হয় কোন বিবেকী মান দ্বারা ভুল। কোডটি একেবারে "যেমনটি বোঝানো হয়েছিল তেমন করে না" কারণ 1) বেগ এবং মাধ্যাকর্ষণ যুক্ত করা আসলে কোনও অর্থ নয়; এবং 2) যদি এটি কোনও যুক্তিসঙ্গত ফলাফল দেয় তবে এর কারণ সঞ্চিত মানটি gravityআসলে… মাধ্যাকর্ষণ নয় । তবে আমি পোস্টে আরও পরিষ্কার করতে পারি।
সাম হোচেভার

বিপরীতে, এটিকে ভুল বলা কোনও বুদ্ধিমান মান দ্বারা ভুল। আপনারা ঠিক বলেছেন যে মাধ্যাকর্ষণ মহাকর্ষ নামক ভেরিয়েবলে সংরক্ষণ করা হয় না, পরিবর্তে সেখানে একটি সংখ্যা থাকে, এবং এটিই এখন যা হতে চলেছে তা আমাদের কল্পনা করে এর যে সম্পর্ক আছে তার বাইরে পদার্থবিজ্ঞানের কোনও সম্পর্ক নেই, এটি দ্বারা গুণ করা অন্য নম্বর এটি পরিবর্তন করে না। আপাতদৃষ্টিতে এটি যা পরিবর্তন করে তা হ'ল কোড এবং পদার্থবিজ্ঞানের মধ্যে মানসিক সংযোগ স্থাপনের আপনার ক্ষমতা এবং / অথবা ইচ্ছা is উপায় দ্বারা বরং একটি আকর্ষণীয় মানসিক পর্যবেক্ষণ।
এআআআআআআআআআআআআআআআআআআআআআআআআ

6

স্বল্পতম উল্লম্ব গতি ব্যবহার করে বাউন্স থামাতে একটি চেক যুক্ত করুন Add এবং যখন আপনি সর্বনিম্ন বাউন্স পান, বলটি মাটিতে রাখুন।

MIN_BOUNCE = <0.01 e.g>;

if( Velocity.Y < MIN_BOUNCE ){
    Velocity.Y = 0;
    Position.Y = <ground position Y>;
}

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

@ ব্র্যান্ডন, দুর্দান্ত, এটি স্বাভাবিকের সাথে আরও ভালভাবে কাজ করা উচিত।
ঝেন

1
@ ঝেন, আপনি যদি পৃষ্ঠের স্বাভাবিকটি ব্যবহার করেন তবে আপনার সম্ভবত বলটি শেষ হওয়ার কোনও সম্ভাবনা রয়েছে যেটি এমন একটি পৃষ্ঠের সাথে লেগে থাকবে যা মহাকর্ষের সমান্তরাল নয়। আমি যদি সম্ভব হয় তাহলে গণনাতে মাধ্যাকর্ষণ চেষ্টা করবো।
নিক ফস্টার

এই সমাধানগুলির কোনওটিরই কোনও গতিবেগ ০. এ সেট করা উচিত নয় আপনি কেবলমাত্র বাউন্স থ্রেশহোল্ডের উপর নির্ভর করে ভেক্টরের স্বাভাবিক জুড়ে প্রতিচ্ছবি সীমাবদ্ধ করুন
ব্র্যান্ডন

1

সুতরাং, আমি মনে করি কেন এটি হচ্ছে এর সমস্যা হ'ল আপনার বলটি একটি সীমাতে চলেছে। গাণিতিকভাবে, বলটি কখনও পৃষ্ঠের উপরে থামে না, এটি পৃষ্ঠের কাছে যায়।

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

শারীরিকভাবে বলতে গেলে, যা ঘটে তা হ'ল বলটি যখন পৃষ্ঠের খুব কাছাকাছি থাকে তখন এটি আটকে থাকে যদি মোট বল একটি প্রদত্ত প্রান্তিকের নীচে থাকে।

@ জেনের উত্তরটি যদি আপনার সিস্টেমটি একজাতীয় হয় তবে তা ঠিক থাকবে which Y অক্ষের উপর এর কিছু মাধ্যাকর্ষণ রয়েছে।

সুতরাং, আমি বলব যে সমাধানটি এমন হবে না যে গতিবেগকে একটি নির্দিষ্ট প্রান্তিক প্রশস্ততা দেওয়া উচিত, তবে আপডেটের পরে বলের উপর প্রয়োগ করা মোট বলটি একটি নির্দিষ্ট প্রান্তকে প্রশমিত করা উচিত।

সেই বলটি বল + প্রাচীরের মধ্য দিয়ে প্রাচীর দ্বারা প্রয়োগ করা শক্তির অবদান।

শর্তটি তখন এর মতো হওয়া উচিত

যদি (নতুনবেলসিটি + ফিজিক্স.গ্রাভিটি.ফর্স <প্রান্তিক)

লক্ষ্য করুন যে নিউভেলোসিটি.ই একটি ধনাত্মক পরিমাণ, যদি বাউটের দেয়ালে বাউন্স থাকে এবং মাধ্যাকর্ষণ negativeণাত্মক পরিমাণে হয়।

এছাড়াও লক্ষ্য করুন যে নতুন বিকাশ এবং পদার্থবিজ্ঞান। গ্র্যাভিটি orce ফর্সের একই মাত্রা নেই, যেমনটি আপনি লিখেছেন

Velocity += Physics.Gravity.Force;

তার অর্থ, আপনার মতো, আমি ধরে নিচ্ছি যে ডেল্টটাইম = 1 এবং বলম্যাস = 1।

আশাকরি এটা সাহায্য করবে


1

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

এখন আপনি অন্য একটি সমস্যা দেখতে পাচ্ছেন, বলটি নির্ধারিত অঞ্চলের বাইরে "আটকে" যায়, স্থিরভাবে পিছনে পিছনে ঝাঁকিয়ে ওঠে।

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

সুতরাং আপনার করা উচিত:

if (Position.X < 0 || Position.X > GraphicsViewport.Width - Texture.Width)

মধ্যে:

if ((Position.X < 0 && Velocity.X < 0) || (Position.X > GraphicsViewport.Width - Texture.Width && Velocity.X > 0))

এবং Y দিকের জন্য অনুরূপ similar

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

Velocity += Physics.Gravity.Force;
if(Position.Y > GraphicsViewport.Height - Texture.Height && Velocity.Y > 0)
{
    Velocity.Y = 0;
}

মোট এই পরিবর্তনগুলি আপনাকে একটি শালীন সিমুলেশন দেয়। তবে মনে রাখবেন যে এটি এখনও খুব সাধারণ সিমুলেশন।


0

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

public Vector3 Velocity
{
    public get { return velocity; }
    public set
    {
        velocity = value;

        // We get the direction that gravity pulls in
        Vector3 GravityDirection = gravity;
        GravityDirection.Normalize();

        Vector3 VelocityDirection = velocity;
        VelocityDirection.Normalize();

        if ((velocity * GravityDirection).SquaredLength() < 0.25f)
        {
            velocity.Y = 0.0f;
        }            
    }
}
private Vector3 velocity;

উপরের পদ্ধতিতে আমরা যখনই মহাকর্ষের মতো একই অক্ষের সাথে বাউন্সিং সীমাবদ্ধ করি।

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


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

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

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

@ জর্জিডুকেট: আহ আপনাকে ধন্যবাদ, আমি মূল প্রশ্নটি ভুল বুঝেছি। ওপি চায় না যে বলটি চলাচল বন্ধ করবে, কেবল উল্লম্ব আন্দোলন বন্ধ করুন stop আমি কেবল বাউনিং বেগের জন্য অ্যাকাউন্টে উত্তর আপডেট করেছি।
নিক ফস্টার

0

আরেকটি জিনিস: আপনি একটি ঘর্ষণ ধ্রুবক দ্বারা গুণাচ্ছেন। এটি পরিবর্তন করুন - ঘর্ষণ স্থিরত্ব কম করুন তবে একটি বাউন্সে একটি নির্দিষ্ট শক্তি শোষণ যুক্ত করুন। এটি সেই শেষ বাউন্সগুলিকে খুব দ্রুত স্যাঁতসেঁতে দেবে।

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