国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

VUE2+THREE.JS 按照行動軌跡移動人物模型并相機視角跟隨人物

這篇具有很好參考價值的文章主要介紹了VUE2+THREE.JS 按照行動軌跡移動人物模型并相機視角跟隨人物。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

人物按照上一篇博客所設(shè)定的關(guān)鍵點位置,勻速移動

threejs 人物移動,ThreeJS,VUE,javascript,數(shù)碼相機,開發(fā)語言

1. 初始化加載模型

// 加載巡航人物模型 callback 動作完成的回調(diào)函數(shù)
initWalkPerson(callback) {
	fbxloader("walk").then((obj) => {
		obj.scale.set(2.5, 2.5, 2.5);
		obj.name = "person";
		person = obj;
		scene.add(obj);
		//有回調(diào)函數(shù) 就執(zhí)行回調(diào)函數(shù)
		callback && callback();
	});
},

2. 開始移動模型

// 開始移動模型
startAnimation() {
	if (isAnimating) return this.elMessage("當前巡航已開始,請勿多次操作", "error");
	isAnimating = true;
	//說明模型已加載完成,無需重復(fù)加載,直接執(zhí)行動畫效果
	if (person) {
		this.personPositionStart();
	} else {
		//人物模型加載完畢后在執(zhí)行
		this.initWalkPerson(() => {
			this.personPositionStart();
		});
	}
},

3. 人物模型啟動

//人物動畫啟動
personPositionStart() {
	personMixer = new THREE.AnimationMixer(person);
	let AnimationAction = personMixer.clipAction(person.animations[0]);
	AnimationAction.play();

	person.position.set(pointArr[0]);
	scene.getObjectByName("path").material.visible = false; //隱藏行動軌跡動畫
	scene.getObjectByName("person").visible = true;

	tweenHandlers = [];
	// 定義速度(單位:單位長度/秒)
	const speed = 300; // 你可以根據(jù)需要調(diào)整這個速度值
	let prevTween = null;
	let startPos = new THREE.Vector3(...pointArr[0]);

	for (let i = 1; i < pointArr.length; i++) {
		// 每次循環(huán)設(shè)置下一個目標點
		const endPos = new THREE.Vector3(...pointArr[i]);
		const newTween = this.createTween(startPos.clone(), endPos, speed);
		tweenHandlers.push(newTween);

		if (prevTween) {
			prevTween.chain(newTween);
		} else {
			// 如果是序列中的第一個tween,立即開始動畫
			newTween.start();
		}

		// 將此tween存儲為下一個tween的'prevTween'
		prevTween = newTween;

		// 更新起始點為當前結(jié)束點,為下一個循環(huán)準備
		startPos.copy(endPos);
	}

	// 開始第一個tween動畫
	if (tweenHandlers.length > 0) {
		currentTween = tweenHandlers[0];
		currentTween.start();
		isAnimating = true;
	}
	// 在最后一個Tween結(jié)束后執(zhí)行的動作
	prevTween.onComplete(() => {
		// 在動畫被標記為完成時才重置位置
		this.resetPosition();
	});
},

4. 暫停模型移動

// 暫停模型移動
pauseAnimation() {
	if (!isAnimating) {
		this.elMessage("當前巡航未開始", "warning");
		return;
	}

	if (this.isPaused) {
		// 恢復(fù)攝像機狀態(tài)
		camera.position.copy(savedCameraPosition);
		controls.target.copy(savedCameraTarget);
		controls.update();

		// 恢復(fù)動畫
		tweenHandlers.forEach((tween) => tween.resume());
		personMixer.timeScale = 1;
		this.isPaused = false; //設(shè)置this.isPaused為false
		isAnimating = true;
		this.elMessage("動畫已恢復(fù)", "success");

		this.updateCameraPosition(person, camera, new THREE.Vector3(0, 250, 200));
	} else {
		// 保存當前攝像機狀態(tài)
		savedCameraPosition = camera.position.clone();
		savedCameraTarget = controls.target.clone();
		// 暫停動畫
		tweenHandlers.forEach((tween) => tween.pause());
		personMixer.timeScale = 0;
		this.isPaused = true; //設(shè)置this.isPaused為true
		this.elMessage("動畫已暫停", "success");
	}
},

5. 重置模型位置

// 重置模型位置
resetPosition() {
	isAnimating = false;
	this.pauseAnimation();
	// 將模型從場景中移除
	scene.getObjectByName("person").visible = false;
	// 清理動畫混合器
	if (personMixer) {
		personMixer.uncacheClip(personMixer._actions[0]._clip);
		personMixer = null;
	}
	tweenHandlers.forEach((item) => item.stop());
	tweenHandlers = [];
	// 重置動畫狀態(tài)
	this.isPaused = false;
	this.tweenArea({ x: -5000, y: 7000, z: 16000 }, { x: 0, y: 0, z: 1 });
	//顯示行動軌跡
	scene.getObjectByName("path").material.visible = true;
},

6. 切換區(qū)域動畫

