将 3D 网格文件放在 Camera ARKit 前面 (objective-C)
Place 3D mesh file in front of Camera ARKit (objective-C)
我正在使用 ARKit 开发 iOS 应用程序。我想在设备(即 ARCamera)前面放置一个 3D 对象。
我现在的代码:
ARFrame* currentFrame = self.sceneView.session.currentFrame;
matrix_float4x4 translation = matrix_identity_float4x4;
translation.columns[3][2] = -1.52; // Translate 5 feet in front of camera
translation.columns[3][1] = -1.22; // Translate 4 feet below the camera
node.simdTransform = matrix_multiply(currentFrame.camera.transform, translation);
node.rotation = SCNVector4Make(0, 0, 0, 0);
node.scale = SCNVector3Make(0.3, 0.3, 0.3);
我有以下问题:
- 将 3D 对象放置在 ARCamera 前面(相机前面和下方)的代码是否正确?
如果您对此主题有任何建议和想法,我将不胜感激。谢谢。
要将 SCNNode
放在相机前面的那个位置(假设您希望它保持锁定状态),您可以这样做:
node.position = SCNVector3(0,-1,-1)
这会将节点设置在下方 1m,距离 Camera 1m。
如果您只想将某些内容 'locked' 放在屏幕中央,您还可以使用:
scnView.pointOfView?.addChildNode(node)
如果您想将 SCNNode
直接放置在使用它的 current.frame
相机前面,您可以使用此方法:
/// Adds An SCNNode 3m Away From The Current Frame Of The Camera
func addNodeInFrontOfCamera(){
guard let currentTransform = augmentedRealitySession.currentFrame?.camera.transform else { return }
let nodeToAdd = SCNNode()
let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
boxGeometry.firstMaterial?.diffuse.contents = UIColor.red
nodeToAdd.geometry = boxGeometry
var translation = matrix_identity_float4x4
//Change The X Value
translation.columns.3.x = 0
//Change The Y Value
translation.columns.3.y = 0
//Change The Z Value
translation.columns.3.z = -3
nodeToAdd.simdTransform = matrix_multiply(currentTransform, translation)
augmentedRealityView?.scene.rootNode.addChildNode(nodeToAdd)
}
var
增强现实视图是一个 ARSCNView
。
更新在Objective C:
-(void)addNodeInFrontOfCamera{
SCNBox * cube = [SCNBox boxWithWidth:0.1 height:0.1 length:0.1 chamferRadius:0.0];
cube.firstMaterial.diffuse.contents = [UIColor redColor];
SCNNode *cubeNode = [SCNNode nodeWithGeometry:cube];
[self.sceneView.scene.rootNode addChildNode:cubeNode];
matrix_float4x4 cameraTransform = self.sceneView.session.currentFrame.camera.transform;
matrix_float4x4 translation = matrix_identity_float4x4;
//Change The X Value
translation.columns[3][0] = 0;
//Change The Y Value
translation.columns[3][1] = 0;
//Change The Z Value
translation.columns[3][2] = -3;
cubeNode.simdTransform = matrix_multiply(cameraTransform, translation);
}
我正在使用 ARKit 开发 iOS 应用程序。我想在设备(即 ARCamera)前面放置一个 3D 对象。
我现在的代码:
ARFrame* currentFrame = self.sceneView.session.currentFrame;
matrix_float4x4 translation = matrix_identity_float4x4;
translation.columns[3][2] = -1.52; // Translate 5 feet in front of camera
translation.columns[3][1] = -1.22; // Translate 4 feet below the camera
node.simdTransform = matrix_multiply(currentFrame.camera.transform, translation);
node.rotation = SCNVector4Make(0, 0, 0, 0);
node.scale = SCNVector3Make(0.3, 0.3, 0.3);
我有以下问题:
- 将 3D 对象放置在 ARCamera 前面(相机前面和下方)的代码是否正确?
如果您对此主题有任何建议和想法,我将不胜感激。谢谢。
要将 SCNNode
放在相机前面的那个位置(假设您希望它保持锁定状态),您可以这样做:
node.position = SCNVector3(0,-1,-1)
这会将节点设置在下方 1m,距离 Camera 1m。
如果您只想将某些内容 'locked' 放在屏幕中央,您还可以使用:
scnView.pointOfView?.addChildNode(node)
如果您想将 SCNNode
直接放置在使用它的 current.frame
相机前面,您可以使用此方法:
/// Adds An SCNNode 3m Away From The Current Frame Of The Camera
func addNodeInFrontOfCamera(){
guard let currentTransform = augmentedRealitySession.currentFrame?.camera.transform else { return }
let nodeToAdd = SCNNode()
let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
boxGeometry.firstMaterial?.diffuse.contents = UIColor.red
nodeToAdd.geometry = boxGeometry
var translation = matrix_identity_float4x4
//Change The X Value
translation.columns.3.x = 0
//Change The Y Value
translation.columns.3.y = 0
//Change The Z Value
translation.columns.3.z = -3
nodeToAdd.simdTransform = matrix_multiply(currentTransform, translation)
augmentedRealityView?.scene.rootNode.addChildNode(nodeToAdd)
}
var
增强现实视图是一个 ARSCNView
。
更新在Objective C:
-(void)addNodeInFrontOfCamera{
SCNBox * cube = [SCNBox boxWithWidth:0.1 height:0.1 length:0.1 chamferRadius:0.0];
cube.firstMaterial.diffuse.contents = [UIColor redColor];
SCNNode *cubeNode = [SCNNode nodeWithGeometry:cube];
[self.sceneView.scene.rootNode addChildNode:cubeNode];
matrix_float4x4 cameraTransform = self.sceneView.session.currentFrame.camera.transform;
matrix_float4x4 translation = matrix_identity_float4x4;
//Change The X Value
translation.columns[3][0] = 0;
//Change The Y Value
translation.columns[3][1] = 0;
//Change The Z Value
translation.columns[3][2] = -3;
cubeNode.simdTransform = matrix_multiply(cameraTransform, translation);
}