四元数背景知识补充

网易互娱游戏研发笔试复盘:题型考点与备考策略 在游戏研发岗位的求职过程中,笔试环节常常是检验候选人综合技术素养的关键关卡。与通用后端开发不同,游戏研发笔试更强调数据结构、算法、计算机图形学以及游戏系统设计等领域的交叉运用。例如,地图寻路问题背后是广度优先搜索(BFS)的核心原理,装备强化系统则可通过带权并查集高效建模,而任务规划问题往往依赖动态规划与拓扑排序的配合。除编程题外,图形学基础如渲染管线、深度缓冲、四元数,以及操作系统与网络知识同样高频出现。理解这些技术概念的内在逻辑与工程价值,有助于在实际场景中快速抽象问题并设计合理方案。本文以网易互娱校招 阅读详情

一、定义

四元数的结构如下所示:
q = a + b   i + c   j + d   k ,   q ∈ H ,   a , b , c , d ∈ R \mathbf q = a + b\,\mathbf i + c\,\mathbf j + d\,\mathbf k,\, \mathbf q \in \mathbb{H}, \, a,b,c,d\in \mathbb{R} q=a+bi+cj+dk,q∈H,a,b,c,d∈R

用 H \mathbb H H 表示四元数是为了纪念发明者 Hamilton。

四元数是简单的超复数,可以实际上理解为四维的复数—— a a a 是实部; b   i + c   j + d   k b\,\mathbf i + c\,\mathbf j + d\,\mathbf k bi+cj+dk 是虚部,满足如下关系式:
i 2 = j 2 = k 2 = − 1   i j = k ,   j k = i ,   k i = j j i = − k ,   k j = − i ,   i k = − j \mathbf i^2 = \mathbf j^2 = \mathbf k^2 = -1 \\ ~\\ \mathbf {ij} = \mathbf k,\, \mathbf {jk} = \mathbf i,\, \mathbf {ki} = \mathbf j \\ \mathbf {ji} = -\mathbf k,\, \mathbf {kj} = -\mathbf i,\, \mathbf {ik} = -\mathbf j \\ i2=j2=k2=−1 ij=k,jk=i,ki=jji=−k,kj=−i,ik=−j

可以发现,虚数单位之间存在特殊的 -1 等式,比如用 i j \mathbf {ij} ij 替换 k 2 \mathbf k ^2 k2 中的一个 k \mathbf k k。如此,我们能得到三个特殊的 -1 等式:
i j k = j k i = k i j = − 1 \mathbf {ijk} = \mathbf {jki} = \mathbf {kij} = -1 ijk=jki=kij=−1

对于 i , j , k \mathbf i ,\mathbf j ,\mathbf k i,j,k,代数上它们是彼此独立的虚数单位,几何上可以理解为不同方向上的旋转。详情可见百度词条“四元数”。

二、模长(范数 Norm)

与复数相同,四元数也可以看做向量形式:
q = ( a b c d ) T \mathbf q = \begin{pmatrix} a & b & c & d \end{pmatrix}^T q=(a​b​c​d​)T

四元数的标准基是 { 1 ,   i ,   j ,   k } \begin{Bmatrix} 1, \,\mathbf i,\, \mathbf j,\, \mathbf k \end{Bmatrix} {1,i,j,k​}。如果仅是为了像复数那样按虚实部分开,还有一种更简洁的简记形式:
q = [ a ,   v ] ,   v = ( b c d ) T \mathbf q = \begin{bmatrix} a,\, \mathbf v \end{bmatrix},\, \mathbf v = \begin{pmatrix} b & c & d \end{pmatrix}^T q=[a,v​],v=(b​c​d​)T

于是,可以像定义向量模长(2-范数)那样定义四元数模长:
∥ q ∥ = a 2 + ∥ v ∥ 2 = a 2 + v ⋅ v = a 2 + b 2 + c 2 + d 2 \begin{aligned} \Vert \mathbf q \Vert &= \sqrt{a^2 + \Vert \mathbf v \Vert^2} = \sqrt{a^2 + \mathbf v \cdot \mathbf v} \\ &= \sqrt{a^2 + b^2 + c^2 + d^2} \end{aligned} ∥q∥​=a2+∥v∥2 ​=a2+v⋅v ​=a2+b2+c2+d2 ​​

