四元数

MD5骨骼动画模型加载

萝らか妹 提交于 2020-03-14 15:12:33
前面我们分析了静态模型OBJ格式,桢动画模型MD2,这篇主要分析骨骼动画MD5的一些概念并且实现。   混合桢动画有计算简单,容易实现等优点,但是在需要比较细致的效果时,则需要更多的关键桢,每桢都添加相同的顶点,如果模型再细分一些,则比较恐怖了。在这基础上,则发展出了骨骼动画模型,原理说起来很简单,比如我们人类,做的各种动作具体都是由几个关节点来控制,比如你抬腿,你只把你大腿的骨骼调动起来,而大腿的肌肉跟着骨骼向上。由些我们只需要保存每桢的骨骼变动,然后再上面蒙上表皮。因此大量简单了顶点存储,并且,我们能方便的对骨骼实时改动就能添加不同的动画,但是因为骨骼的改变都是针对父骨骼来的,而蒙皮操作又是针对骷髅节点来做的,这些操作需要大量的运算。   下面我们来解析MD5骨骼模型中,一些基本的概念与实现,在MD5,除去纹理图片,有二个比较主要的文件,一个是后缀为md5mesh的文件,一个是后缀为md5anim的文件,二个文件如他们的后缀名所表达的意思一样,前者和OBJ模型里的描述比较类似,主要包含每部分的顶点,面,纹理组成,不同于OBJ模型的的,这些元素是变化的,因此在OBJ模型有一些新的元素,如顶点不是单独的顶点,而是由一个或多个权重点构成,每个权重点关联着对应着骨骼节点,这样骨骼节点的改变能引起权重点的改变,而权重点的改变又引起了顶点的改变,至于为什么要用到权重点来连接骨骼和顶点

四元数写子弹环形发射、伞状发射

