Как разместить текст в определенной позиции при использовании SceneKit?

Я попытался следовать той же простой логике, что и для цилиндра, коробки…, просто определив позицию для textNode, но это не работает.

func makeText(text3D: String, position: SCNVector3, depthOfText: CGFloat, color: NSColor, transparency: CGFloat) -> SCNNode
{
    let textTodraw = SCNText(string: text3D, extrusionDepth: depthOfText)
    textTodraw.firstMaterial?.transparency = transparency
    textTodraw.firstMaterial?.diffuse.contents = color
    let textNode = SCNNode(geometry: textTodraw)
    textNode.position = position        
    return textNode
}

person VYT    schedule 09.12.2016    source источник
comment
Не могли бы вы уточнить свой вопрос, а также добавить, как вы вызываете функцию и добавляете текст?   -  person ColdSteel    schedule 09.12.2016
comment
Не могли бы вы уточнить, каковы ожидаемые и фактические результаты?   -  person mnuages    schedule 09.12.2016
comment
Просто предположение, так как ваш вопрос довольно расплывчатый о том, что на самом деле происходит не так... но имейте в виду, что точки в вашем размере шрифта совпадают с единицами вашего трехмерного координатного пространства. шрифт по умолчанию — 36 пт, поэтому, если остальная часть сцены всего, скажем, 3-4 единицы ширины, могут быть гигантские буквы прямо за кадром.   -  person rickster    schedule 09.12.2016
comment
@rickster Спасибо, вы правильно догадались! Я пропустил значение шрифта по умолчанию. Проблема решена.   -  person VYT    schedule 09.12.2016
comment
Ура, удачная догадка. :) Я немного уточнил вышеизложенное и опубликовал его как ответ. (Пожалуйста, проголосуйте/примите, если считаете это полезным.)   -  person rickster    schedule 10.12.2016
comment
Я решил, установив масштаб для текстового узла и уменьшив размер до 0,5:-gist.github.com/ шраван2015/62d27202394101e4eca4e3d9ba0e67a1   -  person Shrawan    schedule 06.09.2018


Ответы (1)


Шрифт по умолчанию для SCNText36 pt Helvetica, а " по размеру шрифта совпадает с единицей пространства сцены. (Ну, локального пространства для узла, содержащего геометрию SCNText. Но если вы не установили коэффициент масштабирования для своего узла, единицы локального пространства совпадают с единицами пространства сцены.) Это означает, что даже короткая метка может состоять из десятков единиц. в высоту и сотни единиц в ширину.

Обычно сцены SceneKit создаются с меньшей областью действия — например, простые тестовые сцены, которые вы можете собрать вместе на игровой площадке Swift, используя размеры по умолчанию для SCNBox, SCNSphere и т. д., могут иметь ширину всего 3-4 единицы. (И если вы используете SceneKit с ARKit, единицами измерения сцены являются метры, поэтому некоторый текст шрифтом 36 «точек» имеет размер нескольких офисных кварталов в центре города.)

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


Обратите внимание, что если вы попытаетесь исправить это, установив гораздо меньший шрифт на вашем SCNText, текст может стать неровным и коротким. Это связано с тем, что свойство flatness измеряется относительно размера точки текст (точнее, измеряется в системе координат, где одна единица == одна точка размера текста). Поэтому, если вы выберете размер шрифта, который будет крошечным по стандартам экрана/печати, вам нужно будет соответственно уменьшить flatness, чтобы по-прежнему получать плавные кривые в ваших буквах.

Кроме того, вы можете оставить размеры шрифта и плоскостность без изменений — вместо этого установите scale на узел, содержащий текстовую геометрию, или установите pivot этого узла. a> в матрицу преобразования, которая уменьшает ее содержимое. Например, если вы установите масштабный коэффициент 1/72, одна единица пространства сцены будет равна одному «дюйму» (72 пункта) высоты текста — в зависимости от других размеров в вашей сцене это может немного усложнить задачу. легче думать о размерах шрифта, как в 2D.

person rickster    schedule 09.12.2016