[最新47章]Three.js可视化企业实战WEBGL课(23年12月升级版)
网盘地址:https://pan.baidu.com/s/1JUzSfbQ95949f7LBDoyRDQ 提取码:mog6
腾讯微云下载地址:https://share.weiyun.com/Sa6MSzwS 密码:n99b5x
今天给大家讲讲关于Three.js可视化相关的内容,从0基础到企业项目实战,内容一共47章,其中包含Three.js开发入门、three.js环境搭建、WebGPU与WGSL入门与原理、blender基础进阶、Cesium入门等,结合大量实战案例,比如全景看房与科技展馆案例、智慧城市案例、Cesium智慧广州项目实战案例、海景酒店日夜交替全景展示、AI寻路避障自动导航案例、可视化物理模拟仿真、WEB端打造开放虚拟世界、程序化节点材质打造逼真科技展馆案例等等,还有在这个月新研究出来的3D动画系统详解,本文章必将干货满满,希望大家会喜欢。
那么,首先,我们先讲讲什么是Three.js、什么是webgl?对他们的概念做一个简单的了解。
three.js,一个WebGL引擎,基于JavaScript,可直接运行GPU驱动游戏与图形驱动应用于浏览器。其库提供的特性与API以绘制3D场景于浏览器。
WebGL(全写Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速。
1.1 属性
最常见的方法是通过缓冲区和属性。 如下代码创建缓冲区,
var buf = gl.createBuffer();
将数据放入这些缓冲区:
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER, someData, gl.STATIC_DRAW);
然后,给定一个着色器程序,让你在初始化时查找其属性的位置
var positionLoc = gl.getAttribLocation(someShaderProgram, "a_position");
并在渲染时告诉 WebGL 如何将数据从这些缓冲区中拉出并放入属性中
// turn on getting data out of a buffer for this attribute
gl.enableVertexAttribArray(positionLoc);
var numComponents = 3; // (x, y, z)
var type = gl.FLOAT; // 32bit floating point values
var normalize = false; // leave the values as they are
var offset = 0; // start at the beginning of the buffer
var stride = 0; // how many bytes to move to the next vertex
// 0 = use the correct stride for type and numComponents
gl.vertexAttribPointer(positionLoc, numComponents, type, normalize, stride, offset);
自定义异常类继承的父类,我没有选择Exception。因为Exception类型的异常,我们必须要手动显式处理,要么上抛,要么捕获。我希望我定义的异常采用既可以采用显式处理,也可以隐式处理,所以我选择继承RuntimeException这个父类。RuntimeException类型的异常可以被虚拟机隐式处理,这样就省去了我们很多手动处理异常的麻烦。
创建com.example.emos.wx.exception包
创建EmosException类
package com.example.emos.wx.exception;
import lombok.Data;
@Data
public class EmosException extends RuntimeException{
private String msg;
private int code = 500;
public EmosException(String msg) {
super(msg);
this.msg = msg;
}
public EmosException(String msg, Throwable e) {
super(msg, e);
this.msg = msg;
}
public EmosException(String msg, int code) {
super(msg);
this.msg = msg;
this.code = code;
}
public EmosException(String msg, int code, Throwable e) {
super(msg, e);
this.msg = msg;
this.code = code;
}
}
编写demo.vue文件
<template>
<view>
<view>{{username}}</view>
<view v-for="one in tel">{{one}}</view>
<view v-if="age>=18">
<button @tap="signUp">我要报名</button>
</view>
<view>
<input type="text" v-model="address" placeholder="输入地址" />
</view>
<view>输入的内容:{{address}}</view>
</view>
</template>
<script>
export default {
data() {
return {
username: "Scott",
tel: [13312345678, 15912345678],
age: 18,
address: ""
};
},
methods:{
signUp: function() {
uni.showToast({
title: "点击了报名按钮"
})
}
}
}
</script>
<style>
</style>
编写login.vue文件
<template>
<view>
<image src="../../static/logo-1.png" mode="widthFix" class="logo"></image>
<view class="logo-title">EMOS企业在线办公系统</view>
<view class="logo-subtitle">Ver 2050.2</view>
<button class="login-btn" open-type="getUserInfo" @tap="login()">登陆系统</button>
<view class="register-container">
没有账号?
<text class="register" @tap="toRegister()">立即注册</text>
</view>
</view>
</template>
<script>
export default {
data() {
return {};
},
methods: {
}
};
</script>
<style lang="less">
@import url('login.less');
</style>
我们声明Shiro过滤器拦截路径的时候,为登陆和注册路径下的请求,设置了放行,所以验证与授权并没有生效。等我们将来写具体的业务类型的Web方法,添加相关的Shiro注解,这时候OAuth2Filter中的其他方法就得以运行了。
Map<String,String> filterMap=new LinkedHashMap<>();
filterMap.put("/webjars/**", "anon");
filterMap.put("/druid/**", "anon");
filterMap.put("/app/**", "anon");
filterMap.put("/sys/login", "anon");
filterMap.put("/swagger/**", "anon");
filterMap.put("/v2/api-docs", "anon");
filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/swagger-resources/**", "anon");
filterMap.put("/captcha.jpg", "anon");
filterMap.put("/user/register", "anon");
filterMap.put("/user/login", "anon");
filterMap.put("/test/**", "anon");
filterMap.put("/**", "oauth2");
在com.example.emos.wx.service.impl包中,创建CheckinServiceImpl实现类
@Service
@Scope("prototype")
@Slf4j
public class CheckinServiceImpl implements CheckinService {
@Autowired
private SystemConstants systemConstants;
@Autowired
private TbHolidaysDao holidaysDao;
@Autowired
private TbWorkdayDao workdayDao;
@Autowired
private TbCheckinDao checkinDao;
@Override
public String validCanCheckIn(int userId, String date) {
boolean bool_1 = holidaysDao.searchTodayIsHolidays() != null ? true : false;
boolean bool_2 = workdayDao.searchTodayIsWorkday() != null ? true : false;
String type = "工作日";
if (DateUtil.date().isWeekend()) {
type = "节假日";
}
if (bool_1) {
type = "节假日";
} else if (bool_2) {
type = "工作日";
}
if (type.equals("节假日")) {
return "节假日不需要考勤";
} else {
DateTime now = DateUtil.date();
String start = DateUtil.today() + " " + systemConstants.attendanceStartTime;
String end = DateUtil.today() + " " + systemConstants.attendanceEndTime;
DateTime attendanceStart = DateUtil.parse(start);
DateTime attendanceEnd = DateUtil.parse(end);
if (now.isBefore(attendanceStart)) {
return "没有到上班考勤开始时间";
} else if (now.isAfter(attendanceEnd)) {
return "超过了上班考勤结束时间";
} else {
HashMap map = new HashMap();
map.put("userId", userId);
map.put("date", date);
map.put("start", start);
map.put("end", end);
boolean bool = checkinDao.haveCheckin(map) != null ? true : false;
return bool ? "今日已经考勤,不用重复考勤" : "可以考勤";
}
}
}
}
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传