三、四元数乘法——哈密顿积

四元数乘法(哈密顿积)与复数乘法有所不同。虽然四元数的实部依旧可以视作是标量的形式,但因为虚部从可以视作标量的单个单位、转为了带有方向意义的多个单位,故四元数虚部乘法不再遵守一般的交换律,这也导致四元数乘法如同矩阵乘法,存在左乘和右乘的区别。

取四元数 q 1 = [ a 1 ,   v 1 ] = a 1 + b 1   i + c 1   j + d 1   k ,   q 2 = [ a 2 ,   v 2 ] = a 2 + b 2   i + c 2   j + d 2   k \mathbf{q_1} = \begin{bmatrix} a_1,\, \mathbf v_1 \end{bmatrix} = a_1 + b_1\,\mathbf i + c_1\,\mathbf j + d_1\,\mathbf k,\,\mathbf{q_2} = \begin{bmatrix} a_2,\, \mathbf v_2 \end{bmatrix} = a_2 + b_2\,\mathbf i + c_2\,\mathbf j + d_2\,\mathbf k q1​=[a1​,v1​​]=a1​+b1​i+c1​j+d1​k,q2​=[a2​,v2​​]=a2​+b2​i+c2​j+d2​k,它们的哈密顿积记作:
q 1 ⊗ q 2 = ( a 1 + b 1   i + c 1   j + d 1   k ) ( a 2 + b 2   i + c 2   j + d 2   k ) = a 1 a 2 + a 1 ( b 2   i + c 2   j + d 2   k ) + a 2 ( b 1   i + c 1   j + d 1   k ) + ( b 1   i + c 1   j + d 1   k ) ( b 2   i + c 2   j + d 2   k ) \begin{aligned} \mathbf{q_1} \otimes \mathbf{q_2} =& \left(a_1 + b_1\,\mathbf i + c_1\,\mathbf j + d_1\,\mathbf k\right) \left(a_2 + b_2\,\mathbf i + c_2\,\mathbf j + d_2\,\mathbf k\right) \\ =& a_1a_2 + a_1\left(b_2\,\mathbf i + c_2\,\mathbf j + d_2\,\mathbf k\right) + a_2\left(b_1\,\mathbf i + c_1\,\mathbf j + d_1\,\mathbf k\right) +\\ & \left(b_1\,\mathbf i + c_1\,\mathbf j + d_1\,\mathbf k\right) \left(b_2\,\mathbf i + c_2\,\mathbf j + d_2\,\mathbf k\right) \end{aligned} q1​⊗q2​==​(a1​+b1​i+c1​j+d1​k)(a2​+b2​i+c2​j+d2​k)a1​a2​+a1​(b2​i+c2​j+d2​k)+a2​(b1​i+c1​j+d1​k)+(b1​i+c1​j+d1​k)(b2​i+c2​j+d2​k)​

这里为了简便运算,我推荐大家拆成两部分来看。首先是比较简单的:
P 1 ≔ a 1 a 2 + a 1 ( b 2   i + c 2   j + d 2   k ) + a 2 ( b 1   i + c 1   j + d 1   k ) = a 1 a 2 + a 1 v 2 + a 2 v 1 \begin{aligned} P_1 \coloneqq& a_1a_2 + a_1\left(b_2\,\mathbf i + c_2\,\mathbf j + d_2\,\mathbf k\right) + a_2\left(b_1\,\mathbf i + c_1\,\mathbf j + d_1\,\mathbf k\right) \\ =& a_1a_2 + a_1 \mathbf{v_2} + a_2\mathbf{v_1} \end{aligned} P1​:==​a1​a2​+a1​(b2​i+c2​j+d2​k)+a2​(b1​i+c1​j+d1​k)a1​a2​+a1​v2​+a2​v1​​

