參考Minecode
效果:
1.從外面看不到模型里面的場景
2.在場景里只可以透過門來看到外面的場景
實現(xiàn)思路:
1.先用平面識別在一個平面上放1個門 整個場景做門的子物體 先隱藏起來 給門和攝像機加個觸發(fā)器 當他們的觸發(fā)器產生碰撞就顯示子物體出來
2.把模型加載出來 然后用透明的面去遮擋你想隱藏的節(jié)點 這個方法比第一個方法簡單一點 因為加觸發(fā)器比較麻煩 所以我采取的第二種方法
第一種方法也可以實現(xiàn) 只是代碼比較累贅
主要代碼:
//設置渲染順序 優(yōu)先級是從小到大
childNode.renderingOrder = 200;
//透明度
maskNode.geometry.firstMaterial.transparency = 0.00001;
代碼:
//
// ViewController.h
// 傳送門
//
// Created by LJP on 11/1/18.
// Copyright ? 2018年 poco. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<ARSCNViewDelegate>
//視圖
@property (nonatomic, strong) ARSCNView * jpARSCNView;
//會話
@property (nonatomic, strong) ARSession * jpARSession;
//跟蹤會話
@property (nonatomic, strong) ARWorldTrackingConfiguration * jpARWTkConfiguration;
//檢測到的平面數(shù)據(jù)
@property (nonatomic, strong) ARPlaneAnchor * planeAnchor;
//是否顯示了房子
@property (nonatomic, assign) BOOL isShow;
@end
@implementation ViewController
#pragma mark ============================== 生命周期 ==============================
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.jpARSCNView];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.jpARSCNView.session runWithConfiguration:self.jpARWTkConfiguration];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.jpARSCNView.session pause];
}
#pragma mark ============================== 私有方法 ==============================
- (void)addPortalWithTransform:(matrix_float4x4)transform {
self.isShow = YES;
SCNScene * portalScene = [SCNScene sceneNamed:@"Model.scnassets/tjgc.scn"];
if (portalScene == nil) return;
SCNNode * portalNode = [portalScene.rootNode childNodeWithName:@"tjgc" recursively:YES];
SCNVector3 newVector3 = SCNVector3Make(transform.columns[3].x, transform.columns[3].y-1, transform.columns[3].z-1);
portalNode.position = newVector3;
[self.jpARSCNView.scene.rootNode addChildNode: portalNode];
//按照順序渲染節(jié)點
[self addPlaneWithNodeName:@"roof" portalNode:portalNode imageName:@"top"];
[self addPlaneWithNodeName:@"floor" portalNode:portalNode imageName:@"bottom"];
[self addWallsWithNodeName:@"backWall" portalNode:portalNode imageName:@"back"];
[self addWallsWithNodeName:@"sideWallA" portalNode:portalNode imageName:@"sideA"];
[self addWallsWithNodeName:@"sideWallB" portalNode:portalNode imageName:@"sideB"];
[self addWallsWithNodeName:@"sideDoorA" portalNode:portalNode imageName:@"sideDoorA"];
[self addWallsWithNodeName:@"sideDoorB" portalNode:portalNode imageName:@"sideDoorB"];
[self addWallsWithNodeName:@"doorHeader" portalNode:portalNode imageName:@"top"];
[self addNodeWithNodeName:@"tower" portalNode:portalNode imageName:@""];
}
- (void)addPlaneWithNodeName:(NSString *)nodeName portalNode:(SCNNode *)portalNode imageName:(NSString *)imageName {
SCNNode * childNode = [portalNode childNodeWithName:nodeName recursively:YES];
if (childNode != nil) {
NSString * path = [NSString stringWithFormat:@"Model.scnassets/%@.png",imageName];
childNode.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:path];
childNode.renderingOrder = 200;
}
}
- (void)addWallsWithNodeName:(NSString *)nodeName portalNode:(SCNNode *)portalNode imageName:(NSString *)imageName {
SCNNode * childNode = [portalNode childNodeWithName:nodeName recursively:YES];
if (childNode != nil) {
NSString * path = [NSString stringWithFormat:@"Model.scnassets/%@.png",imageName];
childNode.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:path];
childNode.renderingOrder = 200;
}
SCNNode * maskNode = [childNode childNodeWithName:@"mask" recursively:YES];
maskNode.renderingOrder = 150;
maskNode.geometry.firstMaterial.transparency = 0.00001; //透明度
}
- (void)addNodeWithNodeName:(NSString *)nodeName portalNode:(SCNNode *)portalNode imageName:(NSString *)imageName {
SCNNode * childNode = [portalNode childNodeWithName:nodeName recursively:YES];
childNode.renderingOrder = 200;
}
#pragma mark ============================== 代理方法 ==============================
- (void)renderer:(id<SCNSceneRenderer>)renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor {
if ([anchor isKindOfClass: [ARPlaneAnchor class]] == NO) return;
self.planeAnchor = (ARPlaneAnchor *)anchor;
if (self.isShow == NO) {
[self addPortalWithTransform:self.planeAnchor.transform];
}
}
#pragma mark ============================== 訪問器方法 ==============================
- (ARSCNView *)jpARSCNView {
if (_jpARSCNView == nil) {
_jpARSCNView = [[ARSCNView alloc]init];
_jpARSCNView.frame = self.view.frame;
_jpARSCNView.showsStatistics = YES;
_jpARSCNView.delegate = self;
_jpARSCNView.automaticallyUpdatesLighting = YES;
_jpARSCNView.debugOptions = ARSCNDebugOptionShowFeaturePoints;
SCNScene * scene= [[SCNScene alloc]init];
_jpARSCNView.scene = scene;
}
return _jpARSCNView;
}
- (ARSession *)jpARSession {
if (_jpARSession == nil) {
_jpARSession = [[ARSession alloc]init];
}
return _jpARSession;
}
- (ARWorldTrackingConfiguration *)jpARWTkConfiguration {
if (_jpARWTkConfiguration == nil) {
_jpARWTkConfiguration = [[ARWorldTrackingConfiguration alloc]init];
_jpARWTkConfiguration.planeDetection = ARPlaneDetectionHorizontal;
}
return _jpARWTkConfiguration;
}
@end
代碼
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者