Я написал приложение 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