C++游戏引擎中骨骼动画和顶点动画

一.帧/帧时刻

     在常见的FPS游戏中,人物的行走,物体的变形等等都是采用动画的方式实现.计算机2D屏幕采用扫描周期的方式定时刷新渲染管线,C++程序通过定义帧/帧时刻实现每一帧的渲染,不同的帧衔接起来便是一个完整的动画.

    Direct3D提供API实现2D屏幕的重绘:

    D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);//清理GPU渲染管线d3dDevice->BeginScene(); D3DDevice->EndScene();D3DDevice->Present(NULL, NULL, NULL, NULL); //写入GPU渲染管线

二.顶点动画

     通过在不同帧时刻加载不同的静态模型实现的动画既顶点动画,所以顶点动画是不同帧时刻的静态模型的组合.游戏引擎可选择性将帧与帧之间的顶点进行插值运算实现连续性效果.

     顶点动画 = obj1(time1) + obj2(time2) + obj3(time3)

     故不同的游戏引擎导出的顶点动画最终是obj静态模型的组合.如常见M3D顶点动画3D文件,数据结构就是不同frame的静态模型组合MD3FileData.h:

// -------------------------------------------------------------------------------
/** @brief Data structure for the MD3 main header*/
struct Header
{//! magic numberuint32_t IDENT;//! file format versionuint32_t VERSION;//! original name in .pak archivechar NAME[ AI_MD3_MAXQPATH ];//! unknownint32_t FLAGS;//! number of frames in the fileuint32_t NUM_FRAMES;//! number of tags in the fileuint32_t NUM_TAGS;//! number of surfaces in the fileuint32_t NUM_SURFACES;//! number of skins in the fileuint32_t NUM_SKINS;//! offset of the first frameuint32_t OFS_FRAMES;//! offset of the first taguint32_t OFS_TAGS;//! offset of the first surfaceuint32_t OFS_SURFACES;//! end of fileuint32_t OFS_EOF;
} PACK_STRUCT;// -------------------------------------------------------------------------------
/** @brief Data structure for the frame header*/
struct Frame
{//! minimum boundsaiVector3D min;//! maximum boundsaiVector3D max;//! local origin for this frameaiVector3D origin;//! radius of bounding sphereai_real radius;//! name of framechar name[ AI_MD3_MAXFRAME ];} /* PACK_STRUCT */;// -------------------------------------------------------------------------------
/** @brief Data structure for the surface header*/
struct Surface {//! magic numberint32_t IDENT;//! original name of the surfacechar NAME[ AI_MD3_MAXQPATH ];//! unknownint32_t FLAGS;//! number of frames in the surfaceuint32_t NUM_FRAMES;//! number of shaders in the surfaceuint32_t NUM_SHADER;//! number of vertices in the surfaceuint32_t NUM_VERTICES;//! number of triangles in the surfaceuint32_t NUM_TRIANGLES;//! offset to the triangle datauint32_t OFS_TRIANGLES;//! offset to the shader datauint32_t OFS_SHADERS;//! offset to the texture coordinate datauint32_t OFS_ST;//! offset to the vertex/normal datauint32_t OFS_XYZNORMAL;//! offset to the end of the Surface objectint32_t OFS_END;
} /*PACK_STRUCT*/;

三.骨骼动画

    通过预先将静态模型拆分成若干顶点组(骨骼),每一帧通过每个骨骼的变换矩阵运算后得到新的obj静态模型既骨骼动画.所需内存相比顶点动画内存占用更小.适用连续性动作制作.

    骨骼动画 = (bone1×变换矩阵1 + bone2×变换矩阵2)(time1) + (bone1×变换矩阵3 + bone2×变换矩阵4)(time2).

