Three.js可视化企业实战WEBGL课(源码+课件+素材+2023年12月升级版47章全)
给大家分享一套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现在很长,不过这这不重要,发送请求,现在就得到了一个特定的图片信息,
![QQ截图20231208102941.png](https://static.golangjob.cn/231208/f0a9b1c863c034b33e12cdcb1e25096a.png)
有疑问加站长微信联系(非本文作者)