P 1 P_1 P1​ 部分是显然的标量运算,现在来关注比较复杂的 P 2 P_2 P2​:
P 2 ≔ ( b 1   i + c 1   j + d 1   k ) ( b 2   i + c 2   j + d 2   k ) P_2 \coloneqq \left(b_1\,\mathbf i + c_1\,\mathbf j + d_1\,\mathbf k\right) \left(b_2\,\mathbf i + c_2\,\mathbf j + d_2\,\mathbf k\right) P2​:=(b1​i+c1​j+d1​k)(b2​i+c2​j+d2​k)

这部分不能只是简单地理解为向量 内积 或 外积(格拉斯曼积 Graßmann Product),接下来我们来计算 P 2 P_2 P2​:
P 2 = ( b 1 b 2 i 2 + c 1 c 2 j 2 + d 1 d 2 k 2 ) + [ ( c 1 d 2 j k + d 1 c 2 k j ) + ( b 1 d 2 i k + d 1 b 2 k i ) + ( b 1 c 2 i j + c 1 b 2 j i ) ] = − v 1 ⋅ v 2 + v 1 × v 2 \begin{aligned} P_2 =& \left( b_1b_2\mathbf i^2 + c_1c_2\mathbf j^2 + d_1d_2\mathbf k^2 \right) + \\ &\left[(c_1d_2\mathbf{jk} + d_1c_2\mathbf{kj}) + (b_1d_2\mathbf{ik} + d_1b_2\mathbf{ki}) + (b_1c_2\mathbf{ij} + c_1b_2\mathbf{ji}) \right] \\ =& - \mathbf{v_1}\cdot \mathbf{v_2} + \mathbf{v_1}\times \mathbf{v_2} \end{aligned} P2​==​(b1​b2​i2+c1​c2​j2+d1​d2​k2)+[(c1​d2​jk+d1​c2​kj)+(b1​d2​ik+d1​b2​ki)+(b1​c2​ij+c1​b2​ji)]−v1​⋅v2​+v1​×v2​​

从而,我们能总结四元数的代数运算规律:
q 1 ⊗ q 2 = ( a 1 a 2 − v 1 ⋅ v 2 ) + ( a 2 v 1 + a 1 v 2 + v 1 × v 2 ) = [ a 1 a 2 − v 1 ⋅ v 2 ,   a 2 v 1 + a 1 v 2 + v 1 × v 2 ] \begin{aligned} \mathbf{q_1} \otimes \mathbf{q_2} =& \left( a_1a_2 - \mathbf{v_1}\cdot \mathbf{v_2} \right) + \left( a_2\mathbf{v_1} + a_1 \mathbf{v_2} + \mathbf{v_1}\times \mathbf{v_2} \right) \\ =& \begin{bmatrix} a_1a_2 - \mathbf{v_1}\cdot \mathbf{v_2},\, a_2\mathbf{v_1} + a_1 \mathbf{v_2} + \mathbf{v_1}\times \mathbf{v_2} \end{bmatrix} \end{aligned} q1​⊗q2​==​(a1​a2​−v1​⋅v2​)+(a2​v1​+a1​v2​+v1​×v2​)[a1​a2​−v1​⋅v2​,a2​v1​+a1​v2​+v1​×v2​​]​

当然,四元数的运算也能视作矩阵运算,对任意四元数 q = [ a ,   v ] \mathbf q = \begin{bmatrix} a,\, \mathbf v \end{bmatrix} q=[a,v​],记被乘四元数 r = [ b ,   u ] \mathbf r = \begin{bmatrix} b,\, \mathbf u \end{bmatrix} r=[b,u​],有
q ⊗ r = ( a − v T v a I + [ v ] × ) ( b u ) \begin{aligned} \mathbf{q} \otimes \mathbf{r} =& \begin{pmatrix} a & -\mathbf v^T \\ \mathbf v & a\mathbf I +[\mathbf v]_\times \end{pmatrix} \begin{pmatrix} b \\ \mathbf u \end{pmatrix} \end{aligned} q⊗r=​(av​−vTaI+[v]×​​)(bu​)​

一般,哈密顿积中间的 ⊗ \otimes ⊗ 符号可省略进行简记。