// 切換區(qū)域動畫
tweenArea(Position, controlsTarget) {
	// 傳遞任意目標位置,從當前位置運動到目標位置
	const p1 = {
		// 定義相機位置是目標位置到中心點距離的2.2倍
		x: camera.position.x,
		y: camera.position.y,
		z: camera.position.z,
	};
	const p2 = {
		x: Position.x,
		y: Position.y,
		z: Position.z,
	};
	changeAreaTween = new TWEEN.Tween(p1).to(p2, 1200); // 第一段動畫
	const update = function (object) {
		camera.rotation.y = (90 * Math.PI) / 180;
		camera.position.set(object.x, object.y, object.z);
		controls.target = new THREE.Vector3(controlsTarget.x, controlsTarget.y, controlsTarget.z);
		// camera.lookAt(lookAt); // 保證動畫執(zhí)行時,相機焦距在中心點
		controls.enabled = false;
		controls.update();
	};
	changeAreaTween.onUpdate(update);
	//  動畫完成后的執(zhí)行函數(shù)
	changeAreaTween.onComplete(() => {
		controls.enabled = true; // 執(zhí)行完成后開啟控制
	});
	changeAreaTween.easing(TWEEN.Easing.Quadratic.InOut);
	changeAreaTween.start();
},

7. 攝像機追蹤模型

// 攝像機追蹤模型
updateCameraPosition(model, camera, offset) {
	if (!this.isPaused && isAnimating) {
		// 添加條件判斷
		const desiredPosition = new THREE.Vector3().copy(model.position).add(offset);

		camera.position.lerp(desiredPosition, 0.05);
		camera.lookAt(model.position);
	}
},

8. 移動模型位置

// 移動模型位置
createTween(startPosition, endPosition, speed) {
	// 計算起點到終點的距離
	const distance = startPosition.distanceTo(endPosition);
	// 使用距離除以速度來計算持續(xù)時間
	const duration = (distance / speed) * 1000; // 持續(xù)時間(以毫秒為單位)
	// 創(chuàng)建并返回一個新的Tween動畫
	return new TWEEN.Tween(startPosition)
		.to({ x: endPosition.x, y: endPosition.y, z: endPosition.z }, duration)
		.easing(TWEEN.Easing.Quadratic.InOut)
		.onUpdate(() => {
			//相機的相對偏移量,z=-400 在人物模型的后面
			const relativeCameraOffset = new THREE.Vector3(0, 100, -400);
			const targetCameraPosition = relativeCameraOffset.applyMatrix4(person.matrixWorld);
			camera.position.set(targetCameraPosition.x, targetCameraPosition.y, targetCameraPosition.z);

			//更新控制器的目標為Person的位置
			const walkerPosition = person.position.clone();
			controls.target = new THREE.Vector3(walkerPosition.x, 100, walkerPosition.z);
			// 確??刂破鞯淖兏?/span>
			controls.update();

			// 更新模型位置
			person.position.copy(startPosition);
			person.lookAt(endPosition);
		})
		.onComplete(() => {
			// 動畫完成時,確保模型位置與結(jié)束位置相匹配
			person.position.copy(endPosition);
		});
},

9.動畫執(zhí)行

全局定義的參數(shù):文章來源地址http://www.zghlxwxcb.cn/news/detail-830832.html

let personMixer = null; // 巡航混合器變量
let personClock = new THREE.Clock(); // 巡航計時工具
// 獲取巡航時間差
const personDelta = personClock.getDelta();

if (personMixer && isAnimating) {
	personMixer.update(personDelta);
}
TWEEN.update();

