3D数学公式

news/2025/3/22 1:26:48

    众所周知,数学中向量、矩阵(变换)、齐次坐标以及四元数的概念和规则是3D游戏编程和计算机图形学的理论基础。下面介绍开发过程中经常用到的一些数学公式。

  •  直线公式

      P(t) = (1-t)P1 + tP2 

    其中,P1和P2表示3D空间的两点向量。t可以是任意实数。P1与P2之间的线段对应于t在0到1之间的值。

  •  点到直线的距离公式
 给定一个点Q,给定的直线由端点P0和方向向量V定义,在计算Q到直线的距离d时,可以通过计算Q-P0相对于直线的垂直分量而得到。如下图:
         

  •  射线公式

    P(t) = P0 + tu

    其中,t的值大于等于0,u表示射线方向向量。实际上,让t为任意实数,就得到三维空间直线。


  •   平面公式

    对应给定的3D点P0和法向量N,那么过P0且与N垂直可以唯一确定一个平面。


    N.(P - P0) = 0

    平面方程通常也可以表示为:

    Ax + By + Cz + d = 0

    其中,A,B,C是法向量N的x,y,z分量,即:

     N.P+d = 0

    法向量经常被规格化单位长度,因为这样等式

    D = N.P +d

    就可以表示平面到任意点P的带符号距离。如果D=0,则表示点P在平面上。如果d>0,则称点P在平面的正侧,因为此时P位于法向量所指的一侧。与些相反,如果d<0,那么P位于平面的负侧。

  • 直线与平面相交公式

  确定直线与平面的交点,是3D引擎中的一种常用计算。特别是在计算多边形裁剪的过程中会大量地用到直线与平面的求交。

        设P(t)=Q+tV表示包含点Q并沿V方向延伸的直线。对于法向量为N并且距原点带符号距离为D的平面,可以通过解方程来确定直线与平面的交点。

        N.P(t) + D = 0 //平面公式

        推导过程就不写了,结果为

         

        把t的值代回直线方程P(t)=Q+tV,就可以求得直线与平面的交点。如果N.V为0,那么直线与平面平行(平面法向量与直线方向向量V垂直)。这种情况下,如果N.Q+D=0,那么直线在平面上;否则,直线与平面没有交点。

  • 三个平面相交公式
空间中的区域经常用由一组平面所围成的凸多边形边界来定义。凸多边形的顶点和棱,可以通过一系列计算得到,在计算过程需要求解一些点,有多组的三个平面在这些点相交。
        设L1=<N1,D1> , L2=<N2,D2>  ,L3=<N3,D3>分别表示三个平面。可以通过求解方程组来得到同时位于三个平面的点Q:
           L1.Q = 0
           L2.Q = 0
           L3.Q = 0
         

   

 平面L1和平面L2的交线可以表示为P(t)=Q+tV。




https://dhexx.cn/news/show-2510082.html

相关文章

合资车、国产车 和 新能源汽车都有哪些品牌?

合资车有哪些品牌? 一、名词解释 顾名思义就是由中方与国外投资方共同成立的项目。中方出资的方式:出让土地厂房使用权、资金;国外投资方出品牌、技术、资金、人才等合资汽车就是上述情况合作情况下的产物。国外提供技术、人才、品牌等在国内组装,但核心技术还是由国外掌握。…

《编写高质量代码:改善c程序代码的125个建议》——建议2-1:char类型变量的值应该限制在signed char与unsigned char的交集范围内...

本节书摘来自华章计算机《编写高质量代码&#xff1a;改善c程序代码的125个建议》一书中的第1章&#xff0c;建议2-1,作者&#xff1a;马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 建议2-1&#xff1a;char类型变量的值应该限制在signed char与unsigned ch…

理解C++ dynamic_cast

理解C dynamic_cast 在面向对象程序设计中&#xff0c;有时我们需要在运行时查询一个对象是否能作为某种多态类型使用。与Java的instanceof&#xff0c;以及C#的as、is运算符类似&#xff0c;C提供了dynamic_cast函数用于动态转型。相比C风格的强制类型转换和C reinterpret_cas…

高通芯片命名规则 kryo 485是个什么样的架构?

kryo 485是个什么样的架构&#xff1f; 参考链接&#xff1a; https://www.zhihu.com/question/333289453/answer/741239321 https://blog.csdn.net/weixin_44124323/article/details/110920987 高通芯片命名规则 骁龙后面的三个数字&#xff0c;例如 865&#xff0c;768 代…

《树莓派Python编程入门与实战(第2版)》——2.4 LXDE图形界面

本节书摘来自异步社区《树莓派Python编程入门与实战&#xff08;第2版&#xff09;》一书中的第2章&#xff0c;第2.4节&#xff0c;作者[美] Richard Blum Christine Bresnahan&#xff0c;陈晓明 马立新 译&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。…

Linux下切换Python版本的几种方法

Linux下切换Python版本的几种方法 参考链接&#xff1a; 1、https://www.cnblogs.com/feynxd/p/11367806.html 2、https://blog.csdn.net/weixin_34355559/article/details/93215997 本篇博文面向Linux用户&#xff0c;在Ubuntu下测试通过 0 为什么需要有两个版本的Python…

软件开发、硬件开发、IPD产品开发 及 工程开发各阶段划分

软件开发、硬件开发、IPD产品开发 及 工程开发各阶段划分 参考链接:https://zhuanlan.zhihu.com/p/427246890 1、软件开发阶段划分: Alpha、Beta、RC、GA/MR1 2、华为硬件开发阶段划分: V1、V2 、V3 、V4 、VN1、VN2 其他硬件开发阶段划分1: ES、 CS、 PP、M…

《Android 平板电脑开发实战详解和典型案例》——2.6节可展开列表—— ExpandableListView...

本节书摘来自异步社区《Android 平板电脑开发实战详解和典型案例》一书中的第2章&#xff0c;第2.6节可展开列表—— ExpandableListView&#xff0c;作者 吴亚峰 , 杜化美 , 索依娜&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.6 可展开列表—— Expand…

嵌套类与局部类

一、嵌套类 在一个类的内部定义另一个类&#xff0c;我们称之为嵌套类&#xff08;nested class&#xff09;&#xff0c;或者嵌套类型。之所以引入这样一个嵌套类&#xff0c;往往是因为外围类需要使用嵌套类对象作为底层实现&#xff0c;并且该嵌套类只用于外围类的实现&…

DBA避坑宝典:Oracle运维中的那些事儿

对于Oracle运维中的那些事儿&#xff0c;我的最终目的&#xff1a;不是比谁更惨&#xff0c;而是能够从中吸取经验和教训。 从我的理解来看&#xff0c;我会从下面的几个方面来进行说明DBA运维中的一些事儿。 每个部分都是非常关键的&#xff0c;缺一不可&#xff0c;而且每一部…