বুলেট পদার্থবিজ্ঞান - অনমনীয় শরীর থেকে সরাসরি একটি রশ্মি কাস্ট করা (প্রথম ব্যক্তির ক্যামেরা)


10

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

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

আমি কেবল একটি রশ্মির নিক্ষেপ করতে এবং এটি যেখানে আঘাত করেছিল বিশ্বের ওয়াই-মান নির্ধারণে কিছুটা আটকে আছি। আমি এই কলব্যাকটি প্রয়োগ করেছি:

struct AllRayResultCallback : public btCollisionWorld::RayResultCallback{
    AllRayResultCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld)
        : m_rayFromWorld(rayFromWorld), m_rayToWorld(rayToWorld), m_closestHitFraction(1.0){}

    btVector3   m_rayFromWorld;
    btVector3   m_rayToWorld;
    btVector3   m_hitNormalWorld;
    btVector3   m_hitPointWorld;
    float       m_closestHitFraction;

    virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace)
    {
        if(rayResult.m_hitFraction < m_closestHitFraction)
            m_closestHitFraction = rayResult.m_hitFraction;

        m_collisionObject = rayResult.m_collisionObject;
        if(normalInWorldSpace){
            m_hitNormalWorld = rayResult.m_hitNormalLocal;
        }
        else{
            m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis() * rayResult.m_hitNormalLocal;
        }

        m_hitPointWorld.setInterpolate3(m_rayFromWorld, m_rayToWorld, m_closestHitFraction);
        return 1.0f;
    }
};

এবং আন্দোলনের কার্যক্রমে, আমার এই কোডটি রয়েছে:

btVector3 from(pos.x, pos.y + 1000, pos.z); // pos is the camera's rigid body position
btVector3 to(pos.x, 0, pos.z); // not sure if 0 is correct for Y

AllRayResultCallback callback(from, to);
Base::getSingletonPtr()->m_btWorld->rayTest(from, to, callback);

সুতরাং আমার কাছে callback.m_hitPointWorldভেক্টর রয়েছে, যা মনে হয় কেবল প্রতিটি ফ্রেমের ক্যামেরার অবস্থান প্রদর্শন করে। কাস্টিং রশ্মির উদাহরণগুলির পাশাপাশি বুলেট ডকুমেন্টেশনের জন্য আমি গুগল অনুসন্ধান করেছি এবং উদাহরণ খুঁজে পাওয়া খুব কঠিন ছিল। একটি উদাহরণ সত্যই আমার প্রয়োজন।

বা সম্ভবত বুলেটের অনমনীয় দেহটি মাটিতে রাখার জন্য কোনও পদ্ধতি আছে?

আমি একটি রেন্ডারিং ইঞ্জিন হিসাবে ওগ্র্রে 3 ডি ব্যবহার করছি, এবং একটি রশ্মি নিচে ফেলে দেওয়া এর সাথে একেবারে সোজা, তবে আমি সরলতার জন্য বুলেটের মধ্যে সমস্ত রশ্মির কাস্টিং রাখতে চাই।

যে কেউ ডান দিক সম্পর্কে নির্দেশ পারে? ধন্যবাদ।

উত্তর:


10

এটি সমাধানে আসল প্রচেষ্টার চেয়ে অনেক সহজ, এবং যদি আপনি কেবল একটি রশ্মির সংঘর্ষের পরীক্ষা করছেন তবে সাবক্লাসিংয়ের দরকার নেই।

সংঘর্ষের ভেক্টরটি পুনরুদ্ধার করতে আপনাকে যা করতে হবে তা এখানে:

btVector3 btFrom(camPos.x, camPos.y, camPos.z);
btVector3 btTo(camPos.x, -5000.0f, camPos.z);
btCollisionWorld::ClosestRayResultCallback res(btFrom, btTo);

Base::getSingletonPtr()->m_btWorld->rayTest(btFrom, btTo, res); // m_btWorld is btDiscreteDynamicsWorld

if(res.hasHit()){
    printf("Collision at: <%.2f, %.2f, %.2f>\n", res.m_hitPointWorld.getX(), res.m_hitPointWorld.getY(), res.m_hitPointWorld.getZ());
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.