three.js 叉乘判斷物體在人前左,前右,后左、后右

效果:

代碼:

<template><div><el-container><el-main><div class="box-card-left"><div id="threejs"></div><div style="padding: 10px;text-align: left;">叉乘判斷物體在人左前、右前還是左后,右后方向<div style="margin: 10px;"><el-button @click="judge">開始判斷</el-button><div v-for="(item,index) in this.positon_arr" :key="index" style="line-height: 28px;">{{ item }}</div></div></div></div></el-main></el-container></div>
</template>
<script>
// 引入軌道控制器擴展庫OrbitControls.js
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
import {CSS3DSprite,CSS3DRenderer,
} from "three/examples/jsm/renderers/CSS3DRenderer.js";
export default {data() {return {scene: null, // 場景對象camera: null, // 相機對象group: null, // 組對象person: null, // 人對象renderer: null, // 渲染器對象css3DRenderer: null, // 渲染器對象a: new this.$three.Vector3(0, 0, 1),// b: new this.$three.Vector3(30, 0, 30),meshPosition:[],positon_arr:[],};},created() {},mounted() {this.name = this.$route.query.name;this.init();},methods: {goBack() {this.$router.go(-1);},/*** 如何判斷物體是在人的前方還是后方* 思路:借助兩個單位向量的點乘結果來判斷的;*/init() {// 創建場景對象this.scene = new this.$three.Scene();// 創建輔助坐標軸對象const axesHelper = new this.$three.AxesHelper(10);this.scene.add(axesHelper);// 創建環境光對象const ambientLight = new this.$three.AmbientLight(0xffffff, 10);this.scene.add(ambientLight);// 創建相機對象this.camera = new this.$three.PerspectiveCamera(60,1,0.01,2000);this.camera.position.set(-4,5,-5);this.camera.lookAt(0,0,0);this.css3DRenderer = new CSS3DRenderer();this.css3DRenderer.setSize(1000,800);this.css3DRenderer.render(this.scene, this.camera);this.css3DRenderer.domElement.style.position = 'absolute';this.css3DRenderer.domElement.style.top = 0;this.css3DRenderer.domElement.style.pointerEvents = 'none';this.css3DRenderer.render(this.scene, this.camera);window.document.getElementById("threejs").appendChild(this.css3DRenderer.domElement);this.createMesh(0xffaadd, new this.$three.Vector3(3,0,3), '球1');this.createMesh(0xddcc11, new this.$three.Vector3(-3,0,3), '球2');this.createMesh(0x1199dd, new this.$three.Vector3(3,0,-3), '球3');this.createMesh(0xbbaadd, new this.$three.Vector3(-3,0,-3), '球4');this.createArrow(this.a);// 創建渲染器對象this.renderer = new this.$three.WebGLRenderer();this.renderer.setSize(1000,800);// 創建gltfLoader加載器對象const gltfLoader = new GLTFLoader();gltfLoader.load("/models/gltf/person2/scene.gltf", gltf => {console.log(gltf);gltf.scene.children[0].scale.set(2,2,2);this.scene.add(gltf.scene);this.renderer.render(this.scene, this.camera);window.document.getElementById("threejs").appendChild(this.renderer.domElement);const controls = new OrbitControls(this.camera, this.renderer.domElement);controls.addEventListener("change", () => {this.renderer.render(this.scene, this.camera);})this.renderFun();})},// 創建箭頭用于顯示人前方的單位向量 this.acreateArrow(dir, l=2, color=0xffffff) {let arrow = new this.$three.ArrowHelper(dir, new this.$three.Vector3(0,0,0), l, color);this.scene.add(arrow);},// 創建模型的方法createMesh(color, position, name) {// 創建球緩沖幾何體const geometry = new this.$three.SphereGeometry(1,32,16);// 創建材質對象const material = new this.$three.MeshBasicMaterial({color: color});const mesh = new this.$three.Mesh(geometry, material);mesh.name = name;mesh.position.set(position.x, position.y, position.z);this.meshPosition.push({name: name, position: mesh.position});let dom = this.createDom(name);mesh.add(dom);this.scene.add(mesh);this.createArrow(mesh.position, mesh.position.length()*0.7,color);},createDom(name) {let dom = document.createElement("div");dom.innerText = name;let css3DObject = new CSS3DSprite(dom);css3DObject.scale.set(0.03,0.03,0.03);return css3DObject;},renderFun() {this.css3DRenderer.render(this.scene, this.camera);requestAnimationFrame(this.renderFun); // 一定要設置這一句,否則,不渲染},/*** 人前方的單位向量a 與 物體到原點的向量m 叉乘后,* 可以通過叉乘結果的y值判斷物體是在人左側還是右側* */judge() {if(this.meshPosition) {this.positon_arr = [];this.meshPosition.forEach(item => {let c = this.a.clone().cross(item.position);let p_str = "";if(c.y > 0) {p_str += item.name +"在人左";p_str += this.dotDeg(item.position);} else {p_str += item.name +"在人右";p_str += this.dotDeg(item.position);}this.positon_arr.push(p_str);})}},// 點乘判斷兩個向量的夾角dotDeg(meshPosition) {let c = this.a.clone().dot(meshPosition.clone().normalize());let cos = Math.acos(c);let deg = this.$three.MathUtils.radToDeg(cos);console.log(deg);let pos = "";if(deg > 0 && deg < 90) {pos = "前";} else if (deg == 90) {pos = "平行";} else {pos = "后";}return pos;}},
};
</script>
<style lang="less" scoped>
.box-card-left {display: flex;align-items: flex-start;flex-direction: row;width: 100%;.box-right {img {width: 500px;user-select: none;}}
}
</style>

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713614.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sshd啟動太慢,導致首次登錄困難的問題(未解決)

開始以為是無法開機啟動。長時間后&#xff08;3-4分鐘&#xff09;&#xff0c;又可以登錄了。 解決辦法1&#xff08;無效&#xff09; 編輯sshd_config UseDNS no GSSAPIAuthentication no IgnoreRhosts yes UsePAM no 解決辦法2&#xff08;無效&#xff09; 在/etc/h…

加密與安全_探索對稱加密算法

文章目錄 概述常用的對稱加密算法AESECB模式CBC模式 (推薦)ECB VS CBC 附&#xff1a;AES工具類總結 概述 對稱加密算法是一種加密技術&#xff0c;使用相同的密鑰來進行加密和解密數據。在這種算法中&#xff0c;發送方使用密鑰將明文&#xff08;未加密的數據&#xff09;轉…

14:00面試,14:07就出來了,問的問題過于變態了。。。

我從一家小公司轉投到另一家公司&#xff0c;期待著新的工作環境和機會。然而&#xff0c;新公司的加班文化讓我有些始料未及。雖然薪資相對較高&#xff0c;但長時間的工作和缺乏休息使我身心俱疲。 就在我逐漸適應這種高強度的工作節奏時&#xff0c;公司突然宣布了一則令人…

Android提供了多種方式來打開特定文件夾中的視頻

使用 MediaStore獲取指定文件夾的視頻&#xff0c;更優化方法&#xff1a; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.Environme…

鴻蒙操作系統特點

鴻蒙&#xff08;HarmonyOS&#xff09;是華為公司開發的一種面向全場景的分布式操作系統。下面是對鴻蒙操作系統的詳細介紹&#xff1a; 1. 多設備支持&#xff1a;鴻蒙是一種面向多種設備的操作系統&#xff0c;支持手機、平板電腦、智能手表、智能屏、車載設備和物聯網設備…

kafka學習筆記三

目錄 第二篇 外部系統集成 第三篇 生產調優手冊 第1章 kafka硬件配置選擇 第2章 生產者調優 2.1 生產者核心參數配置 2.2 生產者如何提高吞吐量 2.3 數據可靠性 2.4 數據去重 2.5 數據有序 2.6 數據亂序 第3章 Kafka Broker調優 3.1 Broker核心參數配置 3.2 其他 …

禪道:提bug、管理case 7.0

一、禪道的介紹 &#xff08;1&#xff09;定義禪道是一個項目管理工具&#xff0c;也是一個bug管理工具&#xff0c;還是一個用例管理工具。 &#xff08;2&#xff09;作用&#xff1a;為了解決眾多企業在管理中出現混亂&#xff0c;無序的現象&#xff0c;開發出來 &…

ppt中調整某條表格框線的格式

1、先設置好邊框線的屬性&#xff1a; 2、選擇要調整的邊框線所在的單元格&#xff08;第二列的右邊框加粗&#xff0c;體現分欄的效果&#xff09; 3、設計--邊框--中選擇要調整的邊框線位置&#xff08;假設要調整右框線&#xff09;

精讀服務器默認rsyslog的配置文件

rsyslog的配置文件 rsyslog.conf #### MODULES ####$ModLoad imuxsock # provides support for local system logging (e.g. via logger command) $ModLoad imjournal # provides access to the systemd journal #$ModLoad imklog # reads kernel messages (the same are read…

JavaScript解決生日倒計時的問題

創建一個文本框&#xff0c;在一個文本框中&#xff0c;讓用戶輸入他的出生月份&#xff0c;第二個文本框中輸入月份中的日期&#xff0c;編寫一個JavaScript程序&#xff0c;在第三個文本框中打印距離用戶生日還有多少天。 <div id"box"><label for"&…

libvirt命名空間xmlns:qemu的使用

示例xml <domain type{domain_type} xmlns:qemuhttp://libvirt.org/schemas/domain/qemu/1.0><qemu:commandline><qemu:commandline><qemu:arg value-newarg/><qemu:env nameQEMU_ENV valueVAL/></qemu:commandline></domain>"…

13、輸入捕獲實驗

目錄 一、通用定時器輸入捕獲概述 二、常用寄存器和庫函數配置 三、輸入捕獲實驗講解 一、通用定時器輸入捕獲概述 STM32輸入捕獲工作過程&#xff08;通道1為例&#xff09; 一句話總結工作過程&#xff1a; 通過檢測TIMx_CHx上的邊沿信號&#xff0c;在邊沿信號發生跳變…

28.HarmonyOS App(JAVA)多頁簽的實現(Tab)

HarmonyOS App(JAVA)多頁簽的實現&#xff08;Tab&#xff09; 頁面可左右滑動&#xff0c;點擊界面1,2,3切換到對應界面 PageSlider的創建和使用 在layout目錄下的xml文件中創建PageSlider。 <PageSlider ohos:id"$id:page_slider" ohos:height"300vp&…

2D割草/吸血鬼游戲 性能優化——GPU Spine動畫

視頻中萬人同屏方案(gpu動畫、渲染、索敵、避障等功能)&#xff0c;可某寶搜店鋪&#xff1a;【游戲開發資源商店】獲取整套方案源碼。 在過去的幾年里&#xff0c;割草、類吸血鬼玩法的游戲頻出爆款&#xff0c;其豐富的技能、滿屏特效、刷怪清屏的解壓暢快是此類游戲的核心&…

【MySQL】復合查詢(重點)-- 詳解

一、基本查詢練習回顧 1、查詢工資高于 500 或崗位為 MANAGER 的雇員&#xff0c;同時還要滿足他們的姓名首字母為大寫的 J 2、按照部門號升序而雇員的工資降序排序 3、使用年薪進行降序排序 4、顯示工資最高的員工的名字和工作崗位 5、顯示工資高于平均工資的員工信息 6、顯…

韋東山嵌入式Liunx入門驅動開發四

文章目錄 一、異常與中斷的概念及處理流程1-1 中斷的引入1-2 棧(1) CPU實現a ab的過程(2) 進程與線程 1-3 Linux系統對中斷處理的演進1-4 Linux 中斷系統中的重要數據結構(1) irq_desc 結構體(2) irqaction 結構體(3) irq_data 結構體(4) irq_domain 結構體(5) irq_domain 結構…

Redis入門與應用

Redis入門與應用 Redis的技術全景 Redis一個開源的基于鍵值對&#xff08;Key-Value&#xff09;NoSQL數據庫。使用ANSI C語言編寫、支持網絡、基于內存但支持持久化。性能優秀&#xff0c;并提供多種語言的API。 兩大維度 兩大維度&#xff1a;應用維度、底層原理維度 我們…

Java面試題:解釋Java內存模型中的棧內存和本地方法棧的區別,解釋Java中的垃圾回收機制中的增量收集算法,解釋Java內存模型中的直接內存的作用

Java內存模型與JVM面試題解析 在Java面試中&#xff0c;對Java內存模型&#xff08;JMM&#xff09;的理解是衡量候選人是否具備扎實Java功底的重要指標。JMM涵蓋了JVM的內存結構&#xff0c;包括堆、棧、方法區等關鍵組件&#xff0c;以及垃圾回收機制等核心概念。下面&#…

記一次dockerfile無法構建問題追溯

我有一個dockerfile如下&#xff1a; ENTRYPOINT ["/sbin/tini"&#xff0c;"-g", "--"] CMD /home/scrapy/start.sh 我原本的用意是先啟動tini&#xff0c;再執行下面的cmd命令啟動start.sh。 為啥要用tini&#xff1f; 因為我的這個docker…

git介紹4.2

git(版本控制工具) 一、git 介紹 1、git是目前世界上最先進的分布式版本控制系統&#xff0c;可以有效&#xff0c;高速的處理從小到大的項目版本管理。 2、git是linux torvalds 為了幫助管理linux內核開發二開發的一個開放源碼的版本控制軟件。 3、git作用&#xff1a;更好…