更新时间:2023-04-06
绘制3D模型简介
Since 6.4.0起iOS地图SDK支持3D模型(BMK3DModelOverlay)绘制,用于在地图上展示3D模型,目前支持.obj+.mtl文件格式和.gltf模型加载。Since 6.5.7起iOS地图SDK支持.gltf+.bin模型加载,并支持动画播放参数控制。
绘制3D模型
1添加3D模型覆盖物数据
Objective-C
Swift
BMK3DModelOption *option = [[BMK3DModelOption alloc] init]; option.modelName = @"among_us"; option.scale = 1; option.modelPath = [NSString stringWithFormat:@"%@/Model3D", [NSBundle mainBundle].bundlePath]; _modelOverlay = [BMK3DModelOverlay modelOverlayWithCenterCoordinate:CLLocationCoordinate2DMake(39.914838, 116.40299) option:option]; BMK3DModelOption *option = [[BMK3DModelOption alloc] init]; option.scale = 100; option.modelName = @"batman"; option.zoomFixed = YES; option.modelPath = [NSString stringWithFormat:@"%@/Model3D", [NSBundle mainBundle].bundlePath]; _modelBatManOverlay = [BMK3DModelOverlay modelOverlayWithCenterCoordinate:CLLocationCoordinate2DMake(39.914838, 116.40499) option:option]; /** 向地图View添加Overlay,需要实现BMKMapViewDelegate的-mapView:viewForOverlay:方法 来生成标注对应的View @param overlay 要添加的overlay */ [_mapView addOverlays:@[self.modelOverlay, self.modelBatManOverlay]];
var coords = [CLLocationCoordinate2D]() coords.append(CLLocationCoordinate2D(latitude: 39.910, longitude: 116.370)) coords.append(CLLocationCoordinate2D(latitude: 39.950, longitude: 116.430)) //表示一个经纬度区域:东北角点经纬度坐标和西南角点经纬度坐标 let bound = BMKCoordinateBounds(northEast: coords[1], southWest: coords[0]) let option = BMK3DModelOption.init() option.scale = 1 option.modelName = "among_us" option.modelPath = Bundle.main.bundlePath + "/Model3D" let modelOverlay: BMK3DModelOverlay = BMK3DModelOverlay(center: CLLocationCoordinate2D(latitude: 39.914838, longitude: 116.40299), option: option) var coords = [CLLocationCoordinate2D]() coords.append(CLLocationCoordinate2D(latitude: 39.910, longitude: 116.370)) coords.append(CLLocationCoordinate2D(latitude: 39.950, longitude: 116.430)) //表示一个经纬度区域:东北角点经纬度坐标和西南角点经纬度坐标 let bound = BMKCoordinateBounds(northEast: coords[1], southWest: coords[0]) let option = BMK3DModelOption.init() option.scale = 100 option.modelName = "batman" option.zoomFixed = true option.modelPath = Bundle.main.bundlePath + "/Model3D" let modelOverlay: BMK3DModelOverlay = BMK3DModelOverlay(center: CLLocationCoordinate2D(latitude: 39.914838, longitude: 116.40499), option: option) mapView.addOverlays([modelOverlay, modelBatManOverlay])
2实现代理方法生成对应的view(BMK3DModelOverlayView)
Objective-C
Swift
#pragma mark - BMKMapViewDelegate /** 根据overlay生成对应的BMKOverlayView @param mapView 地图View @param overlay 指定的overlay @return 生成的覆盖物View */ - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay { if ([overlay isKindOfClass:[BMK3DModelOverlay class]]) { //初始化一个overlay并返回相应的BMK3DModelOverlayView的实例 BMK3DModelOverlayView *modelOverlayView = [[BMK3DModelOverlayView alloc] initWith3DModelOverlay:overlay]; return modelOverlayView; } return nil; }
//MARK:BMKMapViewDelegate /** 根据overlay生成对应的BMKOverlayView @param mapView 地图View @param overlay 指定的overlay @return 生成的覆盖物View */ func mapView(_ mapView: BMKMapView!, viewFor overlay: BMKOverlay!) -> BMKOverlayView! { if overlay.isKind(of: BMK3DModelOverlay.self) { let modelView = BMK3DModelOverlayView(overlay as! BMK3DModelOverlay) return modelView } return nil }
3动画控制
/// 以下只支持带有animations标签的GLTF模型 /// 模型动画是否可用,默认为NO:添加后不执行动画,值为YES时添加后立即按照配置参数执行动画,since 6.5.7 @property (nonatomic, assign) BOOL animationIsEnable; /// 模型动画重复执行次数,默认0:动画将一直执行动画,since 6.5.7 @property (nonatomic, assign) NSInteger animationRepeatCount; /// 当前模型动画索引值,since 6.5.7 @property (nonatomic, assign) NSInteger animationIndex; /// 模型动画倍速,默认:1.0,since 6.5.7 @property (nonatomic, assign) CGFloat animationSpeed;
Objective-C
Swift
BMK3DModelOption *option = [[BMK3DModelOption alloc] init]; option.scale = 2; option.modelName = @"scenes"; option.type = BMK3DModelTypeGLTF; option.zoomFixed = YES; option.rotateX = 90; option.animationIsEnable = YES; option.animationIndex = 0; option.animationSpeed = 1; option.animationRepeatCount = 0; option.modelPath = [NSString stringWithFormat:@"%@/Model3D", [NSBundle mainBundle].bundlePath];
let modelOption = BMK3DModelOption() modelOption.scale = 2 modelOption.modelName = "scenes" modelOption.rotateX = 90 modelOption.type = BMK3DModelTypeGLTF modelOption.modelPath = String(format: "%@/Model3D",Bundle.main.bundlePath) modelOption.animationIsEnable = true modelOption.animationSpeed = 1 modelOption.animationRepeatCount = 0 modelOption.animationIndex = 1
4运行程序
效果如下:
https://mapopen-pub-iossdk.cdn.bcebos.com/map/v6_5_7/3dModel_2.MP4