微信小程序集成three.js--1.创建各种光源的场景

news2024/12/23 16:14:12

1.实例演示

微信小程序集成Three.js,各种光源效果演示

2.源码

(1)引入three.js库文件

import * as THREE from '../../libs/three.weapp.js'
import {
    OrbitControls
} from '../../jsm/controls/OrbitControls'
const app = getApp()

库文件下载及配置看这里https://blog.csdn.net/weixin_39318421/article/details/128468409?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128468409%22%2C%22source%22%3A%22weixin_39318421%22%7D

 (2)默认环境光场景

这个场景只加入了简单的环境光,AmbientLight的光线没有特定的来源,而且这个光源也不会影响阴影的生成。在使用其他光源的同时使用AmbientLight,目的是弱化阴影或添加一些颜色。

initScene1() {
        wx.createSelectorQuery()
            .select('#webgl')
            .node()
            .exec((res) => {
                let canvasId = String(res[0].node.id)
                const canvas = THREE.global.registerCanvas(canvasId, res[0].node)
                this.setData({
                    canvasId: canvasId
                })
                //相机
                const camera = new THREE.PerspectiveCamera(70, canvas.width / canvas.height, 1, 1000);
                //场景
                const scene = new THREE.Scene();
                scene.background = new THREE.Color(0xffffff);
                const renderer = new THREE.WebGLRenderer({
                    antialias: true
                });
                camera.position.set(30, 40, 50);

                //控制器
                const controls = new OrbitControls(camera, renderer.domElement);
                controls.enableDamping = true;

                controls.update();

                //加入环境光
                let ambiColor = "#cccccc";
                let ambientLight = new THREE.AmbientLight(ambiColor);
                scene.add(ambientLight)

                //球体
                const sphereGeometry = new THREE.SphereGeometry(4, 20, 20)
                const sphereMaterial = new THREE.MeshLambertMaterial({
                    color: 0x7777ff
                })
                const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)
                sphere.position.y = 10
                sphere.position.z = 10
                //设置球体投射阴影
                sphere.castShadow = true
                scene.add(sphere)
                //正方体1
                const geometry = new THREE.BoxBufferGeometry(10, 10, 10);
                const material = new THREE.MeshLambertMaterial({
                    color: 0x2a5a5
                });
                const mesh1 = new THREE.Mesh(geometry, material);
                mesh1.position.x = 15
                mesh1.name = 'ms1'
                //设置正方体投射阴影
                mesh1.castShadow = true;
                scene.add(mesh1);

                //平面
                const planeGeometry = new THREE.PlaneGeometry(200, 150, 5, 5);
                const planeMaterial = new THREE.MeshBasicMaterial({
                    color: 0xa8a8a8,
                });
                planeMaterial.side = THREE.DoubleSide;
                const plane = new THREE.Mesh(planeGeometry, planeMaterial)
                plane.rotation.x = Math.PI / 2
                plane.position.y = -5
                //设置平面接收阴影
                plane.receiveShadow = true;
                scene.add(plane)

                //辅助线
                const axesHelper = new THREE.AxesHelper(500);
                scene.add(axesHelper)

                renderer.setPixelRatio(wx.getSystemInfoSync().pixelRatio);
                //渲染器使能阴影渲染
                renderer.shadowMap.enabled = true
                renderer.shadowMap.type = THREE.PCFSoftShadowMap;
                renderer.setSize(canvas.width, canvas.height);

                function render() {
                    canvas.requestAnimationFrame(render);
                    //更新控制器
                    controls.update();
                    renderer.render(scene, camera);
                }
                render()
            })
    },

(3)采用点光源的场景

点光源,PointLight,照射所有方向的光源。

