浏览 550 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2023-12-08
网盘地址:https://pan.baidu.com/s/1qBlyo987PF4SMfw18lDZ-g 提取码:zuaf 腾讯微云下载地址:https://share.weiyun.com/DuXGfKg8 密码:rrhatr 给大家分享一套Three.js课程——Three.js可视化企业实战WEBGL课,全网最全,源码+课件+素材+2023年12月升级版47章。大家下载学习。 OpenGL它是最常用的跨平台图形库。 WebGL是基于OpenGL设计的面向web的图形标准,提供了一系列JavaScript API,通过这些API进行图形渲染将得以利用图形硬件从而获得较高性能。 而Three.js是通过对WebGL接口的封装与简化而形成的一个易用的图形库。 简单点的说法threejs=three + js,three表示3D的意思,js表示javascript的意思。那么合起来,three.js就是使用javascript 来写3D程序的意思。而javascript的计算能力因为google的V8引 擎得到了迅猛的增强,做3D程序,做服务器都没有问题。 WebGL门槛相对较高,需要相对较多的数学知识(线性代数、解析几何)。因此,想要短时间上手WebGL还是挺有难度的。 Three.js对WebGL提供的接口进行了非常好的封装,简化了很多细节,大大降低了学习成本。并且,几乎没有损失WebGL的灵活性。 因此,从Three.js入手是值得推荐的,这可以让你在较短的学习后就能面对大部分需求场景。 三大组建 在Three.js中要渲染物体到网页中我们需要3个组件 场景scene 场景是所有物体的容器,如果要显示一个苹果,就需要将苹果对象加入场景中 let scene = new THREE.Scene(); 1 相机camera 另一个组建是相机,相机决定了场景中那个角度的景色会显示出来。相机就像人的眼睛一样,人站在不同位置,抬头或者低头都能够看到不同的景色。 场景只有一种,但是相机却有很多种 只要设置不同的相机参数,就能够让相机产生不一样的效果 透视相机这里使用的是透视相机 let camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000) 1 设置不同的相机需要不同的参数 会出现不同的效果 渲染器renderer 渲染器决定了渲染的结果应该画在页面的什么元素上面 并且以怎样的方式来绘制 let renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); //挂载到页面 document.body.appendChild(renderer.domElement) 1 2 3 4 添加物体 let geometry = new THREE.CubeGeometry(1, 1, 1); //width:立方体x轴的长度,height:立方体y轴的长度,depth:立方体z轴的长度也是深度 1 2 渲染物体 renderer.render(scene, camera) //scene:前面定义的场景,camera:前面定义的相机 //renderTarget:渲染的目标默认是是渲染到前面定义的render变量中 //forceClear:每次绘制之前都将画布的内容给清除,即使自动清除标志autoClear为false,也会清除 1 2 3 4 function render() { cube.rotation.x += 0.1 cube.rotation.y += 0.1 renderer.render(scene, camera) requestAnimationFrame(render) } 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()) ); } 所以在函数体内,第一步,就是判读父资源是否存在, if (!(await _touristRouteRepository.TouristRouteExistsAsync(touristRouteId))) { 如果不存在, 直接就 return NotFound("旅游路线不存在"); } 如果父资源存在,才继续下面的内容,凭图片id获得图片。图片从哪来,当然是我们的数据仓库,Repository,好的,打开数据仓库的接口,加上一个新的接口函数,一个返回类型为TouristRoutePicture的函数, GetPicture,参数(int pictureId); 具体的实现也很简单, public TouristRoutePicture GetPicturesByTouristRouteIdAndPictureIdAsync(Guid touristRouteId, int pictureId) { return await _context.TouristRoutePictures .Where(p => p.Id == pictureId) .SingleOrDefaultAsync(); } 现在回到控制器,完成获取图片的代码。 var pictureFromRepo = _touristRouteRepository.GetPicturesByTouristRouteIdAndPictureId(pictureId); if (pictureFromRepo == null) { return NotFound("no picture found"); } 最后 return ok,使用automapper,_mapper.Map,map的数据类型是 TouristRoutePictureDto,最后括号中添上数据源picturesFromRepo。 return Ok(_mapper.Map<TouristRoutePictureDto>>(pictureFromRepo)); 接下来我们运行试试看,先准备好url,旅游路线 id和图片id,url现在很长,不过这这不重要,发送请求,现在就得到了一个特定的图片信息, 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |