当前位置: 首页 > article >正文

WebGL 3D基础

1. 归一化函数

对一个向量进行归一化处理,即调整向量的模长(长度)为1,同时保持其方向不变。

// 归一化函数
function normalized(arr) {
    let sum = 0;
    for (let i = 0; i < arr.length; i++) {
        sum += arr[i] * arr[i];
    }
    const middle = Math.sqrt(sum);
    for (let i = 0; i < arr.length; i++) {
        arr[i] = arr[i] / middle;
    }
}

const vector = [3, 4]; // 原始向量
normalized(vector);
console.log(vector); // 输出:[0.6, 0.8],归一化后的向量

2. 叉积

叉积常被用来计算求两个平面的法向量,这个结果向量通常用于确定法线(normal)方向,比如在计算光照效果时。

// 叉积函数,获取法向量,固定写法
function cross(a, b) {
    return new Float32Array([
        a[1] * b[2] - a[2] * b[1], //这是叉积结果向量的x分量。
        a[2] * b[0] - a[0] * b[2], //这是叉积结果向量的y分量。
        a[0] * b[1] - a[1] * b[0], //这是叉积结果向量的z分量。
    ])
}

const a = [1, 2, 3];
const b = [4, 5, 6];
console.log(cross(a, b)); // 结果为[-3, 6, -3]

3. 点积

求某点在x,y,z轴上的投影长度

// 点积函数 获取投影长度
function dot(a, b) {
    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
}

const a = [1, 2, 3];
const b = [4, 5, 6];
console.log(dot(a, b)); // 结果为32

4. 向量差

向量差用来获取视点到目标点之间的向量。

// 向量差
function minus(a, b) {
    return new Float32Array([
        a[0] - b[0],
        a[1] - b[1],
        a[2] - b[2],
    ])
}

const a = [1.0, 2.0, 3.0]
const b = [4.0, 5.0, 6.0]
console.log(minus(a, b)) // 结果为[-3.0, -3.0, -3.0]

5. 获取视图矩阵

基于给定点的视点、注视点和上方向向量来确定视图的方向,并生成相应的矩阵。

// 视图矩阵获取
function getViewMatrix(eyex, eyey, eyez, lookAtx, lookAty, lookAtz, upx, upy, upz) {
    // 视点
    const eye = new Float32Array([eyex, eyey, eyez])
    // 目标点
    const lookAt = new Float32Array([lookAtx, lookAty, lookAtz])
    // 上方向
    const up = new Float32Array([upx, upy, upz])
    // 确定z轴
    const z = minus(eye, lookAt)
    // 确定x轴
    normalized(z)
    normalized(up)
    const x = cross(z, up)
    // 确定y轴
    normalized(x)
    const y = cross(x, z)

    return new Float32Array([
        x[0], y[0], z[0], 0,
        x[1], y[1], z[1], 0,
        x[2], y[2], z[2], 0,
        -dot(x, eye), -dot(y, eye), -dot(z, eye), 1
    ])
}


http://www.kler.cn/news/365914.html

相关文章:

  • <项目代码>YOLOv8煤矿输送带异物识别<目标检测>
  • Java应用程序的测试覆盖率之设计与实现(三)-- jacoco cli 客户端
  • Python游戏开发超详细第二课/一个小游戏等制作过程(入门级篇共2节)
  • 合并数组的两种常用方法比较
  • 【mysql】转义字符反斜杠,正则表达式
  • 数字图像处理的概念(一)
  • 常见Linux命令笔记
  • 【python爬虫】request发请求时需要携带cookies请求举例
  • 计算机网络:网络层 —— IPv4 协议的表示方法及其编址方法
  • 定位基站共线
  • 【卡尔曼滤波】观测模型包含输入的线性卡尔曼滤波
  • C++的汉诺塔
  • 【C语言教程】【嵌入式编程】(五)驱动开发实战(六)高级实践项目(七)附录
  • 10分钟使用Strapi(无头CMS)生成基于Node.js的API接口,告别繁琐开发,保姆级教程,持续更新中。
  • uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件
  • Go语言基础教程:递归
  • SpringBoot的自动装配原理详解
  • 防火墙是什么?科普为保护应用层而生的可靠工具
  • 排序算法 —— 冒泡排序
  • Linux文件目录结构
  • 【STM32 Blue Pill编程实例】-直接内存访问 (DMA)使用
  • 计算机毕业设计Spark+大模型动漫推荐系统 动漫视频推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据
  • 蓝桥杯模块(四)数码管动态显示
  • C++ list类
  • 提升网络安全防御有效性,服务器DDoS防御软件解读
  • Jmeter启动默认设置为中文