Создание SCNPlane как glUniformMatrix4fv - PullRequest
0 голосов
/ 26 июня 2019

Я написал приложение AR, работающее на EasyAR. Я рендерил видео поверх обнаруженного маркера, используя код target-c , найденный здесь , используя OpenGL. Ключевая часть кода ниже. Сейчас я пытаюсь сделать что-то похожее, используя SCNPlane, чтобы мне было проще размещать все элементы пользовательского интерфейса поверх плоскости, которую я хочу. Тем не менее, самолет, кажется, не отображается правильно (см. GIF обоих рендеров, работающих вместе). Есть идеи, почему это не совпадает? Как мне сделать так, чтобы он идеально совпадал?

Код Swift SCNPlane

var scnView: SCNView!

@objc func render(projectionMatrix: easyar_Matrix44F, cameraView:easyar_Matrix44F, sizeObjs:easyar_Vec2F) {

    var projection = [Float]()
    var camera = [Float]()
    let size = [sizeObjs.data[0],sizeObjs.data[0]]

    for i in 0...15 {
        projection.append((projectionMatrix.data![i]).floatValue)
    }

    for i in 0...15 {
        camera.append((cameraView.data![i]).floatValue)
    }


    let m = GLKMatrix4(m: (projection[0],projection[1],projection[2],projection[3],projection[4],projection[5],projection[6],projection[7], projection[8],projection[9],projection[10],projection[11],projection[12],projection[13],projection[14],projection[15]))

    let plane = SCNPlane()
    plane.firstMaterial?.diffuse.contents = UIColor.blue.withAlphaComponent(0.5)

    let n = SCNNode()
    n.transform = SCNMatrix4FromGLKMatrix4(m)
    n.geometry = plane

    let scnScene = SCNScene()
    overlayView.scene = scnScene

    scnScene.rootNode.addChildNode(n)

}

Экстракт Objective C OpenGL

- (void)render:(easyar_Matrix44F *)projectionMatrix cameraview:(easyar_Matrix44F *)cameraview size:(easyar_Vec2F *)size {
    //...
    float * cameraview_data = calloc(16, sizeof(float));
    float * cameraview_data = calloc(16, sizeof(float));
    float * projectionMatrix_data = calloc(16, sizeof(float));
    for (int i = 0; i < 16; i++) {
        cameraview_data[i] = [[cameraview.data objectAtIndex:i] floatValue];
    }
    for (int i = 0; i < 16; i++) {
        projectionMatrix_data[i] = [[projectionMatrix.data objectAtIndex:i] floatValue];
    }

    glUniformMatrix4fv(pos_trans_box, 1, 0, cameraview_data);
    glUniformMatrix4fv(pos_proj_box, 1, 0, projectionMatrix_data);
    // ...
}

ДЕМО GIF

enter image description here

...