iOS扫描黑色物体 机光3d扫描后生成3D模型都需要什么技术

- 或用以下帐号直接登录 -
3D扫描应用Itseez3D可方便生成全身3D模型
来源: 南方网作者:
  摘要:逐渐被人们接受的3D打印技术正热火朝天的发展中,这项产业囊括了很多方面,除了3D打印器材还需要3D扫描设备。Itseez3D正是一家致力于3D扫描设备配套软件开发的公司,近日他们更新了配合Occipital生产的3D扫描仪Structure Sensor(售价379美元)的iPad应用,升级后的Itseez3D应用由原来的支持头部和肩部扫描升级为支持对全身进行扫描,创建逼真的人体或物体的3D模型。
  新版本还提供了方便3D打印的色彩选择工具,可以在几分钟内进行纹理扫描选择最逼真的色彩纹理。相比之前版本还更新了以50%更高分辨率进行纹理扫描的选项。通过在iPad上运行改程序,并结合Structure Sensor扫描仪,即可对物体(或人)进行扫描收集3D模型数据,并在应用中通过先进的算法生成几何构造的单一色彩3D模型,用户可以通过工具选择真实的色彩或者单一色彩供3D打印机参考,数据会被发送到云端,而且可以支持任何市场上3D打印机能打印出的色彩。该应用用作非商业用途时免费,但如果企业用户使用数据进行3D打印则会收取一定的费用。
  下载页面
