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

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

這篇具有很好參考價(jià)值的文章主要介紹了Three.js中光線投射Raycaster的簡單使用案例 與模型的交互,當(dāng)鼠標(biāo)移動(dòng)到模型時(shí)出現(xiàn)信息框。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

說明?

?創(chuàng)建兩個(gè)模型

基礎(chǔ)代碼?

基礎(chǔ)代碼效果圖如下:

重點(diǎn)?。?!?

?創(chuàng)建光線投射Raycaster實(shí)例步驟

1.準(zhǔn)備一個(gè)盒子,用來展示模型的長寬高信息,初始化時(shí)先隱藏該盒子

2.創(chuàng)建光線投射Raycaster實(shí)例

????????1.創(chuàng)建 Raycaster 實(shí)例?

????????? 2.為窗口綁定事件 pointermove 想使用點(diǎn)擊事件 click 的可以自行修改

????????3.定義窗口觸發(fā) pointermove 事件所執(zhí)行的回調(diào)函數(shù) onPointerMove?

????????4.通過攝像機(jī)和鼠標(biāo)位置更新射線

完整代碼如下:

效果圖如下 :

?結(jié)尾


說明?

說明:該案例是基于Vue2創(chuàng)建,如果未使用Ve2請自行修改代碼,另外由于使用的是已經(jīng)下載的Three.js,所以運(yùn)行前請確保已安裝Three.js以方便引入,未安裝可以使用 npm install three 進(jìn)行安裝

?創(chuàng)建兩個(gè)模型

先創(chuàng)建兩個(gè)基本模型為?光線投射Raycaster 做鋪墊

下面是一個(gè)名為 model 組件的編寫,讀者可以自行掛載在Vue示例上??

另外如果有?model 命名帶來的錯(cuò)誤,可以在文件?vue.config.js 中添加配置 lintOnSave: false

基礎(chǔ)代碼?

<template>
    <div ref="container">
        
    </div>
</template>

<script>
import * as THREE from "three";
import {OrbitControls} from "three/addons/controls/OrbitControls.js";

export default {
    name: "model",
    data() {
        return {
            //場景
            scene: null,
            //攝影機(jī)
            camera: null,
            //渲染器
            renderer: null,
            //相機(jī)控件
            controls: null,
        }
    },
    mounted() {
        // 調(diào)用方法創(chuàng)建場景、相機(jī)、渲染器和相機(jī)控件
        this.createScene();
        this.createCamera();
        this.createRenderer();
        this.createControls();

        // 創(chuàng)建兩個(gè)不同大小的立方體模型,材質(zhì)使用不受光照影響的 MeshBasicMaterial 材質(zhì)
        const cube1 = new THREE.Mesh(
            new THREE.BoxGeometry(3, 2, 1),
            new THREE.MeshBasicMaterial({color: 0xff0000})
        );
        const cube2 = new THREE.Mesh(
            new THREE.BoxGeometry(1, 2, 3),
            new THREE.MeshBasicMaterial({color: 0x00ff00})
        );
        cube1.position.set(-2, 0, 0);
        cube2.position.set(2, 0, 0);
        this.scene.add(cube1, cube2);

        const render = () => {
            //手動(dòng)更改相機(jī)的變換后,必須調(diào)用controls.update()
            this.controls.update()
            this.renderer.render(this.scene, this.camera);
            requestAnimationFrame(render);
        };
        render();
    },
    methods: {
        //創(chuàng)建場景
        createScene() {
            this.scene = new THREE.Scene();
        },
        //創(chuàng)建相機(jī)
        createCamera() {
            this.camera = new THREE.PerspectiveCamera(
                45,
                window.innerWidth / window.innerHeight,
                1,
                1000
            );
            this.camera.position.set(0, 0, 5);
        },
        //創(chuàng)建渲染器
        createRenderer() {
            this.renderer = new THREE.WebGLRenderer({antialias: true}); //antialias:是否執(zhí)行抗鋸齒,默認(rèn)為false.
            this.renderer.setSize(window.innerWidth, window.innerHeight);
            this.$refs.container.appendChild(this.renderer.domElement);
        },
        //創(chuàng)建相機(jī)控件
        createControls() {
            this.controls = new OrbitControls(this.camera, this.renderer.domElement);
        }
    }
};
</script>

