OpenGL-自主高性能三维GIS平台架构与实现(第2季)

123 阅读3分钟

学习地址1:pan.baidu.com/s/1Z2FTiwJ6… 提取码:12so 学习地址2:share.weiyun.com/I2HekLPO 密码:b36r5s

今天给大家讲讲关于OpenGL的知识,以及结合OpenGL自主高性能三维GIS平台架构与实现的全流程。我将从2D->2.5D->3D立体球,全程零代码到完全实现,带着大家一步步学习。

首先,我们先来看看什么是OpenGL? OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。

如果用一句话来描述 OpenGL 的话,我想应该是基于C/S结构设计的模板模式(设计模式里的那个);在 图形渲染管线 这节,主要介绍的是其模板设计,在 OpenGL 里我们称之为 PipeLine;在 C/S结构 这节,则介绍 OpenGL C/S 结构给 OpenGL 带来的一些对于初学者看起来可能觉得奇奇怪怪的东西。

我们知道,automapper的映射是基于语法糖和语法约定的,他会自动映射两个对象中名字相同的字断,而默认情况下,找不到匹配的字断将会被忽略,使用null,使用空来代替。除了使用automapper的自动映射,我们也可以手动添加映射关系。比如,dto中的价格,相当于模型中原价乘以折扣,我们可以把这个计算过程放在automapper中进行,对这样的映射过程有一个专有名词,叫做投影,projection。投影是个数学概念,所谓投影,就是把资源对象中的某一个或几个数据,进过一定的变化和计算,然后传递给目标对象。在autompeer中,我们可以使用ForMember函数做字断的投影。 public TouristRouteProfile() { CreateMap<TouristRoute, TouristRouteDto>() .ForMember( dest => dest.Price, opt => opt.MapFrom(src => src.OriginalPrice * (decimal)(src.DiscountPresent ?? 1)) ) .ForMember( dest => dest.TravelDays, opt => opt.MapFrom(src => src.TravelDays.ToString()) ) .ForMember( dest => dest.TripType, opt => opt.MapFrom(src => src.TripType.ToString()) ) .ForMember( dest => dest.DepartureCity, opt => opt.MapFrom(src => src.DepartureCity.ToString()) ); } 这次ValidationContext 所访问的不再是属性级别的数据,而是class类级别的数据,然后再通过class来访问属性。所以如果我们想访问TouristRouteForCreationDto的话,代码可以这么写,本地变量 var touristRoute 等于 validationContext 点 ObjectInstance,因为这个时候获取的数据类型是普通的对象,所以我们还需要进行类型转换,(),把它转化为“(TouristRouteForCreationDto)”,当然,我们还需要引入dto的命名空间。 public class TouristRouteTitleMustBeDifferentFromDescriptionAttribute: ValidationAttribute { protected override ValidationResult IsValid( object value, ValidationContext validationContext ) { var touristRouteDto = (TouristRouteForCreationDto)validationContext.ObjectInstance; if (touristRouteDto.Title == touristRouteDto.Description) { return new ValidationResult( "路线名称必须与路线描述不同", new[] { "TouristRouteForCreationDto" } ); } return ValidationResult.Success; } } 拿到用户数据,我们就可以开始配置jwt数据了,首先,在claims数组中,把假数据替换为真数据。 接着,继续使用userManager 来获得用户的角色的字符串。 // 3. 添加用户 var adminUserId = "90184155-dee0-40c9-bb1e-b5ed07afc04e"; ApplicationUser adminUser = new ApplicationUser { Id = adminUserId, UserName = "admin@fakexiecheng.com", NormalizedUserName = "admin@fakexiecheng.com".ToUpper(), Email = "admin@fakexiecheng.com", NormalizedEmail = "admin@fakexiecheng.com".ToUpper(), TwoFactorEnabled = false, EmailConfirmed = true, PhoneNumber = "123456789", PhoneNumberConfirmed = false }; 那这种 C/S 结构对于我们使用 OpenGL 有什么影响呢? 最大的影响就是在于我们只能在 OpenGL context 所在的线程调用 OpenGL 的接口,详细阅读 EGL 标准你会知道所有 OpenGL 接口都存在一个阴式的入参,就是 OpenGL Context public static async Task<PaginationList> CreateAsync( int currentPage, int pageSize, IQueryable result) { // pagination // skip var skip = (currentPage - 1) * pageSize; result = result.Skip(skip); // 以pagesize为标准显示一定量的数据 result = result.Take(pageSize);

// include vs join
var items = await result.ToListAsync();

return new PaginationList<T>(currentPage, pageSize, items);

} 最后,在返回数据的时候,删掉分页处理的部分,返回类型使用PaginationList的实例创建工厂。 private readonly AppDbContext _context; private readonly IPropertyMappingService _propertyMappingService;

public TouristRouteRepository( AppDbContext appDbContext, IPropertyMappingService propertyMappingService ) { _context = appDbContext; _propertyMappingService = propertyMappingService; } 本文到此结束,感谢大家的观看!!