[23年12月版47章]Three.js可视化企业实战WEBGL课
学习地址1:https://pan.baidu.com/s/1kyZNWtrLQERjMlaRwiRlSg 提取码:150r
学习地址2:https://share.weiyun.com/Sa6MSzwS 密码:n99b5x
Three.js 是一个 3D JavaScript 库,它可以帮助你为网络创造3D体验,而且非常容易使用。如果你想让你的网站更加炫酷,那么 Three.js 一定是你的好帮手。
Three.js 是一个在 MIT 许可下的 JavaScript 库,它在 WebGL 之上运行。这个库的目标就是简化处理3D内容的过程。只需要几行代码,你就可以获得一个动画3D场景,而且你无需了解复杂的着色器和矩阵。
要在屏幕上展示3D图形,思路大体上都是这样的:
1、构建一个三维空间
Three中称之为场景(Scene)
2、选择一个观察点,并确定观察方向/角度等
Three中称之为相机(Camera)
3、在场景中添加供观察的物体
Three中的物体有很多种,包括Mesh,Line,Points等,它们都继承自Object3D类
4、将观察到的场景渲染到屏幕上的指定区域
Three中使用Renderer完成这一工作
不同服务之间的通信可以采用restTemplate来进行通信调用,当然使用httpClient来构建也是可以的。
com.imooc.api.config.CloudConfig.java
@Autowired
private RestTemplate restTemplate;
// 判断faceId不为空,为空直接返回登录失败
// 2. 请求文件服务,获取人脸的base64信息
String fileServerUrlExecute = "http://files.imoocnews.com:8004/fs/readFace64InGridFS?faceId=" + adminFaceId;
ResponseEntity<GraceJSONResult> resultEntity = restTemplate.getForEntity(fileServerUrlExecute, GraceJSONResult.class);
GraceJSONResult graceJSONResult = resultEntity.getBody();
String base64DB = (String)graceJSONResult.getData();
// System.out.println("restTemplate远程调用获得的内容为:" + base64);
return GraceJSONResult.ok();
com.imooc.admin.controller.FriendLinkMngController.java
@RestController
public class FriendLinkMngController extends BaseController implements FriendLinkMngControllerApi {
final static Logger logger = LoggerFactory.getLogger(FriendLinkMngController.class);
@Override
public GraceJSONResult saveOrUpdateFriendLink(SaveFriendLinkBO saveFriendLinkBO,
BindingResult result) {
// System.out.println(saveFriendLinkBO.toString());
// 判断BindingResult是否保存错误的验证信息,如果有,则直接return
if (result.hasErrors()) {
Map<String, String> errorMap = getErrors(result);
return GraceJSONResult.errorMap(errorMap);
}
// 保存到MongoDB
FriendLinkMO friendLinkMO = new FriendLinkMO();
BeanUtils.copyProperties(saveFriendLinkBO, friendLinkMO);
friendLinkMO.setCreateTime(new Date());
friendLinkMO.setUpdateTime(new Date());
return GraceJSONResult.ok();
}
}
下面我们用一个简单的例子来梳理一下这个过程。
首先写一个有Canvas元素的页面吧。
@Document(collection = "friend_link")
public class FriendLinkMO {
/**
* @Id 自定义Id主键,mongodb的文档id不会自动生成,会使用我们设置的id值
*/
@Id
private String id;
@Field("link_name")
private String linkName;
@Field("link_url")
private String linkUrl;
@Field("is_delete")
private Integer isDelete;
@Field("create_time")
private Date createTime;
@Field("update_time")
private Date updateTime;
// getter setter ...
}
@Service
public class AppUserMngServiceImpl implements AppUserMngService {
@Autowired
public AppUserMapper appUserMapper;
@Override
public PagedGridResult queryAllUserList(String nickname, Integer status,
Date startDate, Date endDate,
Integer page, Integer pageSize) {
Example userExample = new Example(AppUser.class);
userExample.orderBy("createdTime").desc();
Example.Criteria criteria = userExample.createCriteria();
if (StringUtils.isNotBlank(nickname)) {
criteria.andLike("nickname", "%" + nickname + "%");
}
if (UserStatus.isUserStatusValid(status)) {
criteria.andEqualTo("activeStatus", status);
}
if (startDate != null) {
criteria.andGreaterThanOrEqualTo("createdTime", startDate);
}
if (endDate != null) {
criteria.andLessThanOrEqualTo("createdTime", endDate);
}
PageHelper.startPage(page, pageSize);
List<AppUser> list = appUserMapper.selectByExample(userExample);
return setterPagedGrid(list, page);
}
}
要唯一确定一个相机的位置与方向,position、up、lookAt三个属性是缺一不可的。
这里我们创建了一个正交投影相机,这里我将视景体大小与屏幕分辨率保持一致只是为了方便,这样坐标系中的一个单位长度就对应屏幕的一个像素了。
我们将相机放在Z轴上,面向坐标原点,相机的上方向为Y轴方向,注意up的方向和lookAt的方向必然是垂直的(类比自己的头就知道了)。
下面添加一个立方体到场景中:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.imooc.article.mapper.ArticleMapperCustom" >
<update id="updateAppointToPublish">
UPDATE
article
SET
is_appoint = 0
WHERE
publish_time <= NOW()
and
is_appoint = 1
</update>
</mapper>
three.js中的三大要素:场景(scene)、相机(camera)、衬着器(renderer),有了这三样东西,我们才能够运用相机将场景衬着到网页上去。
@Override
public GraceJSONResult queryMyList(String userId, String keyword,
Integer status,
Date startDate, Date endDate,
Integer page, Integer pageSize) {
if (StringUtils.isBlank(userId)) {
return GraceJSONResult.errorCustom(ResponseStatusEnum.ARTICLE_QUERY_PARAMS_ERROR);
}
if (page == null) {
page = COMMON_START_PAGE;
}
if (pageSize == null) {
pageSize = COMMON_PAGE_SIZE;
}
PagedGridResult gridResult = articleService.queryMyArticleList(userId,
keyword,
status,
startDate,
endDate,
page,
pageSize);
return GraceJSONResult.ok(gridResult);
}
首先可以在数据库通过写sql脚本实现查询
SELECT
c.id as commentId,
c.father_id as fatherId,
c.article_id as articleId,
c.comment_user_id as commentUserId,
c.comment_user_nickname as commentUserNickname,
c.content as content,
c.create_time as createTime,
f.comment_user_nickname as quoteUserNickname,
f.content as quoteContent
FROM
comments c
LEFT JOIN
comments f
on
c.father_id = f.id
WHERE
c.article_id = '2006117B57WRZGHH'
order by
c.create_time
desc
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传