日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/23 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mousemove事件java,three.js,补间相机和mousemove事件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在嘗試使用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事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。