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

поиск глубины в арките с помощью SCNVector3Make

Цель проекта — создать приложение для рисования. я хочу, чтобы когда я касаюсь экрана и двигаю пальцем, он следовал за пальцем и оставлял голубую краску. Я создал его, НО есть одна проблема. ГЛУБИНА краски всегда размещается случайным образом.

вот код, просто нужно соединить sceneView с раскадровкой. https://github.com/javaplanet17/test/blob/master/drawingar

Мой вопрос в том, как мне сделать программу, чтобы глубина всегда была постоянной, под последовательной я подразумеваю, что всегда есть расстояние между краской и камерой.

если вы запустите приведенный выше код, вы увидите, что я распечатал все SCNMatrix4, но ни один из них не является DEPTH.

Я пытался изменить hitTransform.m43, но это только испортило x и y.

31.10.2017

Ответы:


1

Если вы хотите получить точку на определенном расстоянии от камеры, вам не нужен тест на попадание. Тест удара находит реальную поверхность мира перед камерой — если ваша камера не направлена ​​на стену, которая идеально параллельна экрану устройства, вы всегда будете получать диапазон разных расстояний.

Если вам нужна точка на некотором расстоянии перед камерой, вам нужно получить положение/ориентацию камеры и применить к ней перевод (ваше предпочтительное расстояние). Затем, чтобы поместить туда содержимое SceneKit, используйте полученную матрицу, чтобы задать преобразование узла SceneKit.

Самый простой способ сделать это — придерживаться векторных/матричных типов SIMD, а не преобразовывать их в типы SCN. SceneKit добавляет в iOS 11 несколько новых средств доступа, поэтому вы можете напрямую использовать SIMD-типы.

Есть по крайней мере несколько способов сделать это, в зависимости от того, какой результат вы хотите.

Опция 1

// set up z translation for 20 cm in front of whatever
// last column of a 4x4 transform matrix is translation vector
var translation = matrix_identity_float4x4
translation.columns.3.z = -0.2

// get camera transform the ARKit way
let cameraTransform = view.session.currentFrame.camera.transform
// if we wanted, we could go the SceneKit way instead; result is the same
// let cameraTransform = view.pointOfView.simdTransform

// set node transform by multiplying matrices
node.simdTransform = cameraTransform * translation

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

Вариант 2

// distance vector for 20 cm in front of whatever
let translation = float3(x: 0, y: 0, z: -0.2)

// treat distance vector as in camera space, convert to world space
let worldTranslation = view.pointOfView.simdConvertPosition(translation, to: nil)

// set node position (not whole transform)
node.simdPosition = worldTranslation

Этот параметр задает только положение узла, оставляя его ориентацию неизменной. Например, если вы разместите таким образом кучу кубов, перемещая камеру, все они будут выстроены в одном направлении, тогда как в варианте 1 все они будут в разных направлениях.

Выходя за рамки

Оба приведенных выше варианта основаны только на 3D-преобразовании камеры — они не учитывают положение 2D-касания на экране.

Если вы тоже хотите сделать это, у вас есть больше работы для вас — по сути, то, что вы делаете, — это тестирование ударов не по миру, а по виртуальной плоскости, которая всегда параллельна камере и находится на определенном расстоянии. далеко. Эта плоскость является поперечным сечением усеченной проекции камеры, поэтому ее размер зависит от того, на каком фиксированном расстоянии от камеры вы ее поместите. Точка на экране проецируется в точку на этой виртуальной плоскости, при этом ее положение на плоскости масштабируется пропорционально расстоянию от камеры (как на рисунке ниже):

потрясающий набросок проекции плоскости экрана на салфетке

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

  1. Создайте невидимый SCNPlane, который является дочерним элементом узла pointOfView вида, параллельного локальной плоскости xy и на некотором фиксированном расстоянии по оси z впереди. Используйте SceneKit hitTest (не ARKit hit test!) для сопоставления касаний с эту плоскость и используйте worldCoordinates результата теста попадания, чтобы расположить узлы SceneKit, которые вы перетаскиваете в свою сцену.

  2. Используйте вариант 1 или вариант 2 выше, чтобы найти точку на некотором фиксированном расстоянии перед камерой (или всю матрицу преобразования, ориентированную в соответствии с камерой, перемещенную на некоторое расстояние вперед). Используйте метод SceneKit projectPoint, чтобы найти нормализованное значение глубины Z для этой точки, затем вызовите unprojectPoint с вашим 2D место касания и то же значение Z, чтобы получить трехмерное положение места касания с расстоянием до камеры. (Дополнительный код/указатели см. в моем аналогичном методе в этом ответе.)

31.10.2017
  • Извините за поздний ответ, я попробовал сделать невидимым вариант SCNPlane, а затем протестировал его, создав мяч везде, где я касаюсь экрана, но чем дольше я касаюсь экрана, тем мяч быстро становится все ближе и ближе к экрану. вот новый код. github.com/javaplanet17/test/blob/master/drawingar2 03.11.2017
  • Новые материалы

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

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

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

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

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

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

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