Threejs实现镜头跟随物体移动效果,镜头拐弯并保持运动方向

简介: Threejs实现镜头跟随物体移动效果,镜头拐弯并保持运动方向

1,介绍


该示例使用的是 r95版本Three.js库。

主要实现功能:创建一个管道(管道的作用主要是方便观察运动方向),镜头跟随物体移动效果,物体上下左右拐弯镜头跟随拐弯。

效果图如下:



2,实现思路


1,定义关键固定位置坐标,用固定坐标值生成一组曲线。

2,将曲线分割成多份获取分割后的一组顶点坐标

3,加载物体并设置初始位置,这里用的是个飞机模型

4,通过Threejs的帧动画实时修改物体坐标和物体朝向,达到运动效果


根据坐标生成曲线,并创建一个管道

// 通过类CatmullRomCurve3创建一个3D样条曲线
curve = new THREE.CatmullRomCurve3([
  new THREE.Vector3(-1000, -5000, -5000),
  new THREE.Vector3(1000, -5000, 0),
  new THREE.Vector3(1800, 800, 1000),
  new THREE.Vector3(800, 5000, 5000),
  new THREE.Vector3(0, 0, 10000)
]);
// 样条曲线均匀分割100
var points = curve.getPoints(100);
var geometry = new THREE.Geometry();
// 把从曲线轨迹上获得的顶点坐标赋值给几何体
geometry.vertices = points
var material = new THREE.LineBasicMaterial({
  color: "#4488ff"
});
var line = new THREE.Line(geometry, material);
scene.add(line);
//管道体
const tubeGeometry = new THREE.TubeGeometry(curve, 100, 500, 30); // 101取点数 3为r 30为三角切面数
const tubeMesh = new THREE.Mesh(tubeGeometry, new THREE.MeshBasicMaterial({
  color: "#00aa00",
  side: THREE.DoubleSide,
  wireframe: true
}))
scene.add(tubeMesh)

加载物体模型,这里用的是个飞机模型glb格式


// 引用GLTFLoader.js文件,加载模型
var loader = new THREE.GLTFLoader();
loader.load('assets/models/feiji/feiji.glb', function(result) {
  mesh = result.scene;
  mesh.position.set(-1000, -5000, -5000);
  scene.add(mesh);
});

实时修改物体坐标和物体朝向

function changeLookAt(t) {
  // 当前点在线条上的位置
  const position = curve.getPointAt(t);
  var nPos = new THREE.Vector3(position.x, position.y - 100, position.z);
  mesh.position.copy(nPos);
  // 返回点t在曲线上位置切线向量
  const tangent = curve.getTangentAt(t);
  // 位置向量和切线向量相加即为所需朝向的点向量
  const lookAtVec = tangent.add(nPos);
  mesh.lookAt(lookAtVec);
  if (t > 0.03) {
    var pos = curve.getPointAt(t - 0.03);
    camera.position.copy(pos);
    camera.lookAt(position)
  }
}
var clock = new THREE.Clock(); //声明一个时钟对象
const loopTime = 10 * 1000; // loopTime: 循环一圈的时间
let i = 0;
function renderScene() {
  // 使用requestAnimationFrame函数进行渲染
  requestAnimationFrame(renderScene);
  renderer.render(scene, camera);
  if (curve) {
    let time = Date.now();
    let t = (time % loopTime) / loopTime; // 计算当前时间进度百分比
    setTimeout(function() {
      changeLookAt(t);
    }, 2000)
  }
}



目录
相关文章
|
存储 vr&ar 图形学
法线贴图的视线原理
使用法线贴图可以大大提高渲染效果,使低多边形数的模型看起来具有高多边形数模型的细节和真实感。在游戏开发、电影制作和虚拟现实等领域,法线贴图被广泛应用于增强场景和物体的视觉效果。
160 2
Threejs实现天空盒,全景场景,地面草地
Threejs实现天空盒,全景场景,地面草地
1275 0
Threejs实现天空盒,全景场景,地面草地
|
2月前
ThreeJs给物体添加贴图
这篇文章详细说明了在Three.js中如何给3D物体添加贴图,并展示了实现局部贴图的技术和方法。
142 1
ThreeJs给物体添加贴图
|
2月前
Threejs用切线实现模型沿着轨道行驶
这篇文章详细介绍了如何使用Three.js让一个模型沿着预定的曲线路径移动,并保持模型的方向始终沿着路径的切线方向,提供了实现这一效果的具体代码和步骤。
103 1
Threejs用切线实现模型沿着轨道行驶
|
4月前
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
557 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
|
4月前
|
API
【threejs教程】让你的场景及物体拥有质感:聊聊threejs中的基础网络材质!
【8月更文挑战第5天】threejs中的基础网络材质教程
75 3
|
5月前
相机镜头选择和计算
相机镜头选择和计算
36 0
|
7月前
|
传感器 芯片
[远心镜头] 物方远心、像方远心和双远心镜头的区别
[远心镜头] 物方远心、像方远心和双远心镜头的区别
179 0
|
编解码 图形学 容器
3D模型如何添加表面贴图?
通过模型表面贴图技术,可以实现各种效果,如木纹、石纹、金属反射、布料纹理等,从而使模型更加生动、具有细节和丰富的外观。
169 0
|
编解码 监控 算法
摄像机和镜头的基础知识
摄像机和镜头的基础知识
152 0

热门文章

最新文章