来源:cnbeta
扫一扫加入南方网微信朋友圈
编辑: 王如
请文明发言,还可以输入140字
您的评论已经发表成功,请等候审核
小提示:您要为您发表的言论后果负责,请各位遵守法纪注意语言文明
新闻关键词
为进一步推动广东省大学生深入学习《习近平总书记系列重要讲话读本》(2016年版),增强中国特色社会主义的道路自信、理论自信、制度自信,为实现中华民族伟大复兴的"中国梦"贡献智慧和力量,广东省委宣传部、南方网决定在全省普通高等学校大学生中开展"党中央治国理政新理念新思想新战略知识竞赛"活动。如何扫描成3D模型? - 知乎16被浏览5512分享邀请回答en.wikipedia.org/wiki/Structure_from_motion[4]Bundler: Structure from Motion (SfM) for Unordered Image Collections4添加评论分享收藏感谢收起iOS11 AR场景中关于3D模型的触碰检测
时间: 00:53:09
&&&& 阅读:204
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&& & & 最新 iOS11中的AR特别火爆,自己也到网上找了几个Demo把玩了下,核心代码无非以下:
//AR视图:展示3D界面
@property(nonatomic,strong)ARSCNView *arSCNV
添加模型方法一:
& // Create a new scene
& & SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
& & // Set the scene to the view
& & self.arSCNView.scene =&
添加模型方法二:
//1.使用场景加载scn文件(scn格式文件是一个基于3D建模的文件,使用3DMax软件可以创建,这里系统有一个默认的3D飞机)--------在右侧我添加了许多3D模型,只需要替换文件名即可
& & SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];//@"Models.scnassets/chair/chair.scn"];
& & //2.获取飞机节点(一个场景会有多个节点,此处我们只写,飞机节点则默认是场景子节点的第一个)
& & //所有的场景有且只有一个根节点,其他所有节点都是根节点的子节点
& & SCNNode *shipNode = scene.rootNode.childNodes[0];
& & self.planeNode = shipN
& & //飞机比较大,释放缩放一下并且调整位置让其在屏幕中间
& & shipNode.scale = SCNVector3Make(0.5, 0.5, 0.5);
& & shipNode.position = SCNVector3Make(0, -15,-15);
& & //一个飞机的3D建模不是一气呵成的,可能会有很多个子节点拼接,所以里面的子节点也要一起改,否则上面的修改会无效
& & for (SCNNode *node in shipNode.childNodes) {
& & & & node.scale = SCNVector3Make(0.5, 0.5, 0.5);
& & & & node.position = SCNVector3Make(0, -15,-15);
&& & //3.将飞机节点添加到当前屏幕中
& & [self.arSCNView.scene.rootNode addChildNode:shipNode];
//环境搭建代码见文后 结尾分割线 下
========================开头分割线====================
  最初想到的当然是通过添加手势看能否凑效,但是如果向ARSCNView添加,有点儿盲目做功,因为ARSCNView上不全是所求的3D模型,不管有没有点击到模型,手势方法都会出发;再观察SCNScene,&SCNScene继承自NSObject,观察了API又陷入了死胡同;返回来看ARSCNView有个方法:
&@method hitTest:options:
&@abstract Returns an array of SCNHitTestResult for each node that contains a specified point.
&@param point A point in the coordinate system of the receiver.
&@param options Optional parameters (see the "Hit test options" group for the available options).
- (NSArray&SCNHitTestResult *& *)hitTest:(CGPoint)point options:(nullable NSDictionary&SCNHitTestOption, id& *)
& & & 该方法会返回一个SCNHitTestResult数组,这个数组中每个元素的node都包含了指定的点(CGPoint)
打个比方:ARSCNView就是个多层合成木板,手指的每次点击,都好像一根针穿透模板,该方法会反回由针穿过的所有点(node)组成的一饿数组,每个点其实都包含了你手指点击的位置(CGPoint),这样我们就可以通过便利每个数组中每个SCNHitTestResult的node,看哪个node有父node,并且找到node的name和3D模型的根节点name做对比,可以找到那就是点击到了3D模型;
代码如下:
& & & & & &SCNNode *vaseNode = scene.rootNode.childNodes[0];
& & & & & & vaseNode.name = @"Virtual object root node";//很重要,就靠name做对比
& & & & & & //4.设置花瓶节点的位置为捕捉到的平地的位置,如果不设置,则默认为原点位置,也就是相机位置
& & & & & & vaseNode.position = SCNVector3Make(planeAnchor.center.x, 0, planeAnchor.center.z);
& & & & & & //5.将花瓶节点添加到当前屏幕中
& & & & & & //!!!此处一定要注意:花瓶节点是添加到代理捕捉到的节点中,而不是AR试图的根节点。因为捕捉到的平地锚点是一个本地坐标系,而不是世界坐标系
& & & & & & [node addChildNode:vaseNode];
// 系统方法
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event
& & if (self.arType == ARTypePlane&&self.rootNode) {
& & & & self.currentTouches =
& & & & UITouch *touch = [self.currentTouches anyObject];
&& & & & CGPoint tapPoint& = [touch locationInView:self.arSCNView];//该点就是手指的点击位置
& & & & NSDictionary *hitTestOptions = [NSDictionary dictionaryWithObjectsAndKeys:@(true),SCNHitTestBoundingBoxOnlyKey, nil];
& & & & NSArray&SCNHitTestResult *& * results= [self.arSCNView hitTest:tapPoint options:hitTestOptions];
& & & & for (SCNHitTestResult *res in results) {//遍历所有的返回结果中的node
& & & & & & if ([self isNodePartOfVirtualObject:res.node]) {
& & & & & & & & [self doSomeThing];
& & & & & & & &
& & & & & & }
//上溯找寻指定的node
-(BOOL) isNodePartOfVirtualObject:(SCNNode*)node {
& & if ([@"Virtual object root node" isEqualToString:node.name]) {
& & if (node.parentNode != nil) {
& & & & return [self isNodePartOfVirtualObject:node.parentNode];
===========结尾分割线==============
#pragma mark -搭建ARKit环境
//懒加载会话追踪配置
- (ARSessionConfiguration *)arSessionConfiguration
& & if (_arSessionConfiguration != nil) {
& & & & return _arSessionC
& & //1.创建世界追踪会话配置(使用ARWorldTrackingSessionConfiguration效果更加好),需要A9芯片支持
& & ARWorldTrackingSessionConfiguration *configuration = [[ARWorldTrackingSessionConfiguration alloc] init];
& & //2.设置追踪方向(追踪平面,后面会用到)
& & configuration.planeDetection = ARPlaneDetectionH
& & _arSessionConfiguration =
& & //3.自适应灯光(相机从暗到强光快速过渡效果会平缓一些)
& & _arSessionConfiguration.lightEstimationEnabled = YES;
& & return _arSessionC
//懒加载拍摄会话
- (ARSession *)arSession
& & if(_arSession != nil)
& & & & return _arS
& & //1.创建会话
& & _arSession = [[ARSession alloc] init];
& & _arSession.delegate =
& & //2返回会话
& & return _arS
//创建AR视图
- (ARSCNView *)arSCNView
& & if (_arSCNView != nil) {
& & & & return _arSCNV
& & //1.创建AR视图
& & _arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
& & //2.设置代理& 捕捉到平地会在代理回调中返回
& & _arSCNView.delegate =
& & //2.设置视图会话
& & _arSCNView.session = self.arS
& & //3.自动刷新灯光(3D游戏用到,此处可忽略)
& & _arSCNView.automaticallyUpdatesLighting = YES;
& & return _arSCNV
- (void)viewDidAppear:(BOOL)animated
& & [super viewDidAppear:animated];
& & //1.将AR视图添加到当前视图
& & [self.view addSubview:self.arSCNView];
& & //2.开启AR会话(此时相机开始工作)
& & [self.arSession runWithConfiguration:self.arSessionConfiguration];
}标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 ct扫描物体 的文章

 

随机推荐