<style scoped>

</style>

基礎(chǔ)代碼效果圖如下:

raycaster,javascript,前端,vue.js,3d


重點(diǎn)?。?!?

?創(chuàng)建光線投射Raycaster實(shí)例步驟

1.準(zhǔn)備一個(gè)盒子,用來展示模型的長寬高信息,初始化時(shí)先隱藏該盒子

template>
    <div ref="container">
        <div id="infoBox"></div>
    </div>
</template>

//盒子樣式如下: (要是覺得盒子丑大家可以自己修改,哈哈)
#infoBox{
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    background-color: #fff;
    border:1px solid #ccc;
    padding: 5px;
}

2.創(chuàng)建光線投射Raycaster實(shí)例

為了大家方便對照官方文檔學(xué)習(xí),所以我直接引用了官文文檔的源碼,大家可以對照官文修改代碼進(jìn)行實(shí)驗(yàn)加深理解?

官網(wǎng)地址:https://threejs.org/docs/index.html#api/zh/core/Raycaster

????????1.創(chuàng)建 Raycaster 實(shí)例?

const raycaster = new THREE.Raycaster();
 //創(chuàng)建一個(gè)二維向量為后面 Raycaster 實(shí)例調(diào)用 .setFromCamera 方法做準(zhǔn)備
const pointer = new THREE.Vector2();

?????????2.為窗口綁定事件 pointermove 想使用點(diǎn)擊事件 click 的可以自行修改

window.addEventListener('pointermove', onPointerMove);

????????3.定義窗口觸發(fā) pointermove 事件所執(zhí)行的回調(diào)函數(shù) onPointerMove?

const infoBox = document.querySelector('#infoBox') //獲取Dom元素
const onPointerMove = (event) => {  //如果不使用箭頭函數(shù)需要注意this指向問題
    // 修改 pointer 的值:將鼠標(biāo)位置歸一化為設(shè)備坐標(biāo)。x 和 y 方向的取值范圍是 (-1 to +1)
    pointer.x = (event.clientX / window.innerWidth) * 2 - 1;
    pointer.y = -(event.clientY / window.innerHeight) * 2 + 1;
    //計(jì)算物體和射線的焦點(diǎn)
    // 方法 .intersectObjects ( objects : Array, recursive : Boolean, optionalTarget : Array ) : Array
    // 作用:檢測所有在射線與這些物體之間,包括或不包括后代的相交部分。返回結(jié)果時(shí),相交部分將按距離進(jìn)行排序,最近的位于第一個(gè)),
    //      相交部分和.intersectObject所返回的格式是相同的。
    const intersects = raycaster.intersectObjects(this.scene.children);//返回和射線相交的一組物體,值為數(shù)組
    //沒有相交物體時(shí)
    if (intersects.length === 0) {
        console.log('隱藏');
        infoBox.style.display = "none";
        return;
    }
    //有相交物體時(shí)
    if (intersects.length > 0) { //其中數(shù)組第一個(gè)值的 object屬性值就是鼠標(biāo)放在屏幕上離我們最近的模型
        console.log('顯示');
        //設(shè)置信息
        infoBox.innerHTML = `長:${intersects[0].object.geometry.parameters.depth}
        <br>寬:${intersects[0].object.geometry.parameters.width}<br>
        高:${intersects[0].object.geometry.parameters.height}`;
        infoBox.style.display = "block";
        console.log(event.clientX);
        infoBox.style.left = event.clientX + "px"; //記得一定要拼接 px 我就是開始忘記了,導(dǎo)致信息框不移動(dòng)
        infoBox.style.top = event.clientY + "px"
    }
}

