আমি কীভাবে লিবিজিডিএক্স 3 ডি-তে সংঘর্ষের ইভেন্টগুলি প্ররোচিত করব?


9

নীচের কোডটিতে আমি কিছু করতে চাই তার উদাহরণ রেখেছি। আমার কাছে ক্যামেরা রয়েছে এবং আমি চাইব যে এটি যখনই কোনও একটি বাক্সকে আঘাত করে তখন এটি চলন্ত বন্ধ হয়ে যায়, আমি এটি কীভাবে করব?

public class Main extends ApplicationAdapter {

    private final ModelBuilder builder = new ModelBuilder();
    private final Environment environment = new Environment();
    private ModelBatch modelBatch;
    private PerspectiveCamera camera;
    private Model model;
    private ArrayList<ModelInstance> instance = new ArrayList<ModelInstance>();
    private FirstPersonCameraController controller;
    private BoundingBox[] boxBounds = new BoundingBox[1000];
    private BoundingBox cameraBox = new BoundingBox();
    private Vector3 cameraSpeed = new Vector3();
    private Vector3 oldCameraPos = new Vector3();
    private Vector3 newCameraPos = new Vector3();

    @Override

    public void create() {
        modelBatch = new ModelBatch();


        //build the camera
        camera = new PerspectiveCamera(67, graphics.getWidth(), graphics.getHeight());
        camera.position.set(0f, 10f, 0f);
        camera.lookAt(0, 10, 0);
        camera.near = 1f;
        camera.far = 1000f;
        camera.update();

        //build all the boxes
        for (int i = 0; i < 1000; i++) {
            model = builder.createBox(
                    (float) Math.random() * 50,
                    (float) Math.random() * 50,
                    (float) Math.random() * 50,

                    new Material(ColorAttribute.createDiffuse(

                            (float) random(),
                            (float) random(),
                            (float) random(), 1)
                    ), Position | Normal);

            instance.add(new ModelInstance(model));
            instance.get(i).transform.setToTranslation(
                    (float) random() * 1000 - 500,
                    (float) random() * 1000,
                    (float) random() * 1000 - 500);

            boxBounds[i] = new BoundingBox();
            boxBounds[i] = model.calculateBoundingBox(boxBounds[i]);
        }

        //build the ground
        model = builder.createBox(700f, 1f, 700f, new Material(ColorAttribute.createDiffuse(Color.GREEN)), Position | Normal);
        ModelInstance ground = new ModelInstance(model);
        instance.add(ground);

        //build the center
        model = builder.createBox(5f, 5f, 5f, new Material(ColorAttribute.createDiffuse(Color.RED)), Position | Normal);
        ModelInstance center = new ModelInstance(model);
        instance.add(center);


        //code the lights here
        DirectionalLight light = new DirectionalLight().set(255, 255, 255,
                (float) random(),
                (float) random(),
                (float) random());

        //set up the enviroment
        environment.set(new ColorAttribute(AmbientLight, 255f, 255f, 255f, 1f));
        environment.add(light);

        //set up the camera controller
        controller = new FirstPersonCameraController(camera);
        controller.setDegreesPerPixel(0.25f);
        controller.setVelocity(20);
        input.setInputProcessor(controller);
    }

    @Override
    public void render() {
        //set up OpenGL
        gl.glViewport(0, 0, graphics.getWidth(), graphics.getHeight());
        gl.glEnable(GL_BLEND);
        gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        gl.glClearColor(0, 0, 0, 0);

        //render the modelInstances
        modelBatch.begin(camera);
        modelBatch.render(instance, environment);
        modelBatch.end();
        controller.update();

        if (input.isKeyPressed(Input.Keys.R)) {
            camera.lookAt(0, 0, 0);
        }

        cameraSpeed = newCameraPos.sub(oldCameraPos);

        cameraBox = new BoundingBox(new Vector3(camera.position.x,
                camera.position.y,
                camera.position.z),

                new Vector3(camera.position.x + 10,
                        camera.position.y + 10,
                        camera.position.z + 10));

        for (int i = 0; i < 1000; i++) {
            if (cameraBox.contains(boxBounds[i])) {
                camera.position.x = camera.position.x - cameraSpeed.x;
                camera.position.y = camera.position.y - cameraSpeed.y;
                camera.position.z = camera.position.z - cameraSpeed.z;
            }
        }

        System.out.println(cameraSpeed.x + " " + cameraSpeed.y + " " + cameraSpeed.z);
    }

    @Override
    public void dispose() {
        modelBatch.dispose();
        model.dispose();
    }
}

ফলাফল:

ফলাফল


তিনি কোনও বাক্সে রয়েছেন কিনা তা সনাক্ত করতে পারেন (যদি তার y <box.y && y> box.y + box.height এবং x এবং z এর জন্য একই কাজ করতে চান, তবে তার গতিবেগের সাথে তার ওয়াই আপকে পরিবর্তন করুন)
আর্টিকেল

উত্তর:


1

আমি যে ফিজিক্স ইঞ্জিনগুলি লিখেছি সেগুলি তিনটি ধাপে কাজ করে

প্রতিটি ফ্রেম:

  1. সমস্ত পদার্থবিজ্ঞানের বস্তু তাদের নিজস্ব বেগ ভেক্টর গণনা করে
  2. পদার্থবিজ্ঞানের ইঞ্জিন বস্তুর মাধ্যমে লুপ করে এবং তাদের ভিত্তিতে তাদের নতুন অবস্থান আপডেট করে

    অবস্থান + = বেগ * ডেল্টটাইম;

  3. পদার্থবিজ্ঞানের ইঞ্জিন সমস্ত সংঘর্ষের সমাধান করে

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

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

সবশেষে, আপনার প্রয়োজনের উপর নির্ভর করে, দুটি সংযোগ আছে যা আমি সংঘর্ষগুলি সমাধান করার জন্য ব্যবহার করেছি।

  1. বেসিক ওভারল্যাপিং

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

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

  1. সংঘর্ষ শনাক্ত করার ঘটনাটি সনাক্ত করা হয়েছে

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

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

সংঘর্ষ সনাক্তকরণের জন্য ইন্টারনেট অনুসন্ধান করে আপনার আরও উপকারী হতে পারে out

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