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

【图形学】TA之路-向量

向量

向量 是一个有大小和方向的数学对象。在三维空间中,向量通常表示为 (v_x, v_y, v_z)

基本操作

  1. 加法

    a + b = (a_x + b_x, a_y + b_y, a_z + b_z)
    
  2. 减法

    a - b = (a_x - b_x, a_y - b_y, a_z - b_z)
    
  3. 标量乘法

    k * v = (k * v_x, k * v_y, k * v_z)
    
  4. 模(长度)

    ||v|| = sqrt(v_x^2 + v_y^2 + v_z^2)
    
  5. 归一化

    Normalized(v) = v / ||v||
    

点乘(Dot Product)

点乘 计算两个向量的内积,结果是一个标量。公式为:

a · b = a_x * b_x + a_y * b_y + a_z * b_z

应用

  1. 光照计算

    Intensity = max(0, N · L)
    

    其中 N 是法线向量,L 是光源方向向量。

  2. 夹角计算

    cos(θ) = (a · b) / (||a|| * ||b||)
    
  3. 投影

    Projection of a onto b = (a · b) / ||b||


叉乘(Cross Product)

叉乘 计算两个向量的外积,结果是一个垂直于原来的两个向量的向量。公式为:

a × b = (a_y * b_z - a_z * b_y, a_z * b_x - a_x * b_z, a_x * b_y - a_y * b_x)

应用

  1. 法线计算

    N = A × B
    
  2. 旋转: 叉乘用于计算物体旋转时的旋转轴和角度。

  3. 计算平行四边形面积

    Area = ||a × b||
    

在 Unity 中的应用

  1. 光照计算: 使用点乘计算光照强度,特别是在实现漫反射和镜面反射时。

  2. 法线计算: 使用叉乘计算物体表面的法线向量,用于光照和碰撞检测。

  3. 物体移动和旋转: 使用向量操作计算物体的移动、旋转和缩放。

  4. 碰撞检测: 使用向量来计算物体间的距离和相对位置,判断是否发生碰撞。


图形学中的应用

  1. 光照模型: 点乘用于计算漫反射光照强度,叉乘用于计算法线向量。

  2. 计算视角: 通过点乘计算视角的大小,用于相机视角和景深效果。

  3. 变换矩阵: 向量运算用于计算变换矩阵,进行模型、视图和投影的变换。

  4. 物体表面属性: 使用法线向量和光源方向向量进行阴影计算和表面细节渲染。

  5. 基于Unity:源码解析,unity进行了封装,大概是这意思
     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;namespace Ethan
    {public struct Vector3{public float x, y, z;public Vector3(float x, float y, float z){this.x = x;this.y = y;this.z = z;}/// <summary>/// 两个向量之和 /// 应用:向前位移、力的合成、可取/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public static Vector3 operator +(Vector3 a, Vector3 b){return new Vector3(a.x + b.y, a.y + b.y, a.z + b.z);}/// <summary>/// 两个向量之差/// 应用:向后位移、计算反作用力/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public static Vector3 operator -(Vector3 a, Vector3 b){return new Vector3(a.x - b.y, a.y - b.y, a.z - b.z);}/// <summary>/// 计算向量和标量的乘法/// 应用:放大或缩小物体的模型、位移计算、计算力、加速度等物理量时,经常需要将向量与标量相乘/// </summary>/// <param name="k"></param>/// <param name="v"></param>/// <returns></returns>public static Vector3 operator *(Vector3 v, float k){return new Vector3(k * v.x, k * v.y, k * v.z);}/// <summary>/// 计算两点之间的距离 /// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public static float Disance(Vector3 a, Vector3 b){return Mathf.Sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));}/// <summary>/// 计算向量-标准化(求模)/// 应用:主要用来计算向量的长度或大小/// </summary>public float Magnitude{get { return Mathf.Sqrt(x * x + y * y + z * z); }}/// <summary>/// 向量 归一化/// 将向量转换为单位向量(长度为 1 的向量),保留方向但调整大小/// 应用:单位向量在方向计算、光照计算、法线计算/// </summary>public Vector3 Normalized{get{float mag = this.Magnitude;if (mag > 0){return this * (1 / mag);}return new Vector3(0, 0, 0); // 返回一个零向量,如果原向量的长度为零}}/// <summary>/// 点乘/// 应用:光照计算、背面裁剪、计算投影/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public static float Dot(Vector3 a, Vector3 b){return a.x * b.x + a.y * b.y + a.z * b.z;}/// <summary>/// 叉乘/// 应用:/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public static Vector3 Cross(Vector3 a, Vector3 b){return new Vector3(a.y * b.z - a.z * b.y,a.z * b.x - a.x * b.z,a.x * b.y - a.y * b.x);}}
    }

相关文章:

【图形学】TA之路-向量

向量 向量 是一个有大小和方向的数学对象。在三维空间中&#xff0c;向量通常表示为 (v_x, v_y, v_z)。 基本操作 加法&#xff1a; a b (a_x b_x, a_y b_y, a_z b_z)减法&#xff1a; a - b (a_x - b_x, a_y - b_y, a_z - b_z)标量乘法&#xff1a; k * v (k * v_x, …...

[flink]部署模式

部署模式 在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。 Flink为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff1a;会话模式&#xff08;Session Mode&#xff09;、单作业模式&#xff08;Per-Job Mode&…...

为什么不用postman做自动化

面试的时候被问到&#xff1a;为什么不用postman做自动化 打开postman&#xff0c;看到用例集管理、API 管理、环境管理这三个功能&#xff0c;用户体验感算得上品牌等级了 为什么不用呢&#xff0c;文心一言给了一些答案 不适合大规模自动化测试&#xff1a;Postman 主要是为…...

一、Matlab基础

文章目录 一、Matlab界面二、Matlab窗口常用命令三、Matlab的数据类型3.1 数值类型3.2 字符和字符串3.3 逻辑类型3.4 函数句柄3.5 结构类型3.6 细胞数组 四、Matlab的运算符4.1 算术运算符4.2 关系运算符4.3 逻辑运算4.4 运算符优先级 五、Matlab的矩阵5.1 矩阵的建立5.2 矩阵的…...

执行java -jar命令,显示jar中没有主清单属性

在Java中&#xff0c;一个"主清单属性"&#xff08;Main-Class attribute&#xff09;是指定JAR文件中包含的应用程序入口点&#xff0c;即包含main方法的类的完全限定名。如果你尝试运行一个没有主清单属性的JAR文件&#xff0c;你可能会看到错误消息&#xff0c;如…...

【C++进阶】红黑树

目录 什么是红黑树&#xff1f;红黑树红黑树的性质 定义红黑树红黑树的操作insertinorderfindheightsize构造函数析构函数赋值拷贝判断红黑树 全部代码总结 什么是红黑树&#xff1f; 红黑树 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff…...

linux使用ssh连接一直弹出密码框问题

1.查看ssh服务的状态 输入以下命令&#xff1a; sudo service sshd status 小编已经安装了。 如果出现 Loaded: error (Reason: No such file or directory) 提示的话&#xff0c;说名没有安装ssh服务&#xff0c;按照第二步&#xff1a;安装ssh服务。 如果出现 Active: in…...

Python 3 数据结构

Python 3 数据结构 引言 Python 是一种高级编程语言&#xff0c;因其简洁明了的语法和强大的功能而广受欢迎。在 Python 中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;对于编写高效和可维护的代码至关重要。本文将深入探讨 Python 3 中的主要数据结构&#xff0…...

【开源社区】Elasticsearch(ES)中空值字段 null_value 及通过exists查找非空文档

文章目录 0、声明1、问题描述2、问题剖析2.1 NULL或者空值类型有哪些2.2 案例讲解&#xff1a;尝试检索值为 null 的字段2.3 解决思路 3、使用 null_value 的诸多坑&#xff08;避免生产事故&#xff09;3.1 null_value 替换的是索引&#xff0c;并不会直接替换源数据3.2 不支持…...

JavaDS —— 位图(BitSet)与 布隆过滤器

位图 引入问题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 首先要注意 40 亿个数据如果使用 整型&#xff08;int) 来存放的话&#xff0c;就是要 40 亿个整型&#xff0c;一个整型有…...

如何确保场外个股期权交易的安全?

如何确保场外个股期权交易的安全&#xff1f;投资者可以采取以下措施&#xff0c;以提高交易的安全性和减少风险&#xff1a; 增强知识储备&#xff1a;深入学习期权的基础知识&#xff0c;包括不同类型的期权、它们的权利和义务、定价方式以及风险特性&#xff0c;从而提升自…...

第2章:LabVIEW FPGA未来发展方向《LabVIEW ZYNQ FPGA宝典》

2.1&#xff1a;NI的LabVIEW FPGA未来战略部署 在展望NI公司的LabVIEW FPGA技术未来发展趋势之前&#xff0c;让我们先来回顾一下LabVIEW与FPGA的技术发展历程&#xff0c;如图2-1所示。可以看出&#xff0c;NI公司的LabVIEW FPGA软件一方面是跟随Xilinx最新的FPGA硬件可持续发…...

苹果电脑维护工具:CleanMyMac X让你的Mac焕发新生!

在我们的数字生活中&#xff0c;苹果电脑&#xff08;Mac&#xff09;已成为不可或缺的一部分&#xff0c;无论是为工作披星戴月&#xff0c;还是为娱乐畅游云端。但是&#xff0c;就像任何长时间运行的机器一样&#xff0c;Mac也可能会因为积累的文件和不必要的数据而开始变慢…...

MySQL2 DML数据操纵语言和SQL约束

DML和SQL约束 SQL-DML1.添加数据2.修改数据3.删除 TRUNCATE和DELETE的区别&#xff1a;SQL-约束Primary Key创建主键约束单列主键联合主键**验证主键约束**删除主键约束设置主键自增AUTO_INCREMENTdelete和truncate删除后&#xff0c;主键的自增 SQL-唯一约束UNIQUE创建唯一约束…...

Ubuntu 20.04 中安装 Nginx (通过传包编译的方式)、开启关闭防火墙、开放端口号

文章目录 前言一、安装包下载二、上传服务器并解压缩三、依赖配置安装四、生成编译脚本五、编译六、查看是否编译完成七、开始安装八、查看是否安装成功九、设置为开机自启动 前言 参考大佬文章并在基础上做了点修改&#xff0c;发篇文章记录下 防止下次遇到。 参考文章&#…...

解决no main manifest attribute错误

文章目录 0. 背景1. java程序如何运行2. jar是什么3. java -jar test-1.0-SNAPSHOT.jar&#xff1a;4. 添加执行入口 0. 背景 在开发Spring boot项目的时候&#xff0c;有时候会需要使用java -jar test-1.0-SNAPSHOT.jar指令来运行开发的java应用&#xff0c;但是很不幸&#…...

002 | 常见的金融量化指标计算

金融量化指标 在金融量化分析中&#xff0c;常用的指标可以帮助我们判断市场走势、评估风险和收益&#xff0c;以及构建交易策略。以下是一些常见的金融量化指标及其计算方法的详细教程&#xff0c;包括公式与Python代码实现。 1. 移动平均线&#xff08;Moving Average, MA&…...

Web Vitals:提升用户体验的关键指标

Web Vitals 是 Google 提出的一套核心网页性能指标&#xff0c;旨在帮助开发者理解和优化网站的用户体验。这些指标分为核心 Web Vitals 和附加 Web Vitals&#xff0c;涵盖了加载性能、交互性和视觉稳定性三个方面。以下是详细的介绍和如何使用 Web Vitals 来优化你的网站。 …...

c#中的约束、TimeSpan、defult、operator

c#中的约束 在C#中&#xff0c;约束&#xff08;Constraints&#xff09;用于限制泛型类型参数的类型&#xff0c;以确保泛型类型或方法在编译时能够满足特定的要求。约束允许开发者指定泛型类型参数必须满足的条件&#xff0c;比如实现特定的接口或继承自特定的类。以下是一些…...

挖矿木马攻破了服务器

最近被国外的挖矿木马攻破了服务器 根据非法登录&#xff0c;用 #last指令查看登录ip 首先删掉登录主机 #kill -9 pts/0 第二步 #top 看看什么占用cpu高 第三步杀死狂刷CPU的服务 过一分钟后&#xff0c;服务又开始狂刷cpu。 第四步根据pid查到服务地址 #systemctl status…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...