????????4.通過攝像機(jī)和鼠標(biāo)位置更新射線

raycaster.setFromCamera(pointer, this.camera);

以上就是?光線投射Raycaster 的使用步驟


完整代碼如下:

<template>
    <div ref="container">
        <div id="infoBox"></div>
    </div>
</template>

<script>
import * as THREE from "three";
import {OrbitControls} from "three/addons/controls/OrbitControls.js";

export default {
    name: "model",
    data() {
        return {
            //場景
            scene: null,
            //攝影機(jī)
            camera: null,
            //渲染器
            renderer: null,
            //相機(jī)控件
            controls: null,
        }
    },
    mounted() {
        // 調(diào)用方法創(chuàng)建場景、相機(jī)、渲染器和相機(jī)控件
        this.createScene();
        this.createCamera();
        this.createRenderer();
        this.createControls();

        // 創(chuàng)建兩個(gè)不同大小的立方體模型,材質(zhì)使用不受光照影響的 MeshBasicMaterial 材質(zhì)
        const cube1 = new THREE.Mesh(
            new THREE.BoxGeometry(3, 2, 1),
            new THREE.MeshBasicMaterial({color: 0xff0000})
        );
        const cube2 = new THREE.Mesh(
            new THREE.BoxGeometry(1, 2, 3),
            new THREE.MeshBasicMaterial({color: 0x00ff00})
        );
        cube1.position.set(-2, 0, 0);
        cube2.position.set(2, 0, 0);
        this.scene.add(cube1, cube2);

        //1.創(chuàng)建 Raycaster 實(shí)例
        const raycaster = new THREE.Raycaster();
        const pointer = new THREE.Vector2(); //創(chuàng)建一個(gè)二維向量為后面 Raycaster 實(shí)例調(diào)用 .setFromCamera 方法做準(zhǔn)備
        //3.定義窗口觸發(fā) pointermove 事件所執(zhí)行的回調(diào)函數(shù) onPointerMove
        const infoBox = document.querySelector('#infoBox') //獲取Dom元素
        const onPointerMove = (event) => {  //如果不使用箭頭函數(shù)需要注意this指向問題
            // 修改 pointer 的值:將鼠標(biāo)位置歸一化為設(shè)備坐標(biāo)。x 和 y 方向的取值范圍是 (-1 to +1)
            pointer.x = (event.clientX / window.innerWidth) * 2 - 1;
            pointer.y = -(event.clientY / window.innerHeight) * 2 + 1;
            //計(jì)算物體和射線的焦點(diǎn)
            // 方法 .intersectObjects ( objects : Array, recursive : Boolean, optionalTarget : Array ) : Array
            // 作用:檢測所有在射線與這些物體之間,包括或不包括后代的相交部分。返回結(jié)果時(shí),相交部分將按距離進(jìn)行排序,最近的位于第一個(gè)),
            //      相交部分和.intersectObject所返回的格式是相同的。
            const intersects = raycaster.intersectObjects(this.scene.children);//返回和射線相交的一組物體,值為數(shù)組
            //沒有相交物體時(shí)
            if (intersects.length === 0) {
                console.log('隱藏');
                infoBox.style.display = "none";
                return;
            }
            //有相交物體時(shí)
            if (intersects.length > 0) { //其中數(shù)組第一個(gè)值的 object屬性值就是鼠標(biāo)放在屏幕上離我們最近的模型
                console.log('顯示');
                //設(shè)置信息
                infoBox.innerHTML = `長:${intersects[0].object.geometry.parameters.depth}
        <br>寬:${intersects[0].object.geometry.parameters.width}<br>
        高:${intersects[0].object.geometry.parameters.height}`;
                infoBox.style.display = "block";
                console.log(event.clientX);
                infoBox.style.left = event.clientX + "px"; //記得一定要拼接 px 我就是開始忘記了,導(dǎo)致信息框不移動(dòng)
                infoBox.style.top = event.clientY + "px"
            }
        }
        //2.為窗口綁定事件 pointermove 想使用點(diǎn)擊事件 click 的可以自行修改
        window.addEventListener('pointermove', onPointerMove);

        const render = () => {
            // 4.通過攝像機(jī)和鼠標(biāo)位置更新射線
            raycaster.setFromCamera(pointer, this.camera);
            //手動(dòng)更改相機(jī)的變換后,必須調(diào)用controls.update()
            this.controls.update()
            this.renderer.render(this.scene, this.camera);
            requestAnimationFrame(render);
        };
        render();
    },
    methods: {
        //創(chuàng)建場景
        createScene() {
            this.scene = new THREE.Scene();
        },
        //創(chuàng)建相機(jī)
        createCamera() {
            this.camera = new THREE.PerspectiveCamera(
                45,
                window.innerWidth / window.innerHeight,
                1,
                1000
            );
            this.camera.position.set(0, 0, 5);
        },
        //創(chuàng)建渲染器
        createRenderer() {
            this.renderer = new THREE.WebGLRenderer({antialias: true}); //antialias:是否執(zhí)行抗鋸齒,默認(rèn)為false.
            this.renderer.setSize(window.innerWidth, window.innerHeight);
            this.$refs.container.appendChild(this.renderer.domElement);
        },
        //創(chuàng)建相機(jī)控件
        createControls() {
            this.controls = new OrbitControls(this.camera, this.renderer.domElement);
        }
    }
};
</script>

