我正在尝试使用three.js

我正在使用补间移动相机,它工作得很好 . 但是,在动画结束时,相机会跳回到初始位置 .

我发现mousemove事件导致了这种行为 . 我如何解决这个问题并保持补间动作和鼠标移动?

我根据this example构建了我的three.js;

Mousemove declared inside render function

function render() {

camera.position.x += ( mouseX - camera.position.x ) * 0.04;

camera.position.y += ( - mouseY - camera.position.y ) * 0.04;

camera.lookAt( scene.position );

TWEEN.update();

renderer.render( scene, camera );

}

Tween movement

function setupTween (position, target, duration) {

TWEEN.removeAll();

new TWEEN.Tween (position)

.to (target, duration)

.easing (TWEEN.Easing.Quadratic.InOut)

.onUpdate (

function() {

// copy incoming position into camera position

camera.position.copy (position);

})

.start();

};

补间功能源

UPDATE

完整的工作代码:

var container,

i,

camera,

scene,

renderer,

particles,

geometry,

materials = [],

color,

sprite,

size,

mouseX = 0,

mouseY = 0,

isTweening,

windowHalfX = window.innerWidth / 2,

windowHalfY = window.innerHeight / 2;

// +++++ three.js +++++

// +++++ +++++ +++++ +++++ +++++

function init() {

container = document.createElement( 'div' );

document.body.appendChild( container );

camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.5, 2000 );

camera.position.set (0,0,1900);

scene = new THREE.Scene();

scene.fog = new THREE.FogExp2( 0x000000, 0.0005 );

geometry = new THREE.Geometry();

var textureLoader = new THREE.TextureLoader();

for ( i = 0; i < 1000; i ++ ) {

var vertex = new THREE.Vector3();

vertex.x = Math.random() * 2000 - 1000;

vertex.y = Math.random() * 2000 - 1000;

vertex.z = Math.random() * 2000 - 1000;

geometry.vertices.push( vertex );

}

sprite = textureLoader.load( "circle.png" );

color = [0.90, 0.05, 0.8];

size = 8.5;

materials = new THREE.PointsMaterial( { size: size, map: sprite, blending: THREE.AdditiveBlending, depthTest: false, transparent : false } );

materials.color.setHSL( color[0], color[1], color[2] );

particles = new THREE.Points( geometry, materials );

scene.add( particles );

renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });

renderer.setPixelRatio( window.devicePixelRatio );

renderer.setSize( window.innerWidth, window.innerHeight );

container.appendChild( renderer.domElement );

document.addEventListener( 'mousemove', onDocumentMouseMove, false );

}

function onWindowResize() {

windowHalfX = window.innerWidth / 2;

windowHalfY = window.innerHeight / 2;

camera.aspect = window.innerWidth / window.innerHeight;

camera.updateProjectionMatrix();

renderer.setSize( window.innerWidth, window.innerHeight );

}

function onDocumentMouseMove( event ) {

mouseX = event.clientX - windowHalfX;

mouseY = event.clientY - windowHalfY;

}

function animate() {

requestAnimationFrame( animate );

render();

}

function startTween() {

isTweening = false;

var target = new THREE.Vector3(getRandomNumber(), getRandomNumber(), getRandomNumber());

new TWEEN.Tween (camera.position.clone())

.to (target, 1000)

.easing (TWEEN.Easing.Quadratic.InOut)

.onUpdate( function() {

camera.position.copy(this);

})

.onStart ( function() {

isTweening = true;

})

.onComplete ( function() {

isTweening = false;

})

.start();

}

function getRandomNumber() {

// get a number between -1000 and -500 and 500 and 1000

return ( Math.random() * 500 + 500 ) * ( Math.random() < 0.5 ? -1 : 1 );

}

function render() {

if(!isTweening && (mouseX || mouseY)) {

// more a generic approach, not just transforming x and y (maybe it needs to be improved a bit)

var upVector = camera.up.clone().transformDirection(camera.matrix);

var forwardVector = new THREE.Vector3().subVectors(scene.position, camera.position).normalize();

var rightVector = new THREE.Vector3().crossVectors(forwardVector, upVector);

camera.translateOnAxis(rightVector, mouseX);

camera.translateOnAxis(upVector, -mouseY);

mouseX = mouseY = 0;

}

camera.lookAt( scene.position );

TWEEN.update();

renderer.render( scene, camera );

}

init();

animate();

setTimeout(function(){

startTween();

},2500);

