Изменить "поле зрения" в SceneKit - PullRequest
0 голосов
/ 07 мая 2018

У меня есть камера с перспективной проекцией и объектом в (0,0,0). Я рассчитал «ограничивающую рамку» (размер в пикселях на экране) этого объекта в соответствии с этой камерой и масштабировал ее до размера экрана. И теперь это в середине экрана.

Рамка scnView равна размеру экрана, и у меня есть некоторые компоненты пользовательского интерфейса над этим видом (например, панель навигации и некоторое большое прозрачное представление внизу представления). ScnView имеет некоторый полноэкранный фон, и этот объект можно масштабировать / перемещать / ... поэтому мне нужно, чтобы scnview был полноэкранным.

smth like that

Затем я перемещаю этот объект в середине «чистой области» (области с отсутствием UIComponents) и вижу основание этого объекта (как будто оно выше меня), потому что моя проекция является перспективной.

Я хочу переместить этот объект в центр чистой области и увидеть, что он передо мной без каких-либо искажений. Как мне этого добиться?

enter image description here

Я вижу 2 решения. 1) Нарисуйте мой объект вне экрана в текстуре и после этого нарисуйте эту текстуру на экране в нужном месте. 2) создать scnView немного выше. Например, установите размер кадра = (0, (bottomHeight - topHeight) / 2, ширина, высота + (bottomHeight - topHeight) / 2), чтобы переместить центр scnView в требуемое положение.

Но мне не нравится первое решение из-за дополнительного вызова отрисовки, а второе решение даже звучит глупо.

P.S. извините за эти фотографии

Обновление: В основном я хочу использовать перспективную проекцию и перемещать 3D-объект, например, 2D-изображение в SceneKit.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Попробуйте это ... сгенерируйте новый игровой проект scenekit, затем замените вращение по умолчанию приведенным ниже кодом.

Слегка поверните X при перемещении объекта вверх, чтобы «немного» сохранить связь с глазом.

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

    ship.runAction(SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(-90)), y: 0, z: 0, duration: 0))

    let vRotateAmount: Float = 3

    let vAction1 =  SCNAction.move(to: SCNVector3Make(0, 1, 0), duration: 1)
    let vAction1a = SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(vRotateAmount)), y:0, z:0, duration: 1)

    let vAction2 = SCNAction.move(to: SCNVector3Make(0, 2, 0), duration: 1)
    let vAction2a = SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(vRotateAmount)), y:0, z:0,  duration: 1)

    let vAction3 =  SCNAction.move(to: SCNVector3Make(0, 1, 0), duration: 1)
    let vAction3a = SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(-vRotateAmount)), y:0, z:0,  duration: 1)

    let vAction4 = SCNAction.move(to: SCNVector3Make(0, 0, 0), duration: 1)
    let vAction4a = SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(-vRotateAmount)), y:0, z:0,  duration: 1)

    let seq = SCNAction.sequence([vAction1, vAction1a, vAction2, vAction2a, vAction3, vAction3a, vAction4, vAction4a])
    let allSeq = SCNAction.repeatForever(seq)
    ship.runAction(allSeq)
0 голосов
/ 06 июня 2018

Решил это путем изменения проекции камеры Transform. Что-то вроде:

let newMatrix = SCNMatrix4Mult(initialProjectionCameraMatrix, translationMatrix)
0 голосов
/ 08 мая 2018

Извините, если я не правильно понимаю, но вы можете поставить камеру вверх и отцентрировать ее, или это будет недостаточно ясно?

func strafeY(vAmount: XFloat)
{
  nPosition = cgVecAdd(v1: nPosition, v2: cgVecScalarMult(v: nTarget, s: vAmount))
}
...