<style scoped>
#infoBox {
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    background-color: #fff;
    border: 1px solid #ccc;
    padding: 5px;
}
</style>

效果圖如下 :

raycaster,javascript,前端,vue.js,3d


?結(jié)尾

要是讀者覺得幫到你們了,麻煩點(diǎn)個(gè)贊鼓勵(lì)一下,以便鼓舞我這個(gè)新手小白,謝謝大家

另外大家要有什么疑問或者是指教都可以在評論區(qū)發(fā)出來,作者看到一定回復(fù),謝謝大家文章來源地址http://www.zghlxwxcb.cn/news/detail-753955.html

到了這里,關(guān)于Three.js中光線投射Raycaster的簡單使用案例 與模型的交互,當(dāng)鼠標(biāo)移動(dòng)到模型時(shí)出現(xiàn)信息框的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • three.js——模型對象的使用材質(zhì)和方法

    three.js——模型對象的使用材質(zhì)和方法

    BufferGeometry通過.scale()、.translate()、.rotateX()、.rotateY()等方法可以對幾何體本身進(jìn)行縮放、平移、旋轉(zhuǎn),這些方法本質(zhì)上都是改變幾何體的頂點(diǎn)數(shù)據(jù)。 官網(wǎng)的模型和材質(zhì)使用 線條模式渲染,查看幾何體三角形結(jié)構(gòu)

    2024年02月07日
    瀏覽(23)
  • 【案例】3D地球(vue+three.js)

    【案例】3D地球(vue+three.js)

    需要下載插件 有人找不到合適的地球平面圖的話,可直接地球平面圖

    2024年02月06日
    瀏覽(25)
  • 小程序集成Three.js框架(演示案例)

    小程序集成Three.js框架(演示案例)

    Three.js作為非常好用的3D前端開發(fā)框架,受到很多前端開發(fā)者的追捧,而要在微信小程序中運(yùn)用則需要使用適配小程序的Three.js庫。 下面是集成Three.js后的微信小程序演示示例。包括常規(guī)的創(chuàng)建模型,應(yīng)用材質(zhì),raycastor選擇器等大部分Three.js使用案例。 掃碼查看Three.js集成到小

    2024年02月13日
    瀏覽(24)
  • VUE使用Three.js實(shí)現(xiàn)模型,點(diǎn)擊交互,相機(jī)旋轉(zhuǎn)視角跟隨移動(dòng)(Threejs中使用Tweenjs,含demo源碼)

    VUE使用Three.js實(shí)現(xiàn)模型,點(diǎn)擊交互,相機(jī)旋轉(zhuǎn)視角跟隨移動(dòng)(Threejs中使用Tweenjs,含demo源碼)

    目錄 一、Three.js是什么? 二、VUE簡單使用Three.js步驟 1.npm安裝 2.template模板 3.引入庫 4.定義全局變量 5.初始化場景 6.初始化相機(jī) 7.初始化燈光 8.初始化渲染器 9.創(chuàng)建模型(這里我搭建的模型是一個(gè)簡單雙面貨架模型) 10.根據(jù)瀏覽器窗口自適應(yīng) 11.初始化函數(shù),頁面加載完成時(shí)調(diào)用

    2024年02月03日
    瀏覽(104)
  • 微信小程序3D,使用Three.js在微信小程序中展示gltf模型,使用VisionKit展示AR能力

    微信小程序3D,使用Three.js在微信小程序中展示gltf模型,使用VisionKit展示AR能力

    本倉庫只開源gltf模型展示技術(shù),技術(shù)好的朋友有這些代碼就能幫助你解決很多問題了 如需要完整項(xiàng)目(基于若依框架開發(fā)的后端,AR能力前端)需另外付費(fèi)贊助, 聯(lián)系方式:QQ 790002517 微信公眾號:時(shí)不待我 https://github.com/zzy-life/Wechat3D Three.js Three.js is a JavaScript 3D library. thr

    2024年02月09日
    瀏覽(49)
  • 3D沉浸式旅游網(wǎng)站開發(fā)案例復(fù)盤【Three.js】

    3D沉浸式旅游網(wǎng)站開發(fā)案例復(fù)盤【Three.js】

    Plongez dans Lyon網(wǎng)站終于上線了。 我們與 Danka 團(tuán)隊(duì)和 Nico Icecream 共同努力,打造了一個(gè)令我們特別自豪的流暢的沉浸式網(wǎng)站。 這個(gè)網(wǎng)站是專為 ONLYON Tourism 和會(huì)議而建,旨在展示里昂最具標(biāo)志性的活動(dòng)場所。觀看簡短的介紹視頻后,用戶可以進(jìn)入城市的交互式風(fēng)景如畫的地圖,

    2024年02月12日
    瀏覽(21)
  • three.js 基礎(chǔ)認(rèn)識與簡單應(yīng)用

    three.js 基礎(chǔ)認(rèn)識與簡單應(yīng)用

    學(xué)習(xí)總結(jié)初衷:? ? ? ? ? 1. 公司項(xiàng)目需要。 ? ? ? ? 2. 做一下筆記,方便以后學(xué)習(xí)查看,好記性不如爛筆頭;也能筑固基礎(chǔ),加深印象。 ? ? ? ? 3. 現(xiàn)在國內(nèi)關(guān)于Three.js的學(xué)習(xí)資料很少,總結(jié)一下多多少少也能給有需要的小伙伴一些幫助。 1. 什么是three.js?你將它理解成

    2024年02月03日
    瀏覽(25)
  • three js模型旋轉(zhuǎn)

    three js模型旋轉(zhuǎn)

    如何讓立方體模型旋轉(zhuǎn)到指定的面 父頁面 效果:

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

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

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

    2024年02月16日
    瀏覽(97)
  • Three.js 三維模型(一)

    Three.js 三維模型(一)

    今天主要給搭建介紹下three.js的基本使用,本篇是基于筆者在16年給做的一個(gè)項(xiàng)目的demo版進(jìn)行講解的,筆者當(dāng)時(shí)采用Html5和JS進(jìn)行編寫的??赡艽蠹視?huì)問有沒有vue、React 、angular版的。這些筆者后面有時(shí)間的時(shí)候一定會(huì)給大家介紹。 其實(shí)編程的本源在于提煉屬于自己的哲學(xué)思想

    2024年02月16日
    瀏覽(36)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包