mousemove事件java,three.js,补间相机和mousemove事件相关推荐

  1. 详解TWEEN.JS 补间动画

    tweenJS是一个简单的javascript补间动画库,支持数字,对象属性,CSS样式等的动态效果过渡,允许平滑的修改元素的属性值.告诉它需要改变的元素的开始值和结束值,并设置好过渡时间,补间动画将 ...

  2. html事件中写js,html标签中绑定触发事件与js中绑定触发事件写法上的区别

    html> js中方法名后加括号和不加口号的区别 按钮 var test = function(){ var span = document.createElement("span&q ...

  3. Android 高级编程【6个实战案例(附源码):刮刮卡、补间动画、逐帧动画、Fragment、RecyclerView、下拉刷新】

    目   录 刮刮卡案例[ScratchCard] 结构图 activity_main.xml MainActivity.java 运行效果图 补间动画(Tween Animation) 逐帧动画(Fr ...

  4. 安卓动画全解:补间动画(视图动画)、布局动画、属性动画、逐帧动画。动画Animation属性、Alpha属性、Scale属性、Translate属性、Rotate属性,动画集AnimationSet

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓动画全解:补间动画(视图动画).布局动画.属性动画.逐帧动画. 主要内容包含:动画Animation属性.Alpha属性.Scale属性.Tran ...

  5. ocx js php,JavaScript_JS实现OCX控件的事件响应示例,JS支持OCX控件的事件(event), - phpStudy...

    JS实现OCX控件的事件响应示例 JS支持OCX控件的事件(event),当OCX控件定义的事件发生时,JS可以捕获该事件并对事件进行相应的处理. 个人理解,其实就是事件的响应由谁来完成,OCX控件自 ...

  6. 【前端】JS的BOM和DOM,事件,表单验证案例

    先看小练习1:开关灯 用到的Dom相关知识点 * 功能:控制html文档的内容 * 获取页面标签(元素)对象:Element* document.getElementById("id值&qu ...

  7. JS阻止冒泡和元素默认事件

    JS阻止冒泡和元素默认事件 文章目录 JS阻止冒泡和元素默认事件 1.JS阻止冒泡 :stopPropagation() 2.阻止元素默认事件行为 preventDefault() onclick + ...

  8. js keyup、keypress和keydown事件 详解

    js keyup.keypress和keydown事件  详解 js keyup.keypress和keydown事件都是有关于键盘的事件 当一个按键被pressed 或released在每一个现代浏 ...

  9. html select 事件 jquery,通过jquery触发select自身的change事件

    ###通过jquery触发select自身的change事件 1.通过js来去触发select的change事件 代码如下:包含了html部分和js部分 //html部分 选择省份 {$provinc ...

最新文章

  1. c语言常量类型转换,c语言基础教程常量变量和类型转换,免费版.doc
  2. 【OpenCV】8邻域种子填充法剔除短连通域的高效算法
  3. BUG总结—— No mapping found for HTTP request with URI
  4. Elasticsearch和solr的区别
  5. 4pam调制与解调(matlab实现)
  6. 企业级OpenCV、图像识别资料免费下载,仅此1天!
  7. python中颜色介意用数字表示_利用Python实现颜色色值转换的小工具
  8. Linux命令速查手册
  9. 零基础学python-如何零基础开始自学Python编程
  10. KEGG Pathway通路二级分类汇总,轻松找到感兴趣的通路
  11. html文本如何逐渐淡入,CSS如何实现文字淡入效果
  12. Mapreduce统计
  13. XiaomiRouter自学之路(13-U-boot支持web更新firmware功能)
  14. ASM、AAM算法介绍
  15. Word 无法打开该文件,因为文件格式与文件扩展名不匹配。
  16. MS08_067复现+远程控制
  17. 深度融合信息化 视频监控打击震慑犯罪
  18. 剑指 Offer合并两个排序的链表
  19. 分布式架构网约车平台后端原型系统设计与实现
  20. 阿里云ecs云服务器建立wordpress个人博客教程

热门文章

  1. 论文浅尝 | 基于知识库的自然语言理解 04#
  2. TI-RTOS实时操作系统开发之功耗测试
  3. 一文掌握深度学习、神经网络和学习过程的历史
  4. 技术者利用wordpress+阿里云服务器+LAMP新搭建的博客网站:www.youngxy.top
  5. 10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法
  6. 基于SpringBoot项目的https
  7. SpringBoot RequestBody ajax提交对象
  8. TypeError: HashUpdate fail
  9. Openfire on Centos7
  10. 初探数位DP-hdu2089