initScene2() {
        wx.createSelectorQuery()
            .select('#webgl')
            .node()
            .exec((res) => {
                let canvasId = String(res[0].node.id)
                const canvas = THREE.global.registerCanvas(canvasId, res[0].node)
                this.setData({
                    canvasId: canvasId
                })
                //相机
                const camera = new THREE.PerspectiveCamera(70, canvas.width / canvas.height, 1, 1000);
                //场景
                const scene = new THREE.Scene();
                scene.background = new THREE.Color(0xffffff);
                const renderer = new THREE.WebGLRenderer({
                    antialias: true
                });
                camera.position.set(30, 40, 50);

                //控制器
                const controls = new OrbitControls(camera, renderer.domElement);
                controls.enableDamping = true;

                controls.update();

                //加入点光源
                let pointColor = "#ccffcc";
                let pointLight = new THREE.PointLight(pointColor);
                //设置点光源的位置
                pointLight.position.set(0, 30, 0)
                scene.add(pointLight)

                //球体
                const sphereGeometry = new THREE.SphereGeometry(4, 20, 20)
                const sphereMaterial = new THREE.MeshLambertMaterial({
                    color: 0x7777ff
                })
                const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)
                sphere.position.y = 10
                sphere.position.z = 10
                //设置球体投射阴影
                sphere.castShadow = true
                scene.add(sphere)
                //正方体1
                const geometry = new THREE.BoxBufferGeometry(10, 10, 10);
                const material = new THREE.MeshLambertMaterial({
                    color: 0x2a5a5
                });
                const mesh1 = new THREE.Mesh(geometry, material);
                mesh1.position.x = 15
                mesh1.name = 'ms1'
                //设置正方体投射阴影
                mesh1.castShadow = true;
                scene.add(mesh1);

                //平面
                const planeGeometry = new THREE.PlaneGeometry(200, 150, 20, 20);
                const planeMaterial = new THREE.MeshLambertMaterial({
                    color: 0x7777ff
                });
                planeMaterial.side = THREE.DoubleSide;
                const plane = new THREE.Mesh(planeGeometry, planeMaterial)
                plane.rotation.x = Math.PI / 2
                plane.position.y = -5
                //设置平面接收阴影
                plane.receiveShadow = true;
                scene.add(plane)

                //辅助线
                const axesHelper = new THREE.AxesHelper(500);
                scene.add(axesHelper)

                renderer.setPixelRatio(wx.getSystemInfoSync().pixelRatio);
                //渲染器使能阴影渲染
                renderer.shadowMap.enabled = true
                renderer.shadowMap.type = THREE.PCFSoftShadowMap;
                renderer.setSize(canvas.width, canvas.height);

                function render() {
                    canvas.requestAnimationFrame(render);
                    //更新控制器
                    controls.update();
                    renderer.render(scene, camera);
                }
                render()
            })
    },

(4)采用锥形光源场景

锥形光-SpotLight(聚光灯光源),通过设置target属性来确定要照射的对象

initScene3() {
        wx.createSelectorQuery()
            .select('#webgl')
            .node()
            .exec((res) => {
                let canvasId = String(res[0].node.id)
                const canvas = THREE.global.registerCanvas(canvasId, res[0].node)
                this.setData({
                    canvasId: canvasId
                })
                //相机
                const camera = new THREE.PerspectiveCamera(70, canvas.width / canvas.height, 1, 1000);
                //场景
                const scene = new THREE.Scene();
                scene.background = new THREE.Color(0xffffff);
                const renderer = new THREE.WebGLRenderer({
                    antialias: true
                });
                camera.position.set(30, 40, 50);

                //控制器
                const controls = new OrbitControls(camera, renderer.domElement);
                controls.enableDamping = true;

                controls.update();

                //添加灯光
                const spotLight = new THREE.SpotLight(0xffffff);
                spotLight.position.set(-40, 60, -10)
                //设置点光源投射阴影
                spotLight.castShadow = true;
                spotLight.target = plane;
                //设置投影显示的像素
                spotLight.shadow.mapSize.width = 1024
                spotLight.shadow.mapSize.height = 1024
                scene.add(spotLight)

                //球体
                const sphereGeometry = new THREE.SphereGeometry(4, 20, 20)
                const sphereMaterial = new THREE.MeshLambertMaterial({
                    color: 0x7777ff
                })
                const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)
                sphere.position.y = 10
                sphere.position.z = 10
                //设置球体投射阴影
                sphere.castShadow = true
                scene.add(sphere)
                //正方体1
                const geometry = new THREE.BoxBufferGeometry(10, 10, 10);
                const material = new THREE.MeshLambertMaterial({
                    color: 0x2a5a5
                });
                const mesh1 = new THREE.Mesh(geometry, material);
                mesh1.position.x = 15
                mesh1.name = 'ms1'
                //设置正方体投射阴影
                mesh1.castShadow = true;
                scene.add(mesh1);

                //平面
                const planeGeometry = new THREE.PlaneGeometry(200, 150, 20, 20);
                const planeMaterial = new THREE.MeshLambertMaterial({
                    color: 0x7777ff
                });
                planeMaterial.side = THREE.DoubleSide;
                const plane = new THREE.Mesh(planeGeometry, planeMaterial)
                plane.rotation.x = Math.PI / 2
                plane.position.y = -5
                //设置平面接收阴影
                plane.receiveShadow = true;
                scene.add(plane)

                //辅助线
                const axesHelper = new THREE.AxesHelper(500);
                scene.add(axesHelper)

                renderer.setPixelRatio(wx.getSystemInfoSync().pixelRatio);
                //渲染器使能阴影渲染
                //renderer.shadowMap.enabled = true
                renderer.shadowMap.type = THREE.PCFSoftShadowMap;
                renderer.setSize(canvas.width, canvas.height);

                function render() {
                    canvas.requestAnimationFrame(render);
                    //更新控制器
                    controls.update();
                    renderer.render(scene, camera);
                }
                render()
            })
    }

 (5)区域光场景