四元数集构成了一个‌非交换的可除代数‌(即除法环),这是历史上第一个被发现的此类代数结构,打破了人们对代数必须满足乘法交换律的古老信念 。‌‌‌虽然不再满足乘法的交换律,但其依然满足结合律与分配律。

四、纯四元数

如果四元数 q \mathbf q q 的实部为 0,即:
[ 0 ,   v ] \begin{bmatrix} 0,\, \mathbf v \end{bmatrix} [0,v​]

则称 q \mathbf q q 为纯四元数。任意的三维向量 v \mathbf v v,其坐标都可以看做纯四元数,我们用 v v v 来代表 v \mathbf v v 对应的纯四元数。对于两个纯四元数 v = [ 0 ,   v ] ,   u = [ 0 ,   u ] v = \begin{bmatrix} 0,\, \mathbf v \end{bmatrix},\, u = \begin{bmatrix} 0,\, \mathbf u \end{bmatrix} v=[0,v​],u=[0,u​],有
v   u = [ − v ⋅ u ,   v × u ]   u   v = [ − u ⋅ v ,   u × v ] v\, u = \begin{bmatrix} -\mathbf{v}\cdot \mathbf{u},\, \mathbf{v}\times \mathbf{u} \end{bmatrix} \\ ~\\ u\, v = \begin{bmatrix} -\mathbf{u}\cdot \mathbf{v},\, \mathbf{u}\times \mathbf{v} \end{bmatrix} vu=[−v⋅u,v×u​] uv=[−u⋅v,u×v​]

显然,这两个结果是实部相同,虚部方向相反的两个四元数(下一节,我们就会提到,这两个结果是互为共轭的)。进一步说明,四元数的乘法不满足一般的交换律。

五、共轭和逆

类似复数,我们记四元数 q = [ a ,   v ] \mathbf q = \begin{bmatrix} a,\, \mathbf v \end{bmatrix} q=[a,v​] 的共轭为 q ∗ = [ a ,   − v ] \mathbf{q}^* = \begin{bmatrix} a,\, -\mathbf v \end{bmatrix} q∗=[a,−v​],有
q   q ∗ = [ a 2 + v ⋅ v ,   0 ] = a 2 + v ⋅ v = ∥ q ∥ 2 = ∥ q ∗ ∥ 2 = q ∗   q \begin{aligned} \mathbf q \, \mathbf q^* =& \begin{bmatrix} a^2 + \mathbf v\cdot\mathbf v,\, \mathbf 0 \end{bmatrix} = a^2 + \mathbf v\cdot\mathbf v \\ =& \Vert \mathbf q \Vert^2 = \Vert \mathbf q^* \Vert^2 \\ =& \mathbf q^* \, \mathbf q \end{aligned} qq∗===​[a2+v⋅v,0​]=a2+v⋅v∥q∥2=∥q∗∥2q∗q​

显然地,共轭除了可交换外,也满足性质 ( q ∗ ) ∗ = q (\mathbf q^*)^* = \mathbf q (q∗)∗=q。

因为四元数的代数系统没有特定的除法运算,故当两个四元数 p , q \mathbf{p,q} p,q,需要进行除法运算,像是 p / q \mathbf p /\mathbf q p/q,我们会定义为 p   q − 1 \mathbf p\, \mathbf q^{-1} pq−1。注意,顺序一般不可交换。

四元数 q − 1 \mathbf q^{-1} q−1 即 q \mathbf q q 的逆,满足 q   q − 1 = q − 1   q = 1 \mathbf q\, \mathbf q^{-1} = \mathbf q^{-1}\, \mathbf q = 1 qq−1=q−1q=1,可通过如下方式推导:
q − 1   q   q ∗ = q ∗ q − 1   ∥ q ∥ 2 = q ∗   ⇒   q − 1 = q ∗ ∥ q ∥ 2 \mathbf q^{-1}\, \mathbf q\, \mathbf q^* = \mathbf q^* \\ \mathbf q^{-1}\, \Vert \mathbf q\Vert^2 = \mathbf q^* \\ ~\\ \Rightarrow\, \mathbf q^{-1} = \frac{\mathbf q^*}{\Vert \mathbf q\Vert^2} q−1qq∗=q∗q−1∥q∥2=q∗ ⇒q−1=∥q∥2q∗​