到了這里,關(guān)于VUE2+THREE.JS 按照行動軌跡移動人物模型并相機視角跟隨人物的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • vue2+three.js實現(xiàn)類似VR、3D全景效果

    vue2+three.js實現(xiàn)類似VR、3D全景效果

    效果圖: 倆圖標是我自己加的前進后退按鈕,也是百度了好久,再加上GPT的幫助,才給搞出來。因為需求急,都不看官方文檔,百度到一個能跑的demo之后改吧改吧,就先用著了。 下面是代碼: 這里 代碼有很多用不到的地方和需要優(yōu)化的地方,我是來不及改了,就先這樣吧

    2024年02月15日
    瀏覽(87)
  • Three.js - 通過鍵盤控制模型移動和攻擊(二十五)

    Three.js - 通過鍵盤控制模型移動和攻擊(二十五)

    上節(jié)加載了模型和模型動畫,本節(jié)使用鍵盤控制模型移動和連貫動畫實現(xiàn)攻擊動作。 基礎(chǔ)模板 上節(jié)講述加載了模型,并實現(xiàn)了動畫。本節(jié)在上節(jié)的基礎(chǔ)上進行修改。 修改燈光并添加陰影 開啟陰影渲染。 添加方向光,開啟陰影投射。 在地面網(wǎng)格上開啟陰影接收。 修改模型網(wǎng)

    2024年02月10日
    瀏覽(24)
  • Three.js中光線投射Raycaster的簡單使用案例 與模型的交互,當鼠標移動到模型時出現(xiàn)信息框

    Three.js中光線投射Raycaster的簡單使用案例 與模型的交互,當鼠標移動到模型時出現(xiàn)信息框

    目錄 說明? ?創(chuàng)建兩個模型 基礎(chǔ)代碼? 基礎(chǔ)代碼效果圖如下: 重點?。。? ?創(chuàng)建光線投射Raycaster實例步驟 1.準備一個盒子,用來展示模型的長寬高信息,初始化時先隱藏該盒子 2.創(chuàng)建光線投射Raycaster實例 ????????1.創(chuàng)建 Raycaster 實例? ????????? 2.為窗口綁定事件 p

    2024年02月05日
    瀏覽(23)
  • vue2 使用 cesium 【第二篇-相機視角移動+添加模型】

    vue2 使用 cesium 【第二篇-相機視角移動+添加模型】

    搞了一陣子 cesium,小白入門,這東西很牛逼,但是感覺這東西好費勁啊!網(wǎng)上資料不多,每個人的用法又不一樣,操作起來真的是絕絕子。之前寫了一篇 vue2 使用 cesium 的博文,沒有寫完,本來想繼續(xù)寫來著,想了一下還是重新開一篇吧。上一篇說到了事件,今天不想寫事件

    2024年02月11日
    瀏覽(20)
  • 【Vue】Vue2創(chuàng)建移動端項目實戰(zhàn)教程,創(chuàng)建移動端項目保姆級教程,設(shè)置axios,utils工具包,vue.fonfig.js配置項 (下)

    【Vue】Vue2創(chuàng)建移動端項目實戰(zhàn)教程,創(chuàng)建移動端項目保姆級教程,設(shè)置axios,utils工具包,vue.fonfig.js配置項 (下)

    這里是創(chuàng)建移動端項目 【Vue】Vue2.x創(chuàng)建項目全程講解,保姆級教程,手把手教,Vue2怎么創(chuàng)建項目(上) 【Vue】Vue2創(chuàng)建移動端項目實戰(zhàn)教程,創(chuàng)建移動端項目保姆級教程,接上一篇創(chuàng)建Vue2項目(中) 【Vue】Vue2創(chuàng)建移動端項目實戰(zhàn)教程,創(chuàng)建移動端項目保姆級教程,設(shè)置ax

    2024年02月13日
    瀏覽(25)
  • Three.js -相機平滑移動

    一、安裝 二、引入 三、使用 最后不要忘了在render中執(zhí)行 TWEEN.update();

    2024年02月13日
    瀏覽(90)
  • Unity Animator人物模型動畫移動偏移

    Unity Animator人物模型動畫移動偏移

    模型動畫出現(xiàn)移動方向偏移 !修改Animation中的Root Transform Rotation(根變換位置)、Root Transform Rotation(x,y,z)(旋轉(zhuǎn)),Bake Info Pose修改為Original。可以解決 ??!但是,使用動畫移動函數(shù)時將無法移動,原因是鎖定根變換位置和循環(huán)位置 ?。。∷灾灰薷囊罁?jù)為原始或者微調(diào)偏離值,

    2024年02月15日
    瀏覽(26)
  • Three 之 three.js (webgl)鼠標/手指通過射線移動物體的簡單整理封裝

    Three 之 three.js (webgl)鼠標/手指通過射線移動物體的簡單整理封裝

    目錄 Three 之 three.js (webgl)鼠標/手指通過射線移動物體的簡單整理封裝 一、簡單介紹 二、實現(xiàn)原理 三、注意事項 四、效果預(yù)覽 五、案例實現(xiàn)步驟 六、關(guān)鍵代碼 Three js 開發(fā)的一些知識整理,方便后期遇到類似的問題,能夠及時查閱使用。 本節(jié)介紹, three.js (webgl) 中,

    2024年02月16日
    瀏覽(97)
  • Three.js移動端雙指觸屏控制旋轉(zhuǎn)和縮放

    在移動端通過雙指來控制物體的選擇和縮放。旋轉(zhuǎn)通過雙指旋轉(zhuǎn)操作,而縮放通過雙指距離實現(xiàn)。實現(xiàn)平臺是小程序基于three.js的AR版。 旋轉(zhuǎn):兩個手指產(chǎn)生的兩個點可以算出一個向量,那么我就通過程序前后兩幀計算兩個向量之間的夾角來判斷旋轉(zhuǎn)的角度信息。這里我通過

    2024年02月08日
    瀏覽(66)
  • three.js實現(xiàn)鼠標點擊控制物體移動(帶動畫效果,位置精確)

    three.js實現(xiàn)鼠標點擊控制物體移動(帶動畫效果,位置精確)

    通過查閱各種資料,最終確定解決方案,動畫效果使用gsap組件庫實現(xiàn),也可不用,代碼稍作修改即可。解決鼠標點擊坐標偏移問題,復(fù)制可直接運行。 完整代碼如下:

    2024年02月07日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包