风流不在谈锋胜,袖手无言味最长。这篇文章主要讲述#yyds干货盘点#three.js中如何切换相机视角相关的知识,希望能为你提供帮助。
1. 在3D场景中, 我们有时需要从6个面的正视角去预览物体, 效果如下所示
文章图片
- 顶视图
- 底视图
- 正视图
- 后视图
- 右视图
- 左视图 2. 我们该如何实现了?
- 动态计算出每个正视角的位置坐标值
- 动态改变相机的位置即可
- 缓动动画使用tween插件实现
3. 核心代码
const arr = [] // 保存各个视角的点数据 let car = null let lookDownAng = 20 //
wt.loadModel(./model/car2.glb, GLTFLoader).then(res => {
const obj = res.scene
car = obj
obj.scale.set(5, 5, 5)
scene.add(obj)
// 在3D空间中表示一个盒子或立方体。其主要用于表示物体在世界坐标中的边界框
const box = new THREE.Box3();
//通过传入的object3D对象来返回当前模型的最小大小,值可以使一个mesh也可以使group
box.expandByObject(obj);
const boxHelper = new THREE.BoxHelper(obj, 0xffff00);
scene.add(boxHelper)
// 俯视 和 仰视角度
console.log(box, box)
let size = box.getSize() // 获取盒子的宽度 高度 深度
console.log(size, size)
let center = box.getCenter() // 获取盒子的中心位置
let max = box.max // 获取盒子的最大的位置
let x = center.x
let y = center.y
let z = center.z
console.log(center, center)
// 取较大的边, 来进行计算
let yDis = Math.max(size.x, size.z) / Math.tan(lookDownAng * Math.PI / 180)
let y1 = y + yDis + size.y / 2
let y2 = y - yDis - size.y / 2// 取较大的边, 来进行计算
let xDis = Math.max(size.y, size.z) / Math.tan(lookDownAng * Math.PI / 180)
let x1 = x + xDis + size.x / 2
let x2 = x - xDis - size.x / 2// 取较大的边, 来进行计算
let zDis = Math.max(size.x, size.y) / Math.tan(lookDownAng * Math.PI / 180)
let z1 = z + zDis + size.z / 2
let z2 = z - zDis - size.z / 2
// 参考物体 用于辅助
const helperSphere = addSphereGeometry()
scene.add(helperSphere)
helperSphere.position.set(x, y, z)
// 参考物体 用于辅助
let helperSphere2 = helperSphere.clone()
helperSphere2.position.set(x, y1, z)
scene.add(helperSphere2)
// 参考物体 用于辅助
let helperSphere3 = helperSphere.clone()
helperSphere3.position.set(x, y2, z)
scene.add(helperSphere3)
// 参考物体 用于辅助
let helperSphere4 = helperSphere.clone()
helperSphere4.position.set(x, y, z1)
scene.add(helperSphere4)
// 参考物体 用于辅助
let helperSphere5 = helperSphere.clone()
helperSphere5.position.set(x, y, z2)
scene.add(helperSphere5)
// 参考物体 用于辅助
let helperSphere6 = helperSphere.clone()
helperSphere6.position.set(x1, y, z)
scene.add(helperSphere6)
// 参考物体 用于辅助
let helperSphere7 = helperSphere.clone()
helperSphere7.position.set(x2, y, z)
scene.add(helperSphere7)// 保存视角位置点数据
arr.push(
helperSphere2.position, helperSphere3.position, helperSphere4.position, helperSphere5.position,
helperSphere6.position, helperSphere7.position
)
})
const btns = document.querySelectorAll(.btn)
// 顶视图
btns[0].onclick = function () {
new TWEEN.Tween(camera.position).to(arr[0]).onUpdate(() => {}).start()
}
// 底视图
btns[1].onclick = function () {
new TWEEN.Tween(camera.position).to(arr[1]).onUpdate(() => {}).start()
}
// 正视图
btns[2].onclick = function () {
new TWEEN.Tween(camera.position).to(arr[2]).onUpdate(() => {}).start()
}
// 后视图
btns[3].onclick = function () {
new TWEEN.Tween(camera.position).to(arr[3]).onUpdate(() => {}).start()
}
// 右视图
btns[4].onclick = function () {
new TWEEN.Tween(camera.position).to(arr[4]).onUpdate(() => {}).start()
}
【#yyds干货盘点#three.js中如何切换相机视角】// 左视图
btns[5].onclick = function () {
new TWEEN.Tween(camera.position).to(arr[5]).onUpdate(() => {}).start()
}
![61.png](https://s2.51cto.com/images/20211130/1638252725458677.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)## 4. 总结
1. getSize方法的使用
2. getCenter方法的使用
3. tween插件的使用
推荐阅读
- #yyds干货盘点#数据分析从零开始实战,PythonPandas与各类数据库
- 技术分享| Sip与WebRTC互通-SRProxy开源库讲解
- Redis持久化RDB和AOF优缺点,你都了解吗()
- 如何在WordPress中调用jquery.min.js文件
- 如何绕过主题编辑器块()
- 如何同时向标签添加多个CSS属性()
- 如何在自定义帖子中添加wordpress自定义seciton
- 在MAMP上工作时如何将图像添加到wordpress主题()
- 如何为WordPress主题添加自定义页眉和页脚