如果 q \mathbf q q 是一个单位四元数,即 ∥ q ∥ = 1 \Vert \mathbf q\Vert = 1 ∥q∥=1,那么有:
q − 1 = q ∗ \mathbf q^{-1} = \mathbf q^* q−1=q∗

网易U3D校招笔试深度剖析:C#底层与Unity优化实战 在Unity应用开发中,内存管理与性能优化是决定项目品质的关键环节,而C#作为核心脚本语言,其值类型、引用类型、GC机制等底层原理直接影响着应用表现。理解这些概念不仅有助于构建高效架构,也是应对大厂技术笔试的基础。从引擎生命周期、协程调度,到UGUI渲染优化、AssetBundle资源管理,再到移动端热更新方案,每一项都是工程实践中必须掌握的硬技能。本文结合网易U3D校招笔试真题,系统梳理了从基础语法到系统优化的高频考点,并分享了真实项目中的踩坑经验与应对策略,帮助你构建从理论到实战的完整知识框架。 阅读详情

相关推荐

好未来U3D笔试复盘:C#基础到Unity引擎核心考点全解析

在Unity开发中,C#语言基础和引擎核心机制是支撑一切功能实现的根基。从结构体与类的内存差异,到MonoBehaviour生命周期中Awake、OnEnable、Start的执行顺序;从协程的yield语义到对象池对GC压力的优化,这些都是实际项目中高频使用的技术点。而Unity笔试往往正是从这些基础概念出发,结合3D数学、渲染管线、算法设计等维度综合考察开发者的工程落地能力。无论是教育类应用还是游戏项目,处理UI刷新、数据持久化、弱网重试等场景,都需要开发者具备扎实的底层功底与性能优化意识。本文围绕一场

weixin_34277853的博客 416

彻底搞懂具身智能必备知识:李群、李代数、四元数

轨迹的本质是SE(3)的序列,我们可以通过对数映射将SE(3)转化为se(3),通过梯度下降优化se(3)向量,再通过指数映射转化回SE(3),得到符合物理规律的最优轨迹;,李群与李代数的价值尤为突出:它们解决了姿态表示的万向锁问题,通过李代数的线性化特性实现了轨迹优化的可微性,依靠李群的约束规则保证了行驶动作的物理一致性,让自动驾驶汽车能够在复杂路况中精准定位、顺畅避让;李群的核心作用,是描述三维空间中物体的“姿态”和“刚体运动”,我们最常用的就是李群中的两个核心成员:SO(3)和SE(3)。

soaring_casia的专栏 544

好未来Unity客户端笔试核心考点与备战指南

Unity客户端开发岗位的考查正在从单纯的引擎API使用,转向对C#功底、数据结构、渲染性能和工程架构的综合评估。理解Unity生命周期、物理碰撞、协程调度等机制原理,掌握DrawCall优化、AssetBundle资源管理等性能手段,是构建扎实技术基础的关键。这些能力在实际业务中具有明确价值:教育产品中的Pico 4 VR互动课件、Unity数字孪生场景、GB28181视频流接入等,都依赖稳定的客户端架构与资源热更方案。当面对校招笔试时,系统性地梳理C#基础、算法题和Unity高频机制,并结合业务场景分析

weixin_34152820的博客 415

CocosCreator之KUOKUO带你V2.1.0的3D尝鲜以及欧拉角和四元数简单使用

本次引擎2.1.0 编辑工具VSCode 啊哈,终于盼到了官方发布3D的这一天。这么鲜的事怎能自己独享? 来,我们一起开封CocosCreatorV2.1.0 嗯,,,熟悉的界面! 诶?人性化了,‘浏览’的位置终于变了!!! 啊哈!开封第一印象不错。 来,新建个项目。 让我们来找不同!! 嗯,找到了,第一个: 灰色变成了蓝色: 第二个: 边距变小了大约5像...

kuokuo666的博客 4077

【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库01