北城余情 提交于 2020-03-06 02:23:07
子弹伞状发射 搭建这样的场景,一个cube和一个Sphere,cube当作发射器,Sphere当作子弹,这里的Sphere通过Scale调节比例缩小,使其发射效果更好一些。 要写两个脚本,一个是绑在发射器上的,名为BulletLauncher,另一个是绑在子弹上的,名为BulletControl,子弹可以做成预制体。 BullteLauncher: using System . Collections ; using System . Collections . Generic ; using UnityEngine ; public class BulletLauncher : MonoBehaviour { public GameObject cube ; public GameObject sphere ; private float timer ; // Start is called before the first frame update void Start ( ) { } void Update ( ) { timer + = Time . deltaTime ; if ( timer > 3 ) //当timer大于3时,发射子弹,使得发射有间隙 { for ( int i = 0 ; i < 5 ; i ++ ) { Quaternion q =

游戏 图形方面 面试题

∥☆過路亽.° 提交于 2020-02-23 19:34:49
图形学渲染流程(管线)说一下 答: 传统的前向渲染管线流程是这样的 顶点和索引到顶点着色器,这里主要是对顶点进行变换,然后是光栅化,这里将剔除视锥体之外的元素,光栅化后三角形内的像素将进入到片元着色器(像素着色器),经过深度测试(模板测试)后写入到Target缓冲区内。 其实还有计算shader,用于曲面细分的三个shader,几何shader,RayTrace shader等,不展开了。 BDRF函数 答:BRDF函数是射出光线的辐照度和摄入光线辐射率的比值,在现代引擎中BRDF一般使用Cook-Torrance 的公式,定义为F菲涅尔(F0,NV) G(L,N,V) 几何函数 D(N,H,Roughness) 法线分布函数(H为L,V的半角向量) 除以4*(NL)*(NV) IBL基本原理 答: 在PBR渲染公式中,我们不仅仅算直接光源,也要考虑来自环境的间接光源,因此把来自环境光的信息储存在cubeMap中供计算,这就是IBL,基于图形的光照,在这种情况下需要对光照方程进行分割,分为环境光和镜面光两部分,为了提高速度一般都会把这些卷积的结果存储在贴图里面,对于漫反射,存不同法线下的卷积结果,对于高光需要先分拆为 预滤波环境贴图和预计算BRDF,这里有一个N=V=R的假设,基于重要性采样,可以把第二项看为参数为NWi和Roughness参数的二维函数,就可以预计算贴图

旋转矩阵、欧拉角、四元数理论及其转换关系

元气小坏坏 提交于 2020-01-31 04:10:32
https://www.cnblogs.com/flyinggod/p/8144100.html 这才真正说清了 欧拉角的含义。 从旋转矩阵 来理解 才是最正确的方法。 线性代数 能解释旋转矩阵 以后再回炉把, 总算弄清楚了。 之前定义都搞错。 以为是,x,y,z 3个轴各自旋转,坑到家了。 旋转矩阵、欧拉角、四元数理论及其转换关系 博客转载自:http://blog.csdn.net/lql0716/article/details/72597719 1. 概述 旋转矩阵、欧拉角、四元数主要用于表示坐标系中的旋转关系,它们之间的转换关系可以减小一些算法的复杂度。 本文主要介绍了旋转矩阵、欧拉角、四元数的基本理论及其之间的转换关系。 2、原理 2.1 旋转矩阵 对于两个三维点 p 1 ( x 1 , y 1 , z 1 ), p 2 ( x 2 , y 2 , z 2 ),由点 p 1 经过旋转矩阵 R 旋转到 p 2,则有 注:旋转矩阵为正交矩阵 R R T = E 任意旋转矩阵: 任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为 欧拉角 。 三个轴可以指固定的世界坐标系轴,也可以指被旋转的物体坐标系的轴。三个旋转轴次序不同,会导致结果不同。 2.2 欧拉角 欧拉角有两种: 静态 :即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。

四元数和欧拉角

空扰寡人 提交于 2020-01-23 16:28:53
来源:http://blog.csdn.net/candycat1992/article/details/41254799 四元数介绍 旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和 欧拉旋转 。矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴顺序(例如先x、再y、最后z)、每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标轴旋转的组合。 那么, 四元数 又是什么呢?简单来说,四元数本质上是一种高阶复数(听不懂了吧。。。),是一个四维空间,相对于复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即x = a + bi,i是虚数单位,如果你还记得的话应该知道i^2 = -1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,i、j、k,即一个四元数可以表示为x = a + bi + cj + dk。那么,它和旋转为什么会有关系呢? 在Unity里,tranform组件有一个变量名为rotation,它的类型就是四元数。很多初学者会直接取rotation的x、y、z,认为它们分别对应了Transform面板里R的各个分量。当然很快我们就会发现这是完全不对的

Unity向量按照某一点进行旋转

戏子无情 提交于 2020-01-21 05:30:52
一、unity的旋转 首先要知道一点就是在Unity的旋转中使用过四元数进行旋转的,如果对一个物体的rotation直接赋值你会发现结果不是你最终想要的结果,这个时候我们需要去借助Quaternion来进行旋转。 二、向量按照原点进行旋转 用到的Unity内置方法Quaternion.AngleAxis(float angle,Vector3 axis) 第一个参数就是我们需要旋转的角度 angle大于0时是按照顺时针的方向进行旋转,angle小于0是按照逆时针的方向旋转,这里的旋转时按照坐标原点进行的旋转。 第二个参数是旋转轴,围绕哪一个坐标轴进行旋转。 注意:使用这个方法时获得的也是四元数,我们将其转换成向量Vector3是需要乘以自身的坐标(四元数 * 自身向量,如果反过来 自身向量 * 四元数 在Unity会发生编译错误,这里需要注意一下) 案例:将Vector3(1,0,1)按照原点旋转45°,90°,180°,270°测试分别用黑、黄、蓝、绿颜色表示 代码如下: using UnityEngine ; [ ExecuteInEditMode ] public class VectorDirTest : MonoBehaviour { // Update is called once per frame void Update ( ) { Debug . DrawLine

UE4解决万向锁问题

回眸只為那壹抹淺笑 提交于 2020-01-17 02:29:22
万向锁 目录 万向锁的来源 Unity中最简单的万向锁 UE4最简单万向锁 解决方案 四元数与欧拉角之间的转换 参考链接 目录 万向锁的来源 简单而言,万向锁就是由于物体在进行旋转时(前提是通过欧拉角进行旋转),当旋转到某个特定角度会导致两个旋转轴处于同一个平面,导致旋转不能到达自己的预期效果,产生这种现象的原因是因为轴与轴之间存在父子关系。 视频展示链接:https://www.bilibili.com/video/av76536794/ Unity中最简单的万向锁 将x轴设为90度,旋转y轴和旋转z轴有相同效果 UE4最简单万向锁 将y轴设为90度,旋转x轴和旋转z轴有相同效果 旋转角度为0时: 绕y轴旋转90度时: x轴和z轴的值都奇怪的变成了180度,或者当y轴设为90度时,旋转x轴和z轴效果相同 , 解决方案 1 使用x轴旋转代替y轴旋转,首先将z值设置为90度,然后旋转x轴即可产生绕y轴旋转的效果 不过此方案只适用于比较规则的物体,如长方体,正方体 2 使用四元数旋转来代替欧拉角 四元数与欧拉角之间的转换 四元数的定义 四元数与欧拉角的转换 下面展示使用UE4,通过四元数处理物体旋转的代码: // An highlighted block // Fill out your copyright notice in the Description page of

四元数

亡梦爱人 提交于 2019-12-28 11:35:27
##1.1-1四元数的定义与运算法则 四元数分为两个定义方式:Hamilton四元数和JPL四元数,其根本的不同在于虚数运算$$ij=k$$或者$$ij=-k$$的区别。以下所推导的四元数都是标量在前,矢量在后;JPL的四元数的推导为个人手工推导,如有谬误,请指出; 两种四元数的定义规范都满足加法、减法,并且都满足交换律和结合律; Hamilton四元数的乘法: $$ \overline{p}\otimes\overline{q}=(p_0+p_1i+p_2j+p_3k)(q_0+q_1i+q_2j+q_3k) \\=(p_0q_0-p_1q_1-p_2q_2-p_3q_3)\\+(p_0q_1+p_1q_0+p_2q_3-p_3q_2)i\\+(p_0q_2+p_2q_0-p_1q_3+p_3q_1)j\\+(p_0q_3+p_3q_0+p_1q_2-p_2q_1)k $$ 写成矩阵的形式则有: $$ \overline{p}\otimes\overline{q}=\begin{bmatrix}p_0&-p_1&-p_2&-p_3\\p_1&p_0&-p_3&p_2\\p_2&p_3&p_0&-p_1\\p_3&-p_2&p_1&p_0\end{bmatrix}\begin{bmatrix}q_0\\q_1\\q_2\\q_3\end{bmatrix} $$ JPL四元数的乘法:

coscos3D 基础教程与实践

强颜欢笑 提交于 2019-12-28 03:54:23
目录 1.cocos creator 3D坐标系 2.TS 组件代码介绍 3.vec3 4.node基础属性与缩放 5.欧拉角与四元数 6.Node 旋转 7.摄像机 8.模型显示以及动画播放 9.常用3DShader 10.天空盒的使用 待续... 1.cocos creator 3D坐标系 水平向右边 x轴; 竖直向上 y轴; 垂直于屏幕向外: Z; 物体的前方: (-z), 右边(+x) 上面(+y) 3D坐标系:右手,左手坐标; 2.TS 组件代码介绍 //具体ts 脚本使用教程地址: https://blog.csdn.net/osuckseed/article/details/103697957 //从指定模块导出对应的符号 import { _decorator, Component, Node,Vec3, CCObject } from "cc"; //装饰器 编辑器装载脚本代码的时候读取的 //ccclass :指定类为组件类 //property:作为属性绑定为到编辑器 const { ccclass, property } = _decorator; //装饰器以@开头 编辑器识别后把它作为组件类 //export:导出类 import{gameMgr} frrom "./gameMgr" @ccclass("gameMgr") export class

Eigen 中四元数、欧拉角、旋转矩阵、旋转向量

这一生的挚爱 提交于 2019-12-20 03:59:22
一、旋转向量 1.0 初始化旋转向量:旋转角为alpha,旋转轴为(x,y,z) Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z)) 1.1 旋转向量转旋转矩阵 Eigen::Matrix3d rotation_matrix; rotation_matrix=rotation_vector.matrix(); Eigen::Matrix3d rotation_matrix; rotation_matrix=rotation_vector.toRotationMatrix(); 1.2 旋转向量转欧拉角(Z-Y-X,即RPY) Eigen::Vector3d eulerAngle=rotation_vector.matrix().eulerAngles(2,1,0); 1.3 旋转向量转四元数 Eigen::Quaterniond quaternion(rotation_vector); Eigen::Quaterniond quaternion;Quaterniond quaternion; Eigen::Quaterniond quaternion;quaternion=rotation_vector; 二、旋转矩阵 2.0 初始化旋转矩阵 Eigen::Matrix3d rotation_matrix;