Запутался в Орфографической проекции камеры в SceneKit - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу использовать ортогональную проекцию для отображения 3D-сцены в моем приложении.В своем коде я вставил рамку в сцену и установил орфографическую проекцию точки зрения как удар.Камера в (0,0,500) смотрит в направлении -z и показывает начало мира.Таким образом, камера должна быть в состоянии захватить коробку.

let cameraNode = SCNNode()
let pov = SCNCamera()
pov.usesOrthographicProjection = true
let width = UISreen.main.bounds.size.width
let glMat = GLKMatrix4MakeOrtho(-width/2, width/2, -width/2, width/2, 1, 1000)
pov.projectionTransform = SCNMatrix4FromGLKMatrix4(glMat)
cameraNode.camera = pov
cameraNode.position = SCNVector3.init(0, 0, 500)
scene.rootNode.addChildNode(cameraNode)

let boxGeo = SCNBox.init(width: 100, height: 100, length: 1, chamferRadius: 0)
let box = SCNNode.init(geometry: boxGeo)
scene.rootNode.addChildNode(box)

Но я ничего не вижу.Я выясняю, правильно ли будет работать orthographicScale на width/2.0.

pov.orthographicScale = Double(width/2);

Вопрос 1: Я не знаю, почему это работает.Я читал документы Apple, но все еще в замешательстве.https://developer.apple.com/documentation/scenekit/scncamera/1436612-orthographicscale?language=objc

orthographicScale

Указывает коэффициент увеличения камеры при использовании ортогональной проекции.

Почему мне нужно увеличить орфографиюпроекция?Я уже установил его размер через GLKMatrix4MakeOrtho.

Я не уверен, относится ли он к преобразованию области просмотра?Поскольку преобразование области просмотра в OpenGL вычисляется следующим образом: https://docs.microsoft.com/en-us/windows/desktop/opengl/glviewport

enter image description here

Вопрос 2: Я также нахожу, если я создаю матрицу проекциикак удар это работает так же, как и раньше.

let glMat = GLKMatrix4MakeOrtho(0, width, 0, width, 1, 1000)

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

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 23 сентября 2018

Полагаю, вы не можете видеть свои 3D-объекты на сцене, используя GLKMatrix4MakeOrtho, из-за того, что многие классы GLKit для iOS и macOS устарели.

Для того, чтобы увидетьваш 3D-объект, вам нужно вручную установить Far Z Clipping параметр в Attributes Inspector.Этими двумя полями являются near и far плоскости отсечения усеченного конуса вашей Орфографической камеры.Значение по умолчанию Far=100 не позволяет видеть сцену на расстоянии более 100 единиц.

enter image description here

Затем используйте Scale Свойство, чтобы установить масштабный коэффициент для ваших объектов в ортогональном виде.

Чтобы использовать его программно через GLKMatrix4MakeOrtho, вам необходимо сначала импортировать модули GLKit и OpenGL (а также все необходимые протоколы делегатов) в ваш проект.

import GLKit
import OpenGL

// Obj-C GLKMatrix4

GLK_INLINE GLKMatrix4 GLKMatrix4MakeOrtho(float left, 
                                          float right,
                                          float bottom, 
                                          float top,
                                          float nearZ, 
                                          float farZ) {
    float ral = right + left;
    float rsl = right - left;
    float tab = top + bottom;
    float tsb = top - bottom;
    float fan = farZ + nearZ;
    float fsn = farZ - nearZ;

    GLKMatrix4 m = { 2.0f / rsl, 0.0f, 0.0f, 0.0f,
                     0.0f, 2.0f / tsb, 0.0f, 0.0f,
                     0.0f, 0.0f, -2.0f / fsn, 0.0f,
                     -ral / rsl, -tab / tsb, -fan / fsn, 1.0f };

    return m;
}

Кроме того, в iOS для GLKit требуется контекст OpenGL ES 2.0.В macOS для GLKit требуется контекст OpenGL, который поддерживает основной профиль OpenGL 3.2.

Но помните!Многие функции GL устарели, поэтому вам лучше использовать Metal framework. Посмотрите на устаревшие классы GLKit .

...