Это нормально, что, если узел масштабируется, ограниченный прямоугольник scntext не слишком?

Я искал, чтобы отобразить текст с помощью Arkit. Чтобы достичь этого, я создал SCNText объект, придав ему размер шрифта и уменьшив его. Это, кажется, рекомендуемый способ отрегулировать его размер.

Теперь для позиционирования мне нужно рассчитать высоту SCNText объект. Для этого есть boundingBox метод, который возвращает (min, max) кортеж.

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

Я что-то здесь упускаю? Моя единственная цель - получить 3d текст приличного размера и знать его высоту.

Спасибо!

private func displayBarValue(barNode: ARBarChartBar) {
    let barValueText = SCNText(string: String(barNode.value), extrusionDepth: 0.0)
    let fontSize = CGFloat(1)
    barValueText.font = UIFont (name: "Arial", size: fontSize)
    barValueText.firstMaterial!.isDoubleSided = true
    barValueText.firstMaterial!.diffuse.contents = UIColor.white

    let barValueLabel = SCNNode()
    barValueLabel.geometry = barValueText

    let scale = Float(0.05/fontSize)
    barValueLabel.scale = SCNVector3(scale, scale, scale)
    center(node: barValueLabel)

    let min = barValueLabel.boundingBox.min
    let max = barValueLabel.boundingBox.max
    let barValueLabelHeight = max.y - min.y
    let spaceBetweenBarAndText = Float(0.012)

    barValueLabel.position = SCNVector3(x: 0, y: barNode.barHeight/2+barValueLabelHeight/2+spaceBetweenBarAndText, z: 0)

    barNode.addChildNode(barValueLabel)
    }
}

func center(node: SCNNode) {
  let (min, max) = node.boundingBox
  let dx = min.x + 0.5 * (max.x - min.x)
  let dy = min.y + 0.5 * (max.y - min.y)
  let dz = min.z + 0.5 * (max.z - min.z)
  node.pivot = SCNMatrix4MakeTranslation(dx, dy, dz)
}

1 ответ

Решение

Я что-то здесь упускаю?

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

Ограничивающий объем узла с прикрепленной геометрией - это ограничивающий объем геометрии, выраженный в локальном пространстве узла.

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

Другие вопросы по тегам