区域光源--RectAreaLight--可定义为一个发光矩形的光源

initScene5() {
        wx.createSelectorQuery()
            .select('#webgl')
            .node()
            .exec((res) => {
                let canvasId = String(res[0].node.id)
                const canvas = THREE.global.registerCanvas(canvasId, res[0].node)
                this.setData({
                    canvasId: canvasId
                })
                //相机
                const camera = new THREE.PerspectiveCamera(70, canvas.width / canvas.height, 1, 1000);
                //场景
                const scene = new THREE.Scene();
                scene.background = new THREE.Color(0xffffff);
                const renderer = new THREE.WebGLRenderer({
                    antialias: true
                });
                camera.position.set(30, 40, 50);

                //控制器
                const controls = new OrbitControls(camera, renderer.domElement);
                controls.enableDamping = true;
                controls.update();

                // 地面
                var planeGeometry = new THREE.PlaneGeometry(70, 70, 1, 1);
                var planeMaterial = new THREE.MeshStandardMaterial({
                    roughness: 0.044676705160855, // calculated from shininess = 1000
                    metalness: 0.0
                });
                var plane = new THREE.Mesh(planeGeometry, planeMaterial);
                // plane.receiveShadow  = true;
                // rotate and position the plane
                plane.rotation.x = -0.5 * Math.PI;
                plane.position.x = 0;
                plane.position.y = 0;
                plane.position.z = 0;
                // add the plane to the scene
                scene.add(plane);

                //光线
                var spotLight0 = new THREE.SpotLight(0xcccccc);
                spotLight0.position.set(-40, 60, -10);
                spotLight0.intensity = 0.1;
                spotLight0.lookAt(plane);
                scene.add(spotLight0);

                var areaLight1 = new THREE.RectAreaLight(0xff0000, 500, 4, 10);
                areaLight1.position.set(-10, 10, 35);
                scene.add(areaLight1);

                var areaLight2 = new THREE.RectAreaLight(0x00ff00, 500, 4, 10);
                areaLight2.position.set(0, 10, 35);
                scene.add(areaLight2);

                var areaLight3 = new THREE.RectAreaLight(0x0000ff, 500, 4, 10);
                areaLight3.position.set(10, 10, 35);
                scene.add(areaLight3);

                var planeGeometry1 = new THREE.BoxGeometry(4, 10, 0);
                var planeGeometry1Mat = new THREE.MeshBasicMaterial({
                    color: 0xff0000
                });
                var plane1 = new THREE.Mesh(planeGeometry1, planeGeometry1Mat);
                plane1.position.copy(areaLight1.position);
                scene.add(plane1);

                var planeGeometry2 = new THREE.BoxGeometry(4, 10, 0);
                var planeGeometry2Mat = new THREE.MeshBasicMaterial({
                    color: 0x00ff00,
                });
                var plane2 = new THREE.Mesh(planeGeometry2, planeGeometry2Mat);

                plane2.position.copy(areaLight2.position);
                scene.add(plane2);

                var planeGeometry3 = new THREE.BoxGeometry(4, 10, 0);
                var planeGeometry3Mat = new THREE.MeshBasicMaterial({
                    color: 0x0000ff
                });
                var plane3 = new THREE.Mesh(planeGeometry3, planeGeometry3Mat);

                plane3.position.copy(areaLight3.position);
                scene.add(plane3);

                //辅助线
                const axesHelper = new THREE.AxesHelper(500);
                scene.add(axesHelper)

                renderer.setPixelRatio(wx.getSystemInfoSync().pixelRatio);
                //渲染器使能阴影渲染
                renderer.shadowMap.enabled = true
                renderer.shadowMap.type = THREE.PCFSoftShadowMap;
                renderer.setSize(canvas.width, canvas.height);

                function render() {
                    canvas.requestAnimationFrame(render);
                    //更新控制器
                    controls.update();
                    renderer.render(scene, camera);
                }
                render()
            })
    },

其他的代码就是按钮演示视频中按钮的点击事件函数,点击按钮后渲染不同的场景,这里不做过多赘述。

3.实例小程序

场景演示->Three.js中的各种光源 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第七章面向对象编程

第七章面向对象编程 7.1对象在内存中存在形式 7.1.1属性/成员变量/字段(field) 1.属性成员变量字段field,概念上相等 public class Object02 {//编写一个 main 方法public static void main(String[] args) {}} class Car {String name;//属性, 成员变…

数据防泄露之图文档及业务数据经验分享

场景描述 信息化时代发展迅速,数据防泄露一词也频繁的出现在我们身边。无论企业或政府单位,无纸化办公场景越来越多,数据泄露的时间也层出不穷。例如:世界最大职业中介网站Monster遭到黑客大规模攻击,黑客窃取在网站注…

跟着pink老师学JS的第三天总结

* 这个仿京东的商品放大镜效果真不好做&#xff01; 鼠标拖拽&#xff1a; * 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

FineReport报表设计工具- 配置DB2外接数据库(1)

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 - 11.0.3 1&#xff09;首次配置外接数据库时&#xff0c;支持自行选择是否「迁移数据至要启用的数据库」 2&#xff09;迁移外接数据库的过程提示细化&#xff0c;方便用户了解迁移进度 1.2 功能简介 报表系统配置外接数…

Seata使用教程

文章目录一、Seata简介1.Seata 概念介绍2.分布式事务3.Seata核心组件4.Seata 工作流程5.Seata四大模式二、Seata实战教程1.下载资源2.配置Seata-Server3.增加相关表结构4.代码配置三、常见报错解决一、Seata简介 1.Seata 概念介绍 Seata 是一款阿里巴巴开源的分布式事务解决方…

eNSP 设备启动失败,错误代码:40 解决方案

eNSP 路由器启动失败&#xff0c;错误代码&#xff1a;40 解决方案 eNSP 路由器启动失败&#xff0c;错误代码&#xff1a;40 解决方案 文章目录eNSP 路由器启动失败&#xff0c;错误代码&#xff1a;40 解决方案一、出现错误代码&#xff1a;40二、解决方法1.确定相关的软件安…

《设计模式》外观模式

《设计模式》外观模式《设计模式》设计模式的基本原则 《设计模式》单例模式 《设计模式》工厂模式 《设计模式》原型模式 《设计模式》建造者模式 《设计模式》适配器模式 《设计模式》桥接模式 《设计模式》装饰者模式 《设计模式》组合模式 《设计模式》外观模式 定义&#…

免费刷题!初级软件测试面试题目和答案这个小程序很全

有没有软件测试面试题库小程序&#xff1f;相信这是很多准备找工作的新手测试人都想要知道的吧&#xff01; 今天&#xff0c;我就根据大家的需求&#xff0c;为大家整理了一些有关初级软件测试的面试题目以及一个可以免费刷题的题库&#xff0c;希望能帮助你们早日拿下心仪的…

UDS-10 Diagnostic and communication management functional unit

10 诊断与通信管理功能单元 来自&#xff1a;ISO 14229-1-2020.pdf 10.1概述 表22指定了诊断和通信管理功能单元。 注&#xff1a; DiagnosticSessionControl&#xff1a;客户端请求控制服务器的诊断会话。ECUReset&#xff1a;客户端强制服务器执行重置。SecurityAccess&am…

知识蒸馏原理

文章目录0.知识蒸馏&#xff08;模型压缩的一种方法&#xff09;1.蒸馏2.为什么要蒸馏3.知识的表示与迁移4.蒸馏温度T5.知识蒸馏过程6.知识蒸馏的应用场景7.知识蒸馏背后的机理8.为什么用soft targets 而不用 label smoothing?9.知识蒸馏的研究方向10.知识蒸馏代码库11.扩展阅…

回顾2022,展望2023,笔耕不辍,钟情翰墨

目录 回顾2022 博客概览 博客成就 获得测试领域优质创作者认证 获得博客专家认证 获得额外收入 创建第一个属于自己的个人社区 获得第一个实体奖牌【博客专家】 首次登榜梦想照进现实CSDN实体奖牌榜 首次参与社区新锐和社区先锋评选 开启了6个知识体系系列教程 个人…

2023春招面试:消息中间件面试题整理

RabbitMQ如何确保消息发送 &#xff1f; 消息接收&#xff1f; 开启生产者确认机制&#xff0c;确保生产者的消息能到达队列&#xff08;config机制保证消息正确到达交换机、return机制保证消息正确到达队列&#xff09;开启持久化功能&#xff0c;确保消息未消费前在队列中不会…

如何通过WindowsIIS部署网站

1.winR输入control 打开【控制面板】 2.选择程序 3.选择【启用或关闭Windows功能】 4.在【Windows功能】对话框中勾选【Internet Information Services】下的【FTP服务器】、【Web管理工具】和【万维网服务】中的所有选项&#xff0c;并点击【确定】 5.Windows功能会开始下载并…

Lambda表达式的来龙去脉,全在这篇文章里了

一. 前言部分 大家都知道Lambda表达式作为JAVA 8中提供的新特性之一&#xff0c;在现在的企业开发中已经非常的流行了。今天壹哥就通过一个具体的案例&#xff0c;来带大家一起详细地探究一下Lambda表达式是如何被提出来的&#xff0c;以及它的出现主要是用来解决什么问题的。…

乌班图(Ubuntu)单系统或者乌班图+Win双系统安装教程

单ubuntu系统安装 1、将ubuntu系统U盘插入电脑USB接口&#xff0c;建议优先插USB3.0蓝色(彩色)接口&#xff0c;这样可以保证安装过程中文件的读取速度&#xff0c;加快安装进程。 2、然后电脑关机状态下&#xff0c;开机。开机后快速按主机的快捷启动键&#xff1a; 3、在出现…

Qt编写雷达模拟仿真工具1-背景布局

一、前言 雷达模拟仿真工具&#xff0c;整体结构采用的QGraphicsView框架&#xff0c;背景布局采用的分层绘制&#xff0c;这样可以控制该需要重新绘制的重新绘制&#xff0c;不需要重新的绘制的就没必要再多余的浪费&#xff0c;这里定义了一个GraphicsBackGroundItem类继承自…

Spring框架(容器)--简介(实现原理、核心模块、组成部分)

spring框架&#xff08;容器&#xff09; spring简介 1、Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言&#xff0c;任何Java应用都可以从Spring中受益。 2、Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 3、轻量——从大小…

Creo9.0 Windows 3D建模工具

前言 creo9.0正式版是一款非常优秀的3D建模设计软件。该软件界面美观&#xff0c;提供了CAD 技术、模制造绘图、多实体建模、多体设计、实时仿真、框架和焊缝设计等一系列强大的辅助设计功能&#xff0c;通过这些功能&#xff0c;让用户轻松解决设计中带来的各种问题。 下载 …

律所管理系统的功能以及作用分别有哪些?

在全球进入信息化的时代&#xff0c;随着网络的普及与发展&#xff0c;网络所带来的信息交流与利用的优势愈发明显。尤其是随着法律制度的不断健全和人民法律意识的提高&#xff0c;涉及法律诉讼的案件也在不断地增加&#xff0c;律师事务所作为中介的法律机构&#xff0c;要处…

字符设备驱动(一)

1.Linux设备分类 linux的文件种类&#xff1a; -&#xff1a;普通文件 文件内容文件名元信息&#xff08;文件的相关属性—组织在inode的一个结构体内&#xff09; d&#xff1a;目录文件 p&#xff1a;管道文件 s&#xff1a;本地socket文件 l&#xff1a;链接文件 软链接&am…