實現threejs模型交互:快速添加點擊事件

一、在threejs中添加點擊事件的必要性

在threejs渲染的3D場景中,我們往往需要讓用戶對模型進行交互,例如在一個3D房間場景中,用戶需要通過點擊鼠標來打開門或者窗戶等。如果加入交互功能,用戶體驗會更加豐富,而不是僅僅作為一個靜態的3D渲染模型。因此,在threejs中實現模型點擊事件是一個必要且重要的功能。

二、實現模型交互的基本方法

首先我們需要在threejs場景中找到對應的模型,然後將點擊事件綁定到該模型上,隨後通過點擊事件處理函數實現模型的交互。

三、確定模型

在threejs中處理模型交互之前,我們需要知道當前場景中的模型是哪一個。在確定模型過程中,可以使用Raycaster對象。

// 初始化射線輔助器
var raycaster = new THREE.Raycaster();

// 鼠標控制對象
var mouse = new THREE.Vector2();

// 監聽鼠標的移動事件
document.addEventListener('mousemove', onDocumentMouseMove, false);

// 鼠標移動事件處理函數
function onDocumentMouseMove(event){
    // 得到鼠標相對於容器的坐標
    mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
    mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
}

四、綁定點擊事件

在確定了當前場景中的模型之後,我們需要將點擊事件綁定到該模型上。

// 綁定點擊事件
document.addEventListener('click', onDocumentClick, false);

// 點擊事件處理函數
function onDocumentClick(event) {
    // 執行射線檢測
    raycaster.setFromCamera(mouse, camera);
    var intersects = raycaster.intersectObjects(objects, true);

    // 判斷是否成功
    if (intersects.length > 0) {
        // 選取第一個物體並對其執行交互
        var object = intersects[0].object;
        interactWithObject(object);
    }
}

五、執行交互

在確定了需要交互的對象後,我們需要執行對應的交互操作。

// 交互函數
function interactWithObject(object){

    // 判斷是否是需要進行交互的模型
    if(object.name == "door"){
        // 打開門的動畫
    }else if(object.name == "window"){
        // 打開窗戶的動畫
    }else{
        // do nothing
    }
}

六、完整的示例代碼

// 場景
var scene = new THREE.Scene();

// 攝像機
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

// 渲染器
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 添加模型
var boxGeometry = new THREE.BoxGeometry(1, 1, 1);
var boxMaterial = new THREE.MeshBasicMaterial({
    color: 0x00ff00
});
var box = new THREE.Mesh(boxGeometry, boxMaterial);
box.position.set(0, 0, -5);
box.name = "box";
scene.add(box);

// 初始化射線輔助器
var raycaster = new THREE.Raycaster();

// 鼠標控制對象
var mouse = new THREE.Vector2();

// 監聽鼠標的移動事件
document.addEventListener('mousemove', onDocumentMouseMove, false);

// 鼠標移動事件處理函數
function onDocumentMouseMove(event) {
    // 得到鼠標相對於容器的坐標
    mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
    mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
}

// 綁定點擊事件
document.addEventListener('click', onDocumentClick, false);

// 點擊事件處理函數
function onDocumentClick(event) {
    // 執行射線檢測
    raycaster.setFromCamera(mouse, camera);
    var intersects = raycaster.intersectObjects(scene.children, true);

    // 判斷是否成功
    if (intersects.length > 0) {
        // 選取第一個物體並對其執行交互
        var object = intersects[0].object;
        interactWithObject(object);
    }
}

// 交互函數
function interactWithObject(object) {

    // 判斷是否是需要進行交互的模型
    if (object.name == "box") {
        // 給box添加動畫
        var tween = new TWEEN.Tween(object.rotation)
          .to({ x:Math.PI*2, y:Math.PI*2 }, 1000)
          .start();

    } else {
        // do nothing
    }
}

// 持續渲染
function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}
animate();

原創文章,作者:RDQSJ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/369074.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RDQSJ的頭像RDQSJ
上一篇 2025-04-12 13:00
下一篇 2025-04-12 13:00

相關推薦

  • TensorFlow Serving Java:實現開發全功能的模型服務

    TensorFlow Serving Java是作為TensorFlow Serving的Java API,可以輕鬆地將基於TensorFlow模型的服務集成到Java應用程序中。…

    編程 2025-04-29
  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Python訓練模型後如何投入應用

    Python已成為機器學習和深度學習領域中熱門的編程語言之一,在訓練完模型後如何將其投入應用中,是一個重要問題。本文將從多個方面為大家詳細闡述。 一、模型持久化 在應用中使用訓練好…

    編程 2025-04-29
  • Python實現一元線性回歸模型

    本文將從多個方面詳細闡述Python實現一元線性回歸模型的代碼。如果你對線性回歸模型有一些了解,對Python語言也有所掌握,那麼本文將對你有所幫助。在開始介紹具體代碼前,讓我們先…

    編程 2025-04-29
  • ARIMA模型Python應用用法介紹

    ARIMA(自回歸移動平均模型)是一種時序分析常用的模型,廣泛應用於股票、經濟等領域。本文將從多個方面詳細闡述ARIMA模型的Python實現方式。 一、ARIMA模型是什麼? A…

    編程 2025-04-29
  • 二階快速求逆矩陣

    快速求逆矩陣是數學中的一個重要問題,特別是對於線性代數中的矩陣求逆運算,如果使用普通的求逆矩陣方法,時間複雜度為O(n^3),計算量非常大。因此,在實際應用中需要使用更高效的算法。…

    編程 2025-04-28
  • VAR模型是用來幹嘛

    VAR(向量自回歸)模型是一種經濟學中的統計模型,用於分析並預測多個變量之間的關係。 一、多變量時間序列分析 VAR模型可以對多個變量的時間序列數據進行分析和建模,通過對變量之間的…

    編程 2025-04-28
  • 如何使用Weka下載模型?

    本文主要介紹如何使用Weka工具下載保存本地機器學習模型。 一、在Weka Explorer中下載模型 在Weka Explorer中選擇需要的分類器(Classifier),使用…

    編程 2025-04-28
  • 抖音外放親媽下葬事件的背後真相

    近期,一段抖音外放親媽下葬的視頻引發廣泛關注和熱議。不少人對這個事件感到震驚和憤怒,認為這種行為非常不尊重親人,觸犯了社會公德和家庭道德。但是,事情真相到底是什麼呢?我們有必要從多…

    編程 2025-04-28
  • Python實現BP神經網絡預測模型

    BP神經網絡在許多領域都有着廣泛的應用,如數據挖掘、預測分析等等。而Python的科學計算庫和機器學習庫也提供了很多的方法來實現BP神經網絡的構建和使用,本篇文章將詳細介紹在Pyt…

    編程 2025-04-28

發表回復

登錄後才能評論