首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 初步介绍微信小程序
02 | 还有哪些其它公司的小程序产品
03 | 小程序的特点及开发能力
04 | 新的一年,微信小程序开放了哪些新功能?
05 | 小程序运行机制简介:从零构建一个Web App需要做哪些事情?
06 | 开发环境配置:创建你的第一个小程序项目
07 | icon组件:关于图标的4个实现方案
08 | progress组件:如何自定义实现一个环形进度条?
09 | rich-text组件:如何单击预览rich-text中的图片并保存?
10 | view容器组件及Flex布局(一):学习容器组件view及其重要属性
11 | view容器组件及Flex布局(二):介绍flex布局中常用的样式及样式值
12 | 可移动容器及可移动区域(一):学习使用movable-view与movable-area组件
13 | 可移动容器及可移动区域(二):如何实现侧滑删除功能
14 | scroll-view介绍:在小程序中如何实现滚动锚定?
15 | scroll-view介绍:如果渲染一个滚动的长列表?
16 | 滚动选择器(一):学习使用选择器组件
17 | 滚动选择器(二):使用两种方式自定义实现省、市、区三级联动的选择器
18 | 滑动选择器表单组件:如何基于wxs自定义一个竖向的slider?
19 | 页面链接组件:如何自定义一个导航栏?
20 | image媒体组件(上):如何实现图片的懒加载?
21 | image媒体组件(下):开发中经常遇到的问题?
22 | 如何实现直播间功能?(一):了解live-pusher、live-player组件的主要属性及使用限制
23 | 如何实现直播间功能?(二):如何开启、使用腾讯云的云直播功能
24 | 如何实现直播间功能?(三):安装与使用ffmepg,及使用ffmpeg进行推拉流验证
25 | 如何实现直播间功能?(四):使用live-pusher、live-player组件在小程序中实现直播功能
26 | 如何实现直播间功能?(五):同层渲染
27 | 如何实现直播间功能?(六):live-pusher、live-player组件在开发中的常见问题
28 | web-view(一):了解session、cookie等相关基本概念
29 | web-view(二):了解常见的四种鉴权方式
30 | web-view(三):如何使用koa框架,及如何进行热加载?
31 | web-view(四):如何在服务器端实现cookie与sesson的生成?
32 | web-view(五):如何将session存储到服务器端,及如何实现token验证?
33 | web-view(六):基于koa中间件,实现微信一键登录的后端接口
34 | web-view(七):实现微信用户一键登录
35 | web-view(八):了解正确的微信登录姿势
36 | web-view(九):web-view组件在开发的常见问题讲解
37 | WebGL介绍(一):了解WebGL相关的基础概念
38 | WebGL介绍(二):如何在小程序中取到WebGL上下文环境对象
39 | WebGL介绍(三):了解WebGL的世界坐标系
40 | WebGL介绍(四):重新认识右手坐标系及如何编写顶点着色器代码
41 | WebGL介绍(五):学习片断着色器编写,了解变量修饰变型uniform与attribute
42 | WebGL介绍(六):了解在WebGL中裁剪空间是如何裁剪出来的
43 | WebGL介绍(七):了解着色器变量值的绑定及三种三角形绘制模式之间的差异
44 | WebGL介绍(八):在着色器中使用共享变量,绘制一个颜色渐变的正方形
45 | WebGL介绍(九):完成动画
46 | WebGL介绍(十):绘制一个旋转的立方体
47 | WebGL介绍(十一):在3D绘制中使用纹理材质
48 | WebGL介绍(十二):如何创建相机、场景及光源
49 | WebGL介绍(十三):创建加载器、渲染器与控制器,完成3D模型文件的加载与展示
50 | 网络接口简介(一):如何使用wx.request接口
51 | 网络接口简介(二):将登录代码模块化封装
52 | 网络接口简介(三):Promise介绍及 6 个常用方法
53 | 网络接口简介(四):Promise三个方法any、all与race的使用介绍
54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块
55 | 网络接口简介(六):关于Page页面隐藏代码执行及Promise对象的catch处理的补充
56 | 网络接口简介(七):学习EventChannel对象
57 | 网络接口简介(八):观察者模式介绍及Event模块实现
58 | 网络接口简介(九):扩展wxp模块的request3方法,实现用户登录的自动融合
59 | tabBar组件(一):系统默认的tabBar组件如何开启及使用
60 | tabBar组件(二):基于系统提供的自定义方式,实现一个tabBar组件
61 | tabBar组件(三):通过自定义组件扩展的方式,给任意组件添加通用方法
62 | 开放接口(一):如何对Page进行全局扩展
63 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 48 | WebGL介绍(十二):如何创建相机、场景及光源 在WebGL这一强大的图形API中,构建三维场景不仅仅是绘制几何体那么简单,它还需要一个完整的视觉系统来模拟现实世界中的观察方式。这一系统通常由相机(Camera)、场景(Scene)和光源(Light)三大核心组件构成。本章将深入探讨如何在WebGL环境中创建这些关键元素,以实现更加逼真和动态的三维视觉效果。 #### 一、WebGL中的相机 在WebGL中,相机代表了观察者的视角,它决定了哪些三维对象会被渲染到屏幕上,以及这些对象如何被透视变形。WebGL本身并不直接提供相机对象,但我们可以通过设置视图矩阵(View Matrix)和投影矩阵(Projection Matrix)来模拟相机的行为。 ##### 1.1 视图矩阵 视图矩阵定义了如何将世界空间中的点转换到观察空间(也称为相机空间或眼空间)。简单来说,就是将整个场景根据相机的位置和朝向进行变换,使得相机位于原点,且面向Z轴负方向。 - **位置(Position)**:相机的位置决定了从哪里观察场景。 - **朝向(Orientation)**:相机的朝向包括其看向的方向(通常指向Z轴负方向)以及绕Y轴的旋转(即“左右看”)和绕X轴的旋转(即“上下看”)。 创建视图矩阵通常涉及计算相机的逆变换矩阵,这可以通过GLM(GLSL Mathematics)库等数学库轻松实现。 ```javascript // 假设cameraPosition为相机位置,cameraTarget为相机看向的点,cameraUp为相机向上的方向 mat4 createViewMatrix(vec3 cameraPosition, vec3 cameraTarget, vec3 cameraUp) { vec3 forward = normalize(vec3(cameraPosition - cameraTarget)); vec3 side = normalize(cross(cameraUp, forward)); vec3 up = cross(forward, side); return mat4( vec4(side.x, up.x, -forward.x, 0.0), vec4(side.y, up.y, -forward.y, 0.0), vec4(side.z, up.z, -forward.z, 0.0), vec4(-dot(side, cameraPosition), -dot(up, cameraPosition), dot(forward, cameraPosition), 1.0) ); } ``` ##### 1.2 投影矩阵 投影矩阵决定了如何将观察空间中的点转换到裁剪空间,并最终映射到屏幕上的二维坐标。WebGL中常用的投影方式有两种:正交投影(Orthographic Projection)和透视投影(Perspective Projection)。 - **正交投影**:保持物体大小不变,常用于绘制二维图像或精确比例的三维场景。 - **透视投影**:模拟人眼观察物体的近大远小效果,使场景更具立体感。 透视投影矩阵的创建相对复杂,需要指定视场角(Field of View, FOV)、纵横比(Aspect Ratio)、近裁剪面(Near Clipping Plane)和远裁剪面(Far Clipping Plane)等参数。 ```javascript // 假设fovY为视场角(Y轴),aspectRatio为纵横比,near和far为近远裁剪面 mat4 createPerspectiveMatrix(float fovY, float aspectRatio, float near, float far) { float tanHalfFovY = tan(radians(fovY) / 2.0); mat4 matrix = mat4(0); matrix[0][0] = 1.0 / (aspectRatio * tanHalfFovY); matrix[1][1] = 1.0 / tanHalfFovY; matrix[2][2] = -(far + near) / (far - near); matrix[2][3] = -1.0; matrix[3][2] = -(2.0 * far * near) / (far - near); matrix[3][3] = 0.0; return matrix; } ``` #### 二、WebGL中的场景 在WebGL中,场景通常指的是一组需要被渲染的三维对象和它们之间的空间关系。虽然WebGL本身不直接管理场景的概念,但开发者可以通过组织和管理这些对象及其属性(如位置、大小、材质等)来构建场景。 ##### 2.1 对象管理 可以使用JavaScript对象或类来表示场景中的每一个三维对象,包括其几何体、材质和变换矩阵等信息。通过遍历这些对象,并应用相应的视图矩阵和投影矩阵,可以将它们渲染到屏幕上。 ```javascript class SceneObject { constructor(geometry, material, position, rotation, scale) { this.geometry = geometry; this.material = material; this.modelMatrix = mat4.create(); mat4.translate(this.modelMatrix, this.modelMatrix, position); mat4.rotateX(this.modelMatrix, this.modelMatrix, rotation.x); mat4.rotateY(this.modelMatrix, this.modelMatrix, rotation.y); mat4.rotateZ(this.modelMatrix, this.modelMatrix, rotation.z); mat4.scale(this.modelMatrix, this.modelMatrix, scale); } // 渲染方法,需结合视图矩阵和投影矩阵 render(viewMatrix, projectionMatrix) { // 计算最终变换矩阵 let finalMatrix = mat4.create(); mat4.multiply(finalMatrix, projectionMatrix, viewMatrix); mat4.multiply(finalMatrix, finalMatrix, this.modelMatrix); // 使用finalMatrix和geometry, material进行渲染... } } ``` #### 三、WebGL中的光源 光源是影响场景视觉效果的关键因素,它决定了场景中物体的明暗、色彩和阴影等特性。WebGL通过光照模型来模拟光源对物体的影响,常见的光照模型包括环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面反射光(Specular Light)等。 ##### 3.1 光源类型 - **点光源(Point Light)**:从一个点向四周发射光线,如灯泡。 - **平行光(Directional Light)**:从一个方向平行地照射所有物体,如太阳光。 - **聚光灯(Spotlight)**:类似手电筒,从一个点发出,但光线被限制在一个锥形区域内。 ##### 3.2 光照计算 光照计算通常涉及计算光源对物体每个顶点的光照贡献,并将这些贡献合并到顶点颜色中。这可以通过在顶点着色器中实现光照方程来完成。 ```glsl // 假设ambientColor为环境光颜色,diffuseColor为漫反射光颜色,specularColor为镜面反射光颜色 // lightPosition为世界空间中的光源位置,viewPosition为世界空间中的观察点位置 // normal为顶点的法线向量,vertexPosition为顶点的世界空间位置 vec3 calculateLight(vec3 ambientColor, vec3 diffuseColor, vec3 specularColor, vec3 lightPosition, vec3 viewPosition, vec3 normal, vec3 vertexPosition) { vec3 lightDir = normalize(lightPosition - vertexPosition); vec3 viewDir = normalize(viewPosition - vertexPosition); vec3 reflectDir = reflect(-lightDir, normal); float diffuseFactor = max(dot(normal, lightDir), 0.0); vec3 diffuse = diffuseColor * diffuseFactor; float specularFactor = 0.0; if (dot(normal, lightDir) > 0.0) { float specPower = 32.0; // 镜面高光强度 specularFactor = pow(max(dot(viewDir, reflectDir), 0.0), specPower); } vec3 specular = specularColor * specularFactor; vec3 ambient = ambientColor; return ambient + diffuse + specular; } ``` #### 结语 通过创建相机、场景和光源,WebGL能够模拟出复杂而逼真的三维世界。本章详细介绍了如何在WebGL中设置相机的位置和朝向、构建透视投影矩阵、管理场景中的对象,以及实现基本的光照计算。这些技术是构建任何三维图形应用的基础,掌握了它们,你将能够进一步探索WebGL的无限可能。
上一篇:
47 | WebGL介绍(十一):在3D绘制中使用纹理材质
下一篇:
49 | WebGL介绍(十三):创建加载器、渲染器与控制器,完成3D模型文件的加载与展示
该分类下的相关小册推荐:
微信小程序与云开发(下)
微信小程序全栈开发实战(下)
微信小程序与云开发(中)
微信小程序全栈开发实战(中)
微信小程序与云开发(上)
微信小程序底层框架实现原理