    如常见的FBX,DAE文件存储骨骼动画采用将每一帧的变换矩阵进行封装存储,FBXDocument.h:

namespace FBX {class AnimationCurve; 
class AnimationCurveNode; //顶点组节点
class AnimationLayer;
class AnimationStack;}/** DOM class for skin deformer clusters (aka sub-deformers) */
class Cluster : public Deformer {private:WeightArray weights;       //权重WeightIndexArray indices;aiMatrix4x4 transform;     //每一帧对应的旋转矩阵aiMatrix4x4 transformLink; //每一帧对应的旋转矩阵const Model* node;
};

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16-网络安全框架及模型-BiBa完整性模型

目录 BiBa完整性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 应用场景 BiBa完整性模型 1 背景概述 Biba完整性模型是用于保护数据完整性的模型,它的主要目标是确保数据的准确性和一致性,防止未授权的修改和破坏。在这个模型中&#…

SpreadJS 集成使用案例

SpreadJS 集成案例 介绍: SpreadJS 基于 HTML5 标准,支持跨平台开发和集成,支持所有主流浏览器,无需预装任何插件或第三方组件,以原生的方式嵌入各类应用,可以与各类后端技术框架相结合。SpreadJS 以 纯前…

优化axios封装之配置使用AbortController取消重复请求 防止用户频繁操作调用接口

当数据量过大请求缓慢时用户点击按钮或者tab标签页快速重复调用同一个请求时,会导致数据错乱,当只需要最新的请求数据,并且中断上一个重复请求时,可以利用axios的CancelToken去中断之前的请求。 ps:由于不是所有请求都需要这个逻辑…

使用Docker快速安装grafana

Docker 提供了一个轻量级、易于部署的容器化解决方案,让您能够方便地在不同环境中运行应用程序。以下是在 Docker 中安装 Grafana 的基本步骤: 文章目录 使用Docker快速安装grafana如何使用Grafana步骤 1:连接数据源步骤 2:创建仪…

打开相机失败 出现错误的原因

如何解决? Debug中缺少DLL文件 以下参考周姐文档 相机调用步骤 学习相机第三方库的安装 https://blog.csdn.net/Qingshan_z/article/details/117257136书签:QT添加库(静态库和动态库)_Qingshan_z的博客-CSDN博客_qt添加库 添加文…

couldn‘t find “libmmkv.so“ android8.1.0 Nexus 5X

我们的应用一直没有奔溃,但是在某几款设备可能存在mmkv的报错。 研究了很久,一方面是因为mmkv团队也已经不管这个事情,从他的issue来看,每次有人提到这个,他要么就不予理睬,给出这个并非库维护者需要干的事…

ASUS华硕ROG幻16 2023款GU603VU VV VI笔记本电脑原厂Win11.22H2系统

链接:https://pan.baidu.com/s/1AgevUZleCHBJgCBcIp5CFQ?pwdhjxy 提取码:hjxy 华硕笔记本2023款幻16原厂Windows11系统自带所有驱动、出厂主题壁纸、Office办公软件、MyASUS华硕电脑管家、Armoury Crate奥创控制中心等预装程序 文件格式&#xff1…

WEB渗透—PHP反序列化(九)

Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…

网络隔离后,怎样建立高效安全的数据安全交换通道?

数据安全对企业生存发展有着举足轻重的影响,数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失。数据流动才能让其释放价值,想要保护企业核心资产,就要实现数据安全交换。 很多企业为了防止知识产权、商业机密数据泄露&am…

taskkill /F /PID 1764

查询端口,结束进程 ------------------------------------------------------------- Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。 C:\Users\Administrator>netstat -ano|findstr 8081 C:\Users\Administrator>…

树莓派安装Nginx搭建web服务器结合内网穿透实现无公网IP远程访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx(发音为“engine-x”)可以将您的树莓派变成一个强大的 Web 服务器,可以用于托管网站或 Web 应用程序。相比其他 Web 服务器,Ngi…

errors包返回堆栈信息的性能测试

errors包返回堆栈信息的性能测试 上一篇Golang中使用errors返回调用堆栈信息 讲了使用第三方开源库的errors github.com/go-errors/errors,错误信息带调用栈,方便定位错误的抛出位置。 通过堆栈的信息来定位是方便了,性能怎么样&#xff0c…

Pandas教程(三)—— 数据清洗与准备

1.处理缺失值 1.1 数据删除函数 作用:删除Dataframe某行或某列的数据 语法:df.drop( labels [ ] ) drop函数的几个参数: labels :接收一个列表,内含删除行 / 列的索引编号或索引名 axis &…

授人以鱼不如授人以渔 (第409篇文章)

一 引言 本文章内容 授人以鱼不如授人以渔 时代在变,技术在不断的更新,如何让自己不会落伍 利用人工智能AI 帮助你不断的去成长。注意我说的是成长不是学习。在成年人的社会中只有成长,在不断的成长的过程中去学习。 天工AI 能解决你的太多数技术上的问题。 如何去学习一门技…

解决 “/bin/bash^M: bad interpreter: No such file or directory”

原因:在执行 shell 脚本时提示这样的错误主要是由于 shell 脚本文件是 dos 格式,即每一行结尾以 \r\n 来标识,而 unix 格式的文件行尾则以 \n 来标识 解决方法: (1)使用 linux 命令 dos2unix filename&am…

抖音、小红书、视频号是如何判定是否限流的?

在这个新媒体营销的时代,抖音、小红书和视频号作为中国最受欢迎的社交媒体平台,为品牌和内容创作者提供了极具潜力的展示空间。然而,无论在哪个平台,限流成为很多人的苦恼。 抖音的推荐算法基于人群画像和初始流量池,同…

k8s的二进制部署(源码包部署)

实验条件: 主机名 IP地址 组件 作用 master01 20.0.0.17 kube-apiserver、kube-controller-manager、kube-scheduler、etcd k8s部署 master02 20.0.0.27 kube-apiserver、kube-controller-manager、kube-scheduler node01 20.0.0.37 kubelet、kube-pro…

Java开发框架和中间件面试题(10)

目录 104.怎么保证缓存和数据库数据的一致性? 105.什么是缓存穿透,什么是缓存雪崩?怎么解决? 106.如何对数据库进行优化? 107.使用索引时有哪些原则? 108.存储过程如何进行优化? 109.说说…

JVM高频面试题(2023最新版)

JVM面试题 1、JVM内存区域 Jvm包含两个子系统和两个组件。 1.1子系统 Class loader(类加载器):根据给定的全限定名类名(java.lang.object)来装载class文件到Runtime data area(运行时数据区)…

Mybatis 动态 SQL - trim, where, set

之前的例子都巧妙地避开了一个臭名昭著的动态SQL挑战。考虑一下如果我们回到之前的“if”例子&#xff0c;但这次我们将“ACTIVE 1”也作为一个动态条件。 <select id"findActiveBlogLike"resultType"Blog">SELECT * FROM BLOGWHERE<if test&qu…