此方案可满足千万级并发需求,同时支持时序数据、知识图谱和文档数据库的高效处理,通过云原生架构实现极致弹性。​:每月约$15-20万(100节点K8s集群+数据库集群+CDN流量)1. 宠物上架/下架流程。

weixin_49199313的博客 1476

【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库02

每个分支下又细分了四个关键方向,并按照“研究对象/焦点、基本问题、核心理论/概念、研究方法、应用/目标、前沿/发展”的框架进行阐述,严格遵循了六级编码体系。在最终整合时,应建立唯一的学科分类编码表(例如,用两位数字或“ART”、“MED”、“ECO”等字母前缀),并确保所有下级编码(尺度、层次、类别、子类、具体项)的逻辑一致性。此回答中的编码为示例,实际系统需据此调整。控制过程(前馈、同期、反馈)、全面质量管理(TQM)、平衡计分卡(BSC)定量(调查、实验)、定性(访谈、民族志)、混合方法、大数据。

weixin_49199313的博客 674

Ceres_Pose Graph Example

一、问题背景 个人理解觉得这是一个Bundle Adjustment的过程 引用《视觉SLAM十四讲》的一句话“在SLAM中,通常的做法是先使用P3P/EPnP等方法估计相机位姿,然后构建最小二乘优化问题对估计值进行调整(Bundle Adjustment)”。 这里“对估计值进行调整”可以用g2o,也可以用ceres进行图优化。 二、二维图优化 二维状态包含位置 ppp (2维...

silence_iz的博客 1040

基于误差四元数的滑模姿态跟踪控制设计与仿真实现

姿态控制是无人机、航天器等飞行器系统的核心问题,尤其在执行复杂轨迹时,如何实现对时变期望姿态的精准跟踪一直是工程难点。传统欧拉角表示存在万向节锁缺陷,而四元数凭借无奇异、计算高效等优势成为姿态描述的主流工具。滑模控制作为一种强鲁棒非线性控制方法,能够有效应对模型不确定性与外部扰动。本文从误差四元数的数学定义出发,阐述其与滑模面结合的动力学推导过程,给出完整的控制器设计、稳定性分析及Simulink仿真实现方法,并针对参数整定、抖振抑制、四元数归一化等工程实践中的常见问题提供可操作的调试经验。内容覆盖理论到工

weixin_42528534的博客 332

相机标定与PnP解算

本文介绍了计算机视觉中的相机成像模型与相关数学基础。主要内容包括:线性代数中的矩阵乘法公式、右手坐标系的定义及常见应用;空间位姿描述的三种方法(欧拉角、旋转矩阵、旋转向量);相机成像的四大坐标系(世界、相机、图像、像素)及其转换关系,推导出完整的针孔相机模型公式;最后简要说明图像畸变的两种类型(径向和切向)及其成因,并提及常用的畸变系数表示。这些知识为理解计算机视觉中的三维重建、目标跟踪等任务奠定了重要的理论基础。

shengxiamo66的博客 1094

lift off工艺为什么常用蒸发的方式镀膜?

电子束蒸发中,蒸发物质从源头直接升华并沿直线路径沉积到晶圆上,它可以避免金属在掩模侧壁的覆盖,只在表面进行沉积。在镀膜结束后,在进行光刻胶剥离时,去胶液无法与光刻胶接触反应,导致光刻胶剥离很困难。欢迎加入我的半导体制造知识星球社区,目前社区有1900人左右。我观察到晶圆厂中lift off工艺,镀膜都是用的电子束蒸发的方式,很少有用磁控溅射的方式,为什么?需要增加撕胶工序,将胶面上覆盖的膜层撕掉,使光刻胶露出,这样才容易剥离。上图为磁控溅射的膜层截面图,去胶液很难突破侧壁膜层,进行反应。

1685

STM32CubeMX+Keil5实战:手把手教你用STM32F103C8T6开发扫地机器人(附完整代码)

本文详细介绍了如何使用STM32F103C8T6开发智能扫地机器人,从STM32CubeMX配置到Keil5代码实现的全过程。涵盖硬件选型、时钟树配置、GPIO外设设置、电机驱动、超声波测距及自动避障算法等核心内容,并提供完整代码示例,助力开发者快速掌握智能硬件开发技巧。

weixin_30329623的博客 81

Moveit2 第一个 C++ MoveIt 项目

自用

weixin_71160458的博客 1697

LM Studio Bionic:本地AI智能体从部署到实战完整指南

AI智能体作为能够自主规划、执行多步任务的人工智能系统,其核心原理在于结合大语言模型的推理能力与工具调用机制。通过状态保持和任务分解算法,智能体实现了从单次问答到持续协作的技术跃迁。在工程实践中,这种架构显著降低了复杂任务自动化的门槛,特别适用于数据敏感场景和定制化需求。以Tesla V100等专业硬件为例,本地部署能充分发挥其大显存优势,支持更高精度的模型量化格式。在实际应用层面,智能体可无缝集成到代码审查、文档生成等开发工作流中,而LM Studio Bionic通过统一界面整合了模型服务、任务规划器等

weixin_29053695的博客 649

好未来U3D笔试攻略:C#基础、Unity引擎与算法考点全解析

在Unity3D开发岗位的笔试中,扎实的C#功底和引擎原理是决定成败的关键。理解值类型与引用类型、委托与事件、GC机制,并掌握协程、物理系统、UI重建及AssetBundle资源加载等核心知识,能够有效应对复杂工程问题。同时,数据结构与算法(如BFS求最短路径)、3D数学中的向量与四元数变换,也是教育科技场景下实现交互课件与虚拟实验室的必备技能。从基础概念到引擎机制,再到实际项目中的性能优化与热更新方案,这些知识共同构成了U3D开发者的核心能力。好未来秋招U3D岗第三批笔试正围绕这些考点展开,深入理解原理并

weixin_33981932的博客 474

Unreal5从入门到精通之如何实现移动端触屏滑动手势

随着移动设备的普及,越来越多的游戏和应用选择在移动平台上发布。Unreal Engine 5(UE5)作为一款强大的游戏引擎,提供了丰富的工具和功能,帮助开发者打造出色的移动体验。UE5不仅提升了图形质量,还大幅简化了开发流程,使得开发者能够更专注于游戏设计和用户体验。在移动游戏中,触屏滑动手势是用户与应用互动的主要方式之一。然而,许多开发者在实现这些功能时常常遇到困难。为了填补这一知识空白,本篇文章将详细介绍如何在UE5中实现移动端触屏滑动手势,帮助你从入门到精通,提升你的开发技能。

TxNet 1136

【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?

本文介绍了两种实现卡牌游戏效果系统的模块化设计方案。方案一使用ScriptableObject创建独立的效果资产,通过组合实现不同效果,优点是数据可复用、可视化编辑,缺点是同类不同参数效果需创建大量SO文件。方案二利用SerializeReference特性直接嵌套效果实例,避免SO文件过多,但需要插件支持编辑器多态显示。两种方案都将效果与卡牌解耦,提高了代码复用性和扩展性,解决了硬编码带来的重复、维护困难和扩展不便等问题。开发者可根据项目需求选择合适方案,或结合两者优势构建更灵活的系统。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 436

游戏引擎×计算机视觉交叉岗笔试题解析:从渲染管线到实时算法

计算机图形学与计算机视觉的交叉融合正成为游戏引擎发展的关键方向。引擎不仅要处理渲染管线、矩阵变换、四元数等基础数学原理,还需将目标检测、姿态估计、光流法等视觉算法实时嵌入到游戏流程中。这种融合支撑了动捕驱动角色、AR交互、绿幕抠像等典型应用场景,对工程师的数学功底与工程化能力提出更高要求。本文以搜狐畅游校招补录笔试题为样本,拆解游戏引擎与视觉交叉岗位的考察重点,帮助开发者构建系统化备考路径,理解从理论到实时落地的完整链路。

weixin_30920597的博客 380

华为OD新系统真题-最小极差分组(C/C++/Py/Java/Js/Go)

华为OD机试 新系统真题【最小极差分组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【最小极差分组】多语言题解。

qq_45776114的博客 586

RTG-SLAM 论文阅读

传统的三维重建侧重于几何精度,忽视了渲染质量基于nerf的三维重建方法要求很高的算力,难以实现是实时性GS速度虽然快,但大多数还是离线运行。如何减少内存和计算消耗,是实现3DGS能够在先运行的重要问题。

lhy_6668的博客 1259

亿图机床采集数据

这个数控系统的英文名是HUST,在台湾知名度还可以,但大陆这边我做这么多年项目也只接触过屈指可数的几次,可见市场占有率并不大,联网采集不复杂。

若云流风的专栏 2491

上下双相机定位贴合(原理到应用,halcon源码详解)

上下双相机定位贴合(原理到应用,halcon源码详解) 一、简介(类型与之前的文章)看你们理解那个文章快 主要讲解上下双相机定位贴合的原理和实现过程,包括各种标定、组合使用及具体的halcon源码实现,适用于的X、Y、Z三轴加一旋转轴系统,如模组组成的多轴系统、Scara四轴机器、六轴机器人(在运行过程中保证几个自由度不动,运行即可) 二、标定介绍 这一小节总结了通用的相机和轴的相对位置模型,并对其标定进行详细讲解 本系统仅使用了九点标定,精度可做到0.05mm 九点标定作用: A、本质就是仿射变换,一个坐

苏州程序大白的博客 9973

NTA-IoU指标提升超42%,北京大学提出首个使用世界模型提升自动驾驶场景重建质量DriveDreamer4D

闭环仿真是推进端到端自动驾驶系统的重要环节。当代传感器仿真方法,如NeRF和3DGS,主要依赖与训练数据分布高度一致的条件,这通常局限于前向驾驶场景。因此,这些方法在渲染复杂的机动动作(如变道、加速、减速)时存在局限性。近年来,自动驾驶世界模型在生成多样化驾驶视频方面展现了潜力,但这些方法仍然局限于二维视频生成,无法捕捉动态驾驶环境所需的时空一致性。在本文中,我们提出了DriveDreamer4D,通过利用世界模型先验知识提升4D驾驶场景表示。

自动驾驶实战 1351

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

避开内卷!南航航天学院控制工程(085400)考研,真的比自动化学院好考吗?

本文深入分析了南京航空航天大学航天学院与自动化学院控制工程(085400)考研的差异,揭示航天学院在报考热度、研究方向、录取难度上的独特优势。通过数据对比和复试特点解析,帮助考生判断是否适合选择航天学院,并提供针对性备考建议,助力考生避开内卷,实现高效备考。

weixin_30824599的博客 374

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

前端开发者转型新赛道:从代码到价值的10个跨界路径

本文为前端开发者提供了10个跨界转型的实用路径,包括技术产品经理、开发者关系、技术写作等方向。文章详细分析了前端技能在新领域的应用优势,如工程化思维、用户体验敏感度等核心能力的迁移价值,并给出具体的学习建议和成功案例,帮助开发者实现从代码到价值的跨越。

weixin_30588675的博客 402

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

PoseNet复现记录以及思考(PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization)

采用迁移学习(transfer learning)的方式,使用预训练模型作为起点,然后在自己的数据集上进行微调。预训练模型已经在大规模数据(例如 ImageNet)上学到了丰富的特征,这能加速收敛和提高模型性能。训练过程中,虽然模型的主体(如 ResNet-34 的特征提取部分)是预训练得到的,但最后添加的全连接层和损失函数都是在自己的数据集上训练的,从而让模型适应具体任务。

whisper1215的博客 2160

探索基于物理的渲染:从理论到实现的中文整合翻译计划

探索基于物理的渲染:从理论到实现的中文整合翻译计划 项目介绍 《基于物理的渲染:从理论到实现 中文整合翻译计划》(以下简称“本书”)是由译者Kanition基于英文经典书籍《Physically Based Rendering: From Theory To Implementation》第三版自行翻译而成的中文版本。本书不仅忠实于原著,还根据译者的学习经验进行了补充和修正,力求为中文读者提供一个...

gitblog_01117的博客 786
上一篇: 【解决方法】电脑 WLAN 适配器驱动程序出现问题导致无法显示可用网络
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学:人类精神虐待(゚Д゚)ノ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值