初学WebGL,使用Three.js开发第一个3d场景示例

2024-06-24 05:58

本文主要是介绍初学WebGL,使用Three.js开发第一个3d场景示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用Three.js 开发3d场景

  在图书馆偶然撞见《Three.js开发指南》一书,便试着捣鼓一翻,现将第一个示例的部分代码、注解和相关方法的API记录在此。因为此书发行时是Three.js r69版本,所以当前部分代码有所修改,且所有方法和参数以官方最新版本Three.js r90为准。

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>示例 - 开发3d场景</title><script type="text/javascript" src="../libs/three.js"></script><style>body {margin: 0;overflow: hidden;}</style>
</head>
<body><div id="WebGL-output"></div><script>function init() {// 设置场景属性// ------------------------let scene = new THREE.Scene();// scene.background = new THREE.Color( 0xEEEEEE ); // 设置场景背景色方法一// 设置摄像机属性// ------------------------let camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);// 设置渲染器属性// ------------------------let renderer = new THREE.WebGLRenderer();renderer.setClearColor(new THREE.Color(0xEEEEEE)); // 设置场景背景色方法二renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器大小// renderer.shadowMapEnabled = true; // 已修改为shadowMap对象的enabled属性renderer.shadowMap.enabled = true; // 开启阴影效果渲染,渲染阴影需要耗费大量的计算资源,默认不开启// 显示轴,并设置轴的线的大小 PS: x轴是红色的, y轴是绿色的, z轴是蓝色的// let axes = new THREE.AxisHelper(50);  // 已修改为AxesHelperlet axes = new THREE.AxesHelper(50);scene.add(axes);// 创建平面(plane)对象// ------------------------// 定义平面大小, 第一个参数为宽度,第二个参数为高度let planeGeometry = new THREE.PlaneGeometry(60, 20);// 设置平面外观(比如颜色或透明度)// let planeMaterial = new THREE.MeshBasicMaterial({ color: 0xccccc }); // MeshBasicMaterial对光源不起反应let planeMaterial = new THREE.MeshLambertMaterial({ color: 0xffffff }); // MeshLambertMaterial和MeshPhongMaterial渲染时对光源产生反应// 合并大小和外观,创建网格对象let plane = new THREE.Mesh(planeGeometry, planeMaterial);// 投射或接受阴影(receiveShadow)plane.receiveShadow = true;// 在将平面添加到场景之前,设置平面的位置plane.rotation.x = -0.5 * Math.PI; // x轴旋转90度plane.position.x = 15; // x轴正向向右,此处平面在x轴右移30个单位plane.position.y = 0;  // y轴正向向下,此处平面在x轴不动plane.position.z = 0;  // z轴正向向屏幕外,此处平面在z轴不动scene.add(plane);// 创建一个立方体// ------------------------// 定义立方体大小, 第一个参数为宽度,第二个参数为高度,第三个参数为深度,// 从生成的效果上来看,若position位置以中心点为基准,立方体的中心点和原点(0, 0, 0)重合,三个参数分别是中心点向x轴、y轴和z轴两端的延伸线let cubeGeometry = new THREE.BoxGeometry(4, 4, 4);// 设置立方体外观,wireframe为true显示线框,默认不显示let cubeMaterial = new THREE.MeshLambertMaterial({ color: 0xff0000, wireframe: false });// 合并大小和外观,创建立方体对象let cube = new THREE.Mesh(cubeGeometry, cubeMaterial);cube.castShadow = true;// 此处同上平面位置设置一致cube.position.x = -4;cube.position.y = 3;cube.position.z = 0;scene.add(cube);// 创建一个球体// ------------------------// 定义球体大小, 第一个参数为半径,第二个参数为将宽度分为多少段,第三个参数为高度分为多少段(不是很理解)let sphereGeometry = new THREE.SphereGeometry(4, 20, 20);let sphereMaterial = new THREE.MeshLambertMaterial({ color: 0x7777ff, wireframe: false });let sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);sphere.castShadow = true;sphere.position.x = 20;sphere.position.y = 4;sphere.position.z = 2;scene.add(sphere);// 添加物体到场景后,需要设置摄像机,由摄像机决定场景内的渲染// ------------------------// 先设置摄像机的位置,camera.position.x = -30; // x轴正向向右,摄像机位置在x轴上向左移30个单位,物体相对则向右移30个单位camera.position.y = 40;  // y轴正向向下,摄像机位置在y轴上向下移40个单位,物体相对则向上移40个单位camera.position.z = 30;  // z轴正向向屏幕外,摄像机位置在z轴上向屏幕外移30个单位,物体相对则向屏幕内移40个单位,可以理解视角扩大或缩放// 锁定摄像机的指向,默认是指向了(0, 0, 0)位置,这里指向场景的中心camera.lookAt(scene.position);// 添加光源let spotLight = new THREE.SpotLight(0xffffff);spotLight.position.set(-40, 60, -10); // 设置光源的位置信息,分别为x轴,y轴,x轴的位置spotLight.castShadow = true; // 需要由光源投射阴影scene.add(spotLight);// 添加节点,渲染document.getElementById("WebGL-output").appendChild(renderer.domElement);renderer.render( scene, camera );}window.onload = init;</script>
</body>
</html>

更新于2018.03.06,未完待续,后续更新相关方法用法…


甩个支付宝赚钱红包,原创不易,望不吝赐教
这里写图片描述

这篇关于初学WebGL,使用Three.js开发第一个3d场景示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

轻量级在线服装3D定制引擎Myway简介

我写的面向web元宇宙轻量级系列引擎中的另外一个,在线3D定制引擎Myway 3D。 用于在线商品定制,比如个性化服装的定制、日常用品(如杯子)、家装(被套)等物品的在线定制。 特性列表: 可更换衣服款式,按需定制更换模型可实时更改材质颜色可实时添加文本,并可实时修改大小、颜色和角度,支持自定义字体可实时添加艺术图标,并可实时修改大小、颜色和角度,支持翻转、各种对齐可更改衣服图案,按需求定制

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con