Three.js 自定义路径动画封装

1.首先需要引用PointerLockControls.js帮助我们锁定鼠标与移动位置,和Tween.js 帮助我们快速地实现动画。

2.主要记录的是摄像机的位置和视点,将其放在一个数组中

3.主要播放是依据坐标点个数,逐一播放,主要循环播放代码如下:

function Camera_Tween(x,y,z,mx,my,mz,Times) {

   
var option={
       
px: camera.position.x,
       
pz: camera.position.z,
       
py:camera.position.y,
       
mx: carmeraControls.target.x,
       
mz: carmeraControls.target.z,
       
my:carmeraControls.target.y
   
}
   
var tween=new TWEEN.Tween(option)
    tween.
to({
       
px: [x],
       
pz: [z],
       
py: [y],
       
mx: [mx],
       
mz: [mz],
       
my: [my]
    }
, Times)
    tween.
onUpdate(function () {
        camera.
position.x = this.px;
       
camera.position.z = this.pz;
       
camera.position.y=this.py;
       
carmeraControls.target.x=this.mx;
       
carmeraControls.target.z=this.mz;
       
carmeraControls.target.y=this.my;
   
})
    tween.
delay(0)
    tween.
easing(TWEEN.Easing.Linear.None)
    carmeraControls.
enableRotate=false;//是否旋转
    tween.start()
    tween.
onComplete(function () {
       
if (camera_times<camera_jsonfile.length-1){
           
Camera_For();
       
}
       
else {
            camera_times=
0;
           
carmeraControls.enableRotate=true;
       
}
    })
}

//导出JSO

 

5.导出动画,我们就是导出记录位置与视点的数组就行了,引用FileSaver.js,导出JSON文件,关键代码:

function downloadJson(data) {

   
var blob = new Blob([JSON.stringify(data)], { type: "" });
   
saveAs(blob, "Animation.json");
}

6.导入动画,关键代码:

function fileImport() {
   
//获取读取我文件的File对象
    var selectedFile = document.getElementById('files').files[0];
    var
name = selectedFile.name;//读取选中文件的文件名
    var size = selectedFile.size;//读取选中文件的大小
    console.log("文件名:"+name+"大小:"+size);

    var
reader = new FileReader();//这是核心,读取操作就是由它完成.
   
reader.readAsText(selectedFile);//读取文件的内容,也可以读取文件的URL
   
reader.onload = function () {
       
//当读取完成后回调这个函数,然后此时文件的内容存储到了result,直接操作即可
        console.log(this.result);
       
camera_jsonfile=eval('('+this.result+')');
       
console.log(camera_jsonfile);
       
TwoD_show_point();

   
}
}

7.效果展示

 

————————源码补充-----------------------

function Camera_For() {
    var j=camera_times;
    var i=camera_times+1;
    camera_times++;
    var point = camera_jsonfile[j].camera_point;
    var position = camera_jsonfile[j].camera_position;
    var next_point = camera_jsonfile[i].camera_point;
    var next_position = camera_jsonfile[i].camera_position;
    var next_Time = camera_jsonfile[i].Time;
    // console.log(point);
    camera.position.set(position.x, position.y, position.z);
    ///carmeraControls.target.set(10,0, 0);
    carmeraControls.target.set(point.x,point.y, point.z);
    Camera_Tween(next_position.x,next_position.y,next_position.z,next_point.x,next_point.y,next_point.z,next_Time);
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值