SCNText не будет отображаться - PullRequest
0 голосов
/ 25 апреля 2018

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

Теперь это код, который я должен создать для своего текстового узла

let textNode: SCNNode = {
            let text = SCNText.init(string: "250.9cm", extrusionDepth: 0.01)
            text.font = UIFont(name: "System", size: 32)
            text.flatness = 0.2
            let node = SCNNode.init(geometry:  text)
            node.pivot = SCNMatrix4Scale(node.transform, 1/72, 1/72, 1/72)
            node.scale = SCNVector3(0.1, 0.1, 0.1)
            node.geometry?.materials.first?.diffuse.contents = UIColor.red
            return node
        }()

Это основано на нескольких разных решениях, которые я нашел, и я пробовал это разными способами. Тем не менее, никто не работает.

Здесь я добавляю 1 представление в качестве childNode, а затем еще 3 дочерних узла для этого потомка.

self.addChildNode(mainNode)

        topNode.position = SCNVector3(mainNode.getMidX(), mainNode.boundingBox.max.y, mainNode.getMidZ())
        bottomNode.position = SCNVector3(mainNode.getMidX(), mainNode.boundingBox.min.y, mainNode.getMidZ())
        textNode.position = SCNVector3(mainNode.getMidX()+0.005, mainNode.getMidY(), mainNode.getMidZ())

        mainNode.addChildNode(topNode)
        mainNode.addChildNode(bottomNode)
        mainNode.addChildNode(textNode)

Как вы можете видеть на картинке ниже, все отображается правильно и точно в том месте, где я ожидаю. За исключением textNode, которого нигде нет. (обратите внимание, что это черная линия с шляпой и туфлями, которая является основным, верхним и нижним узлом)

enter image description here

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

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

1 Ответ

0 голосов
/ 26 апреля 2018

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

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

node.pivot = SCNMatrix4Scale(node.transform, 1/72, 1/72, 1/72)
node.scale = SCNVector3(0.1, 0.1, 0.1)

Во-первых, установка scale и установка pivot в масштабное преобразование имеют одинаковый эффект - оба масштабируют содержимое узла, поэтому вы эффективно применяете один масштабный коэффициент, который является объединением двух преобразований. (Кроме того, что касается этих вызовов, node.transform является идентификатором, поэтому первая строка эквивалентна SCNMatrix4MakeScale с тем же коэффициентом.)

Во-вторых, как объяснено в этом замечательном ответе , свойство pivot применяет обратное преобразования, которое вы предоставляете, к содержимому узла. Ваше преобразование - это уменьшение масштаба, поэтому примененное преобразование является обратным к этому: увеличение масштаба.

(Документация для pivot довольно неясна в части обратного преобразования. Может быть, если вы расскажете об этом Apple , они исправят этот документ.)

Соберите все вместе: вы уменьшаете 32-точечный текстовый узел до 1 / 10x, а затем до 72x. Это то же самое, что масштабировать его до 7.2x или просто использовать 230-точечный шрифт для начала.

И, как отмечалось в других местах , «точечные» размеры для шрифтов в SceneKit + ARKit фактически являются метрами, поэтому у вас, вероятно, есть буквы размера небоскреба, плавающие где-то выше и справа от вас (если они невидимы) потому что они за пределами глубины клипа). Надеюсь, вы принесли альпинистское снаряжение ...

...