学习threejs,实现几何体阴影效果

news/2024/9/30 2:11:35/

👨‍⚕️ 主页: gis分享者
👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️ 收录于专栏:threejs gis工程师


文章目录

  • 一、🍀前言
  • 二、🍀绘制任意字体模型
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、🍀前言

本文详细介绍基于threejs如何绘制任意文字模型,亲测可用。希望能帮助到您。一起学习,加油!加油!

二、🍀绘制任意字体模型

1. ☘️实现思路

  • 1、初始化renderer渲染器
  • 2、初始化Scene三维场景
  • 3、初始化camera相机,定义相机位置 camera.position.set
  • 4、初始化light灯光,定义灯光位置,开启light.castShadow灯光阴影,Scene场景加入灯光
  • 5、加载几何模型:创建SphereGeometry球体、BoxGeometry立方体、PlaneGeometry地面几何体以及AxisHelper辅助工具坐标系,Scene场景加入以上几何体和工具。
  • 6、加入controls控制,加入stats监控器,监控帧数信息

2. ☘️代码样例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>learn9(实现阴影效果)</title><script src="lib/threejs/127/three.js-master/build/three.js"></script><script src="lib/threejs/127/three.js-master/examples/js/controls/TrackballControls.js"></script><script src="lib/threejs/127/three.js-master/examples/js/libs/stats.min.js"></script>
</head>
<style>body {margin: 0;}canvas {width: 100%;height: 100%;display: block;}
</style>
<body onload="draw()"></body>
<script>var renderervar initRender = () => {// 抗锯齿renderer = new THREE.WebGLRenderer({antialias: true})renderer.setSize(window.innerWidth, window.innerHeight)renderer.shadowMap.enabled = true// 默认的是,没有设置的这个清晰 THREE.PCFShadowMaprenderer.shadowMap.type = THREE.PCFSoftShadowMapdocument.body.appendChild(renderer.domElement)}var cameravar initCamera = () => {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)camera.position.set(0, 40, 100)camera.lookAt(new THREE.Vector3(0, 0, 0))}var scenevar initScene = () => {scene = new THREE.Scene()// scene.fog = new THREE.FogExp2(0xffffff,0.02)scene.fog = new THREE.Fog(0xffffff, 100, 120)}var lightvar initLight = () => {scene.add(new THREE.AmbientLight(0x444444))light = new THREE.SpotLight(0xffffff)light.position.set(60, 30, 0)//告诉平行光需要开启阴影投射light.castShadow = truescene.add(light)}var initModel = () => {// 球var sphereGemometry = new THREE.SphereGeometry(5, 20, 20)var sphereMatarial = new THREE.MeshStandardMaterial({color: 0x7777ff})var sphere = new THREE.Mesh(sphereGemometry, sphereMatarial)sphere.position.set(0, 5, 0)sphere.castShadow = truescene.add(sphere)//辅助工具var helper = new THREE.AxisHelper(10)scene.add(helper)//立方体var cubeGeometry = new THREE.BoxGeometry(10, 10, 8)var cubeMaterial = new THREE.MeshLambertMaterial({color: 0x00ffff})var cube = new THREE.Mesh(cubeGeometry, cubeMaterial)cube.position.x = 25cube.position.y = 5cube.position.z = -5//告诉立方体需要投射阴影cube.castShadow = truescene.add(cube)// 底面var planeGeometry = new THREE.PlaneGeometry(100, 100)var planeMatarial = new THREE.MeshStandardMaterial({color: 0xaaaaaa})var plane = new THREE.Mesh(planeGeometry, planeMatarial)plane.rotation.x = -0.5 * Math.PIplane.position.y = -0plane.receiveShadow = truescene.add(plane)}var statsvar initStats = () => {stats = new Stats()document.body.appendChild(stats.dom)}var controlsvar initControle = () => {controls = new THREE.TrackballControls(camera, renderer.domElement)controls.addEventListener('change', render)}var render = () => {renderer.render(scene, camera)}var onWindwosResize = () => {camera.aspect = window.innerWidth / window.innerHeightcamera.updateProjectionMatrix()controls.handleResize()render()renderer.setSize(window.innerWidth, window.innerHeight)}var animate = () => {render()stats.update()controls.update()requestAnimationFrame(animate)}var draw = () => {initRender()initScene()initCamera()initLight()initModel()initControle()initStats()animate()window.onresize = onWindwosResize}</script>
</html>

效果如下:
在这里插入图片描述


http://www.ppmy.cn/news/1532194.html

相关文章

PyTorch用map函数进行tokenize之后,为什么需要remove_columns?

遇到的问题 下面以GLUE数据集中的tokenize为例&#xff0c;下面是典型的处理方法&#xff0c;经过一个map函数&#xff0c;使用lambda表达式对数据进行tokenize。后面会跟上remove_columns这句话&#xff0c;这是为什么呢&#xff1f; if(task_name"sst2"):tokeniz…

TypeScript是基于LLM上层研发的受益者

TypeScript优在哪里 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的一个超集&#xff0c;添加了类型系统和一些其他特性。TypeScript的优势在于&#xff1a; 静态类型检查&#xff1a;TypeScript的最大卖点是它的静态类型系统。这允许开发者在编写代码…

Python 异步编程:如何从入门到精通

在现代编程实践中&#xff0c;异步编程已成为提高程序性能和效率的关键技术之一。Python&#xff0c;作为一种动态、解释型的高级编程语言&#xff0c;提供了强大的异步编程能力。本文将带你从异步编程的基础知识入手&#xff0c;逐步深入到实际应用&#xff0c;探索Python异步…

Groupby_SQL和pandas等效例子

在SQL中使用PARTITION BY与在Pandas中使用groupby().agg()有一定的相似性&#xff0c;因为它们都是用于分组数据并对每组应用某种聚合函数。 例一 下面将给出一个SQL的例子和等效的Pandas代码。 SQL 示例 假设我们有一个名为employees的表&#xff0c;包含以下列&#xff1a…

javascript手写实现instanceof函数 介绍判断数组的方法

1 手写实现instanceof函数 instanceof 是 JavaScript 中的一个运算符&#xff0c;用于检测一个对象是否是某个构造函数的实例。它的语法是 object instanceof Constructor&#xff0c;如果 object 是 Constructor.prototype 的一个实例&#xff0c;返回 true&#xff0c;否则返…

LSTM预测未来30天销售额

加入深度实战社区:www.zzgcz.com&#xff0c;免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在利用深度学习中的长短期记忆网络&#xff08;LSTM&#xff09;来预测未来30天的销售额。LSTM模型能够处理时序数据中的长期依赖问题&#xff0c;因此在销售额预测这类涉及时…

k8s_资源管理介绍

资源管理介绍 在k8s中&#xff0c;所有内容都抽象成资源&#xff0c;用户需要通过操作资源来管理k8s k8s本身就是一个集群系统&#xff0c;用户可以在集群中部署服务&#xff0c;在k8s集群中运行一个个的容器&#xff0c;将指定的程序部署到容器中 k8s最小的管理单元是pod&…

【.NET 8 实战--孢子记账--从单体到微服务】--用户(删除/修改/查询)

本文将继续讲解和用户相关的接口&#xff0c;包括用户的删除、修改和查询 一、需求 我们先来看一下这篇文章的目标也就是需求表&#xff1a; 编号需求标题需求内容1删除对某一个用户进行删除&#xff0c;注意&#xff1a;只能删除用户&#xff0c;和用户相关联的数据不能删除…