CSS3DRenderer, CSS3DObject, OrthographicCamera API 结合使用案例

本文主要是介绍CSS3DRenderer, CSS3DObject, OrthographicCamera API 结合使用案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CSS3DRenderer, CSS3DObject, OrthographicCamera API 结合使用案例


<!DOCTYPE html>
<html><head><title>three.js css3d - orthographic</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><link type="text/css" rel="stylesheet" href="main.css"><style>body {background-color: #f0f0f0;}a {color: #f00;}#info {color: #000000;}</style></head><body><div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - orthographic</div><script type="importmap">{"imports": {"three": "../build/three.module.js","three/addons/": "./jsm/"}}</script><script type="module">import * as THREE from 'three';import { OrbitControls } from 'three/addons/controls/OrbitControls.js';import { CSS3DRenderer, CSS3DObject } from 'three/addons/renderers/CSS3DRenderer.js';import { GUI } from 'three/addons/libs/lil-gui.module.min.js';let camera, scene, renderer;let scene2, renderer2;const frustumSize = 500;init();animate();function init() {const aspect = window.innerWidth / window.innerHeight;camera = new THREE.OrthographicCamera( frustumSize * aspect / - 2, frustumSize * aspect / 2, frustumSize / 2, frustumSize / - 2, 1, 1000 );camera.position.set( - 200, 200, 200 );scene = new THREE.Scene();scene.background = new THREE.Color( 0xf0f0f0 );scene2 = new THREE.Scene();const material = new THREE.MeshBasicMaterial( { color: 0x000000, wireframe: true, wireframeLinewidth: 1, side: THREE.DoubleSide } );// leftcreatePlane(100, 100,'chocolate',new THREE.Vector3( - 50, 0, 0 ),new THREE.Euler( 0, - 90 * THREE.MathUtils.DEG2RAD, 0 ));// rightcreatePlane(100, 100,'saddlebrown',new THREE.Vector3( 0, 0, 50 ),new THREE.Euler( 0, 0, 0 ));// topcreatePlane(100, 100,'yellowgreen',new THREE.Vector3( 0, 50, 0 ),new THREE.Euler( - 90 * THREE.MathUtils.DEG2RAD, 0, 0 ));// bottomcreatePlane(300, 300,'seagreen',new THREE.Vector3( 0, - 50, 0 ),new THREE.Euler( - 90 * THREE.MathUtils.DEG2RAD, 0, 0 ));//renderer = new THREE.WebGLRenderer();renderer.setPixelRatio( window.devicePixelRatio );renderer.setSize( window.innerWidth, window.innerHeight );document.body.appendChild( renderer.domElement );renderer2 = new CSS3DRenderer();renderer2.setSize( window.innerWidth, window.innerHeight );renderer2.domElement.style.position = 'absolute';renderer2.domElement.style.top = 0;document.body.appendChild( renderer2.domElement );const controls = new OrbitControls( camera, renderer2.domElement );controls.minZoom = 0.5;controls.maxZoom = 2;function createPlane( width, height, cssColor, pos, rot ) {const element = document.createElement( 'div' );element.style.width = width + 'px';element.style.height = height + 'px';element.style.opacity = 0.75;element.style.background = cssColor;const object = new CSS3DObject( element );object.position.copy( pos );object.rotation.copy( rot );scene2.add( object );const geometry = new THREE.PlaneGeometry( width, height );const mesh = new THREE.Mesh( geometry, material );mesh.position.copy( object.position );mesh.rotation.copy( object.rotation );scene.add( mesh );}window.addEventListener( 'resize', onWindowResize );createPanel();}function onWindowResize() {const aspect = window.innerWidth / window.innerHeight;camera.left = - frustumSize * aspect / 2;camera.right = frustumSize * aspect / 2;camera.top = frustumSize / 2;camera.bottom = - frustumSize / 2;camera.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );renderer2.setSize( window.innerWidth, window.innerHeight );}function animate() {requestAnimationFrame( animate );renderer.render( scene, camera );renderer2.render( scene2, camera );}function createPanel() {const panel = new GUI();const folder1 = panel.addFolder( 'camera setViewOffset' ).close();const settings = {'setViewOffset'() {folder1.children[ 1 ].enable().setValue( window.innerWidth );folder1.children[ 2 ].enable().setValue( window.innerHeight );folder1.children[ 3 ].enable().setValue( 0 );folder1.children[ 4 ].enable().setValue( 0 );folder1.children[ 5 ].enable().setValue( window.innerWidth );folder1.children[ 6 ].enable().setValue( window.innerHeight );},'fullWidth': 0,'fullHeight': 0,'offsetX': 0,'offsetY': 0,'width': 0,'height': 0,'clearViewOffset'() {folder1.children[ 1 ].setValue( 0 ).disable();folder1.children[ 2 ].setValue( 0 ).disable();folder1.children[ 3 ].setValue( 0 ).disable();folder1.children[ 4 ].setValue( 0 ).disable();folder1.children[ 5 ].setValue( 0 ).disable();folder1.children[ 6 ].setValue( 0 ).disable();camera.clearViewOffset();}};folder1.add( settings, 'setViewOffset' );folder1.add( settings, 'fullWidth', window.screen.width / 4, window.screen.width * 2, 1 ).onChange( ( val ) => updateCameraViewOffset( { fullWidth: val } ) ).disable();folder1.add( settings, 'fullHeight', window.screen.height / 4, window.screen.height * 2, 1 ).onChange( ( val ) => updateCameraViewOffset( { fullHeight: val } ) ).disable();folder1.add( settings, 'offsetX', 0, 256, 1 ).onChange( ( val ) => updateCameraViewOffset( { x: val } ) ).disable();folder1.add( settings, 'offsetY', 0, 256, 1 ).onChange( ( val ) => updateCameraViewOffset( { y: val } ) ).disable();folder1.add( settings, 'width', window.screen.width / 4, window.screen.width * 2, 1 ).onChange( ( val ) => updateCameraViewOffset( { width: val } ) ).disable();folder1.add( settings, 'height', window.screen.height / 4, window.screen.height * 2, 1 ).onChange( ( val ) => updateCameraViewOffset( { height: val } ) ).disable();folder1.add( settings, 'clearViewOffset' );}function updateCameraViewOffset( { fullWidth, fullHeight, x, y, width, height } ) {if ( ! camera.view ) {camera.setViewOffset( fullWidth || window.innerWidth, fullHeight || window.innerHeight, x || 0, y || 0, width || window.innerWidth, height || window.innerHeight );} else {camera.setViewOffset( fullWidth || camera.view.fullWidth, fullHeight || camera.view.fullHeight, x || camera.view.offsetX, y || camera.view.offsetY, width || camera.view.width, height || camera.view.height );}}</script></body>
</html>

本内容来源于小豆包,想要更多内容请跳转小豆包 》

这篇关于CSS3DRenderer, CSS3DObject, OrthographicCamera API 结合使用案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817508

相关文章

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程