Отрегулируйте размер SCNPlane для указанного c размера экрана - PullRequest
0 голосов
/ 15 января 2020

В моем приложении пользователь dr aws 2D-прямоугольник на экране, используя Core Graphics. Как только они отпустят свою мышь, мне нужно создать SCNPlane и поместить его в мою сцену SceneKit с тем же размером экрана и положением. Я планирую установить положение z плоскости на постоянное значение вдали от камеры (скажем, в 10 единицах от камеры).

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

Я планирую использовать ограничение рекламного щита, чтобы плоскость смотрела правильно на камеру.

Я уверен, что там это некоторая математика для выполнения sh этого с использованием свойств камеры, но я понятия не имею, как это сделать.

1 Ответ

0 голосов
/ 17 января 2020

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

вашими строительными блоками являются sceneView.unprojectPoint и sceneView.frame

import Cocoa        // (or UIKit for iOS)
import SceneKit
import PlaygroundSupport;

// create a scene view with an empty scene
var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
var scene = SCNScene()
sceneView.scene = scene

// have it show in your playground
PlaygroundPage.current.liveView = sceneView;

// a camera
var cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(0, 0, 3)
scene.rootNode.addChildNode(cameraNode)

var origin = sceneView.unprojectPoint(SCNVector3(0,0,0))
var viewWidth = sceneView.frame.width;
var topRight = sceneView.unprojectPoint(SCNVector3(sceneView.frame.width, 0, 0));
var scale = 2 * (topRight.x - origin.x) / sceneView.frame.width

var container = SCNNode()
origin.z *= -1
origin.x = -2 * topRight.x;
origin.y = -2 * topRight.y;

container.position = origin;
container.scale = SCNVector3(scale, -scale, scale)
cameraNode.addChildNode(container);

func addBox(w:CGFloat, h:CGFloat, x:CGFloat, y:CGFloat) {
    let box = SCNNode(geometry: SCNPlane(width: w, height: h))
    box.geometry?.firstMaterial?.diffuse.contents  = NSColor.red  
    //SCNPlane geometry is still center-origin    
    box.position = SCNVector3(x + w / 2, y + h / 2,0)
    container.addChildNode(box)
}

addBox(w: 10, h:10, x: 290, y:290)
addBox(w: 10, h:10, x: 0, y:0)
addBox(w: 10, h:10, x: 0, y:290)
addBox(w: 10, h:10, x: 290, y:0)

result: 10-pixel blocks at each corner of the view

...