Nano Hash - криптовалюты, майнинг, программирование

LibGDX: определение места, где луч попадает на 3D-объект

Я создаю 3D-игру в LibGDX, я использовал следующий код, чтобы определить, касаюсь ли я объекта, но как мне узнать, в какой момент он сталкивается. Я не использую Bullet, так как хочу сделать порт HTML5.

    public int getObject (int screenX, int screenY) {

        int result = -1;
        float distance = -1;

        Ray ray = camera.getPickRay(screenX, screenY);
        Vector3 pos = new Vector3(camera.position);

        for (int i = 0; i < boxInstance.size; i++) {

            GameObject instance = boxInstance.get(i);
            instance.transform.getTranslation(pos);

            float dist2 = ray.origin.dst2(pos);
            if (distance >= 0f && dist2 > distance) continue;

            if (Intersector.intersectRayBoundsFast(ray, pos, instance.dimensions)) {
                result = i;
                distance = dist2;

                Vector3 v = new Vector3();
                if (Intersector.intersectRayBounds(ray, instance.bounds, v))
                {
                    boxInstance.get(result).materials.get(0).set(ColorAttribute.createDiffuse(Color.RED));
                }
            }
        }

        if (result > -1)
        {

            //boxInstance.removeIndex(result);
        }

        return 1;
    };

Причина, по которой мне это нужно, заключается в том, что если я касаюсь большой плоскости, я хочу иметь возможность сглаживать объект, к которому я прикасаюсь.

Обновление Я нашел intersectRayBounds, который должен делать то, что я хочу, но он никогда не срабатывает.

Вот мой класс GameObject. Может быть, мой BoundingBox неправильный?

public class GameObject extends ModelInstance {
    public final Vector3 center = new Vector3();
    public final Vector3 dimensions = new Vector3();
    public static BoundingBox bounds = new BoundingBox();

    public GameObject (Model model, float x, float y, float z) {
        super(model, x,y,z);
        calculateBoundingBox(bounds);
        bounds.getCenter(center);
        bounds.getDimensions(dimensions);
    }
}
04.08.2015

  • Box2d теперь не поддерживает html5? Я бы посоветовал использовать это, так как это сэкономит вам много времени. 04.08.2015
  • Разве это не только 2D, а я строю 3D? Извините, я новичок в этом 04.08.2015
  • Это. Извините, надо было читать внимательнее. 04.08.2015
  • xoppa.github.io/blog/interacting-with-3d-objects xoppa.github.io/blog/using-collision-shapes 04.08.2015
  • Я на самом деле использую ваш сайт для половины своего кода, чувак! 04.08.2015

Ответы:


1

Я не уверен, почему это исправление, но, похоже, вам нужно каждый раз вычислять ограничивающую рамку. См. код ниже.

    public int getObject (int screenX, int screenY) {

        int result = -1;
        float distance = -1;

        Ray ray = camera.getPickRay(screenX, screenY);
        Vector3 pos = new Vector3(camera.position);

        for (int i = 0; i < boxInstance.size; i++) {

            GameObject instance = boxInstance.get(i);
            instance.transform.getTranslation(pos);
            instance.updateBox();

            float dist2 = ray.origin.dst2(pos);
            if (distance >= 0f && dist2 > distance) continue;


            Vector3 v = new Vector3();
            if (Intersector.intersectRayBounds(ray, instance.bounds, v))
            {
                result = i;
                distance = dist2;
                Gdx.app.log("MyTag 2", "x " + v.x + " z " + v.z);

            }

        }

        if (result > -1)
        {
            boxInstance.get(result).materials.get(0).set(ColorAttribute.createDiffuse(Color.RED));
        }

        return 1;
    };


public class GameObject extends ModelInstance {
    public final Vector3 center = new Vector3();
    public final Vector3 dimensions = new Vector3();
    public static BoundingBox bounds = new BoundingBox();
    private float x,y,z;


    public GameObject (Model model, float x, float y, float z) {
        super(model, x, y, z);
        this.x = x;
        this.y = y;
        this.z = z;
        updateBox();
    }

    public void updateBox()
    {
        calculateBoundingBox(bounds);
        bounds.getCenter(center);
        bounds.getDimensions(dimensions);
        bounds.set(bounds.min.add(x,y,z), bounds.max.add(x,y,z));

        Gdx.app.log("MyTag 2", "x " + bounds.min + " z " + bounds.max );
    }

}
04.08.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..