如何生成osg的动画路径文件

news2025/1/11 4:14:20

目录

1. 前言

2. 生成动画路径文件

2.1. 粗糙方式

2.2. 精确方式


1. 前言

         在进行osg的开发中,有时需要对模型按某个路径或规则进行动画,如下:

奶牛在10秒时间段从起始的osg::Vec3d(0.0, 18, 1.0)位置 匀速直线运动到osg::Vec3d(0.0, -8, 1.0)位置处。又比如下:

飞机以和Y轴成倾斜45°角绕着Z轴在地面一定高度做圆周盘旋运动。

       一般地,为相机设置osgGA::AnimationPathManipulator操控器,或者为osg::PositionAttitudeTransform、osg::MatrixTransform节点通过调用setUpdateCallback函数设置动画路径回调函数osg::AnimationPathCallback类对象就可以达到动画的效果。当动画生成的时候,需要将动画路径的数据如控制点等信息,以文件形式保存下来,以供其它程序使用。如何生成这样的动画路径文件?

2. 生成动画路径文件

2.1. 粗糙方式

      如果需求对动画路径要求不精确,如:没有要求具体的时间段、没有要求具体的转动角度、移动距离等, 仅仅只是要求移动或转动到估计的位置或角度就行,则可以用osg自带的在OsgViewerd.exe(release版为OsgViewer.exe)按下述步骤生成动画路径文件(以Windows为例说明):

1. 打开cmd,输入:

E:\osg\build_osg3.6.2\bin\OsgViewerd.exe  E:\osg\OpenSceneGraph-Data\cow.osg

其中的两个路径,请根据实际更改。如下为cmd输入的命令行:

2. 按下键盘小写键z,开始记录动画路径,依照需求,在场景视图上按住鼠标移动或转动奶牛模型,直到达到预想的动画,然后按住大写"Z"保存路径文件,按住ESC键关闭场景视图窗口,此时就会在上述红色框的目录即启动cmd.exe的目录下生成saved_animation.path的动画路径文件,文件内容类似如下:

0.0018253 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.0667249 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.1337192 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.1998216 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.2653721 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.3338356 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.4002481 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.4664029 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.5332971 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.5996751 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.6665445 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.7353267 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.7997468 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.8663566 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.9328836 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
0.9993953 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.0663357 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.1383031 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.2032655 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.2654628 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.3326584 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.3995767 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.4658965 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.5320493 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.5997768 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.6665459 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.7327271 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.7986692 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.8654239 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
1.9356403 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
2.0001472 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
2.0880553 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548
2.1488845 0.776124954223633 -25.6958980560303 -0 0.707106781186548 0 0 0.707106781186548

这样动画路径文件就生成了。

2.2. 精确方式

        对于2.1节提到的方法,仅仅只能用于粗略估计的平移和旋转,对于精确的,则必须通过编程及数学算出每个时刻及该时刻的控制点,然后保存到文件。以前面的奶牛需求为例子,代码实现如下:

#include<osgGA/AnimationPathManipulator>
#include<osgViewer/Viewer>
#include<osgDB/ReadFile>
#include<osgDB/WriteFile>
#include<osg/PositionAttitudeTransform>
#include<osg/AnimationPath>

osg::AnimationPath* createAnimationPath(const osg::Vec3d& startPos, const osg::Vec3d& endPos, double time)
{
    auto pAnimationPath = new osg::AnimationPath;
    pAnimationPath->setLoopMode(osg::AnimationPath::LOOP);

    auto timeDeta = 0.2;

    const auto loopCount = time / timeDeta;
    
    // 这里假定模型在x、y、z方向上运动的速度都一样且是匀速直线运动
    auto xStep = (endPos.x() - startPos.x()) / loopCount; // 每个时间段前进的距离
    auto yStep = (endPos.y() - startPos.y()) / loopCount;
    auto zStep = (endPos.z() - startPos.z()) / loopCount;

    double angle = 0.0;
    double twoPi = 2 * 3.1415926;
    osg::Vec3d lastPos = startPos;
    osg::Vec3d pos = startPos;
    for (auto timeOffset = 0.0; timeOffset <= time; timeOffset += timeDeta)
    {
        if (0.0 < timeOffset)
        {
            pos.x() = pos.x() + xStep;
            pos.y() = pos.y() + yStep;
            pos.z() = pos.z() + zStep;

            auto xOffset = pos.x() - lastPos.x();
            auto yOffset = pos.y() - lastPos.y();
            angle = atan2f(yOffset, xOffset); // 算出偏转方向
            angle = twoPi + angle;
        }

        osg::Quat roateByZAxis(0/*angle*/, osg::Vec3(0, 0, 1));
        osg::AnimationPath::ControlPoint ctrlPoint(pos, roateByZAxis); // 动画控制点
        pAnimationPath->insert(timeOffset, ctrlPoint);
        lastPos = pos;
    }

    // 保存动画路径到文件
    osgDB::ofstream out("cow_animationpath.txt");
    pAnimationPath->write(out);

    return pAnimationPath;
}

int main(int argc, char *argv[])
{
    auto pCow = osgDB::readRefNodeFile(R"(E:\osg\OpenSceneGraph-Data\cow.osg)");
    if (nullptr == pCow)
    {
        OSG_WARN << "cow node is nullpr!" << std::endl;
        return 1;
    }

    osgViewer::Viewer viewer;

    auto pRoot = new osg::Group();

    auto pPosAttTransform = new osg::PositionAttitudeTransform;
    auto initPos = osg::Vec3d(0.0, 18, 1.0);
    pPosAttTransform->setPosition(initPos);
    pPosAttTransform->addChild(pCow);
    auto pAnimationCallback = new osg::AnimationPathCallback(createAnimationPath(initPos, osg::Vec3d(0.0, -8, 1.0), 10.0));
    pPosAttTransform->setUpdateCallback(pAnimationCallback);
    
    pRoot->addChild(pPosAttTransform);

    viewer.setSceneData(pRoot);
   
    return viewer.run();
}

运行该程序,则在本工程目录下,会生成cow_animationpath.txt文件,内容如下:

0 0 18 1 0 0 0 1
0.2 0 17.48 1 0 0 0 1
0.4 0 16.96 1 0 0 0 1
0.6 0 16.44 1 0 0 0 1
0.8 0 15.92 1 0 0 0 1
1 0 15.4 1 0 0 0 1
1.2 0 14.88 1 0 0 0 1
1.4 0 14.36 1 0 0 0 1
1.6 0 13.84 1 0 0 0 1
1.8 0 13.32 1 0 0 0 1
2 0 12.8 1 0 0 0 1
2.2 0 12.28 1 0 0 0 1
2.4 0 11.76 1 0 0 0 1
2.6 0 11.24 1 0 0 0 1
2.8 0 10.72 1 0 0 0 1
3 0 10.2 1 0 0 0 1
3.2 0 9.68000000000001 1 0 0 0 1
3.4 0 9.16000000000001 1 0 0 0 1
3.6 0 8.64000000000001 1 0 0 0 1
3.8 0 8.12000000000001 1 0 0 0 1
4 0 7.60000000000001 1 0 0 0 1
4.2 0 7.08000000000001 1 0 0 0 1
4.4 0 6.56000000000001 1 0 0 0 1
4.6 0 6.04000000000001 1 0 0 0 1
4.8 0 5.52000000000001 1 0 0 0 1
5 0 5.00000000000001 1 0 0 0 1
5.2 0 4.48000000000001 1 0 0 0 1
5.4 0 3.96000000000001 1 0 0 0 1
5.6 0 3.44000000000001 1 0 0 0 1
5.8 0 2.92000000000001 1 0 0 0 1
6 0 2.40000000000001 1 0 0 0 1
6.2 0 1.88000000000001 1 0 0 0 1
6.4 0 1.36000000000001 1 0 0 0 1
6.6 0 0.840000000000011 1 0 0 0 1
6.8 0 0.320000000000011 1 0 0 0 1
7 0 -0.199999999999989 1 0 0 0 1
7.2 0 -0.719999999999989 1 0 0 0 1
7.4 0 -1.23999999999999 1 0 0 0 1
7.6 0 -1.75999999999999 1 0 0 0 1
7.8 0 -2.27999999999999 1 0 0 0 1
8 0 -2.79999999999999 1 0 0 0 1
8.2 0 -3.31999999999999 1 0 0 0 1
8.4 0 -3.83999999999999 1 0 0 0 1
8.6 0 -4.35999999999999 1 0 0 0 1
8.8 0 -4.87999999999999 1 0 0 0 1
9 0 -5.39999999999999 1 0 0 0 1
9.2 0 -5.91999999999999 1 0 0 0 1
9.4 0 -6.43999999999999 1 0 0 0 1
9.6 0 -6.95999999999999 1 0 0 0 1
9.8 0 -7.47999999999999 1 0 0 0 1
10 0 -7.99999999999999 1 0 0 0 1

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

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

相关文章

ubuntu 中使用Qt连接MMSQl,报错libqsqlodbc.so: undefined symbol: SQLAllocHandle

Qt4.8.7的源码编译出来的libqsqlodbc.so&#xff0c;在使用时报错libqsqlodbc.so: undefined symbol: SQLAllocHandle&#xff0c;需要在编译libqsqlodbc.so 的项目pro文件加上LIBS -L/usr/local/lib -lodbc。 这里的路径根据自己的实际情况填写。 编辑&#xff1a; 使用uni…

Python数据结构(队列)

Python数据结构&#xff08;队列&#xff09; 队列(queue)是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种先进先出的 (First n First ut)的线性表&#xff0c;简称FIFO。允许插入的一端为队尾&#xff0c;允许删除的一端为队头&#xff…

深度学习——图像分类(CIFAR-10)

深度学习——图像分类&#xff08;CIFAR-10&#xff09; 文章目录 前言一、实现图像分类1.1. 获取并组织数据集1.2. 划分训练集、验证集1.3. 图像增广1.4. 引入数据集1.5. 定义模型1.6. 定义训练函数1.7. 训练模型并保存模型参数 二、生成一个桌面小程序2.1. 使用QT设计师设计界…

建筑工程模板分类以及特点?

建筑工程模板可以根据材料、结构和用途等方面进行分类。以下是一些常见的建筑工程模板分类及其特点&#xff1a; 1. 木质模板&#xff1a; - 特点&#xff1a;木质模板是最常见和传统的模板类型。它们由木材制成&#xff0c;具有良好的可塑性和可加工性。木质模板适用于各种形状…

京东数据分析:2023年9月京东白酒行业品牌销售排行榜

鲸参谋监测的京东平台9月份白酒市场销售数据已出炉&#xff01; 9月白酒市场的整体热度较高&#xff0c;贵州茅台先是与瑞幸联名推出酱香拿铁&#xff0c;后又宣布与德芙推出联名产品酒心巧克力&#xff0c;引起了诸多消费者的关注。在这一热度的加持下&#xff0c;从销售上看&…

Kali Linux 安装搭建 hadoop 平台 调用 wordcount 示例程序 详细教程

步骤一&#xff1a; 目标&#xff1a;*安装虚拟机&#xff0c;在自己虚拟机上完成hadoop的伪分布式安装。&#xff08;安装完成后要检查&#xff09;* 1&#xff09;前期环境准备&#xff1a;&#xff08;虚拟机、jdk、ssh&#xff09; 2&#xff09;SSH相关配置 安装SSH Se…

【MyBatis篇】MyBatis动态代理总结

本人正在浅学mybatis&#xff0c;正学到mybatis动态代理&#xff0c;在查询多方资料之后做出以下总结&#xff0c;以便于系统学习时回顾&#xff1b; 目录 MyBatis为什么引入动态代理 mybatis的动态代理 Dao代理技术 MyBatis为什么引入动态代理 因为程序员的 懒&#xff0c;…

访问控制2

文章目录 主要内容一.Role和ClusterRole1.ClusterRole示例&#xff0c;创建一个名为test-clusterrole且仅有创建Pod和deployment的集群角色代码如下&#xff08;示例&#xff09;: 2.YAML文件创建代码如下&#xff08;示例&#xff09;: 3.将udbs用户和Clusterrole进行绑定&…

0基础学习VR全景平台篇第112篇:控制点和遮罩工具 - PTGui Pro教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 前情回顾&#xff1a;上节&#xff0c;我们用PTGui拼接了一张全景图&#xff0c;全景编辑器里的各项功能帮助我们进行了初步的检查和编辑。 之后我们需要使用【控制点】和【遮罩…

智慧垃圾站:AI视频智能识别技术助力智慧环保项目,以“智”替人强监管

一、背景分析 建设“技术先进、架构合理、开放智能、安全可靠”的智慧环保平台&#xff0c;整合环境相关的数据&#xff0c;对接已建业务系统&#xff0c;将环境相关数据进行统一管理&#xff0c;结合GIS技术进行监测、监控信息的展现和挖掘分析&#xff0c;实现业务数据的快速…

【AI视野·今日CV 计算机视觉论文速览 第271期】Thu, 19 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Thu, 19 Oct 2023 Totally 63 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning from Rich Semantics and Coarse Locations for Long-tailed Object Detection Authors Lingchen Meng, Xiyang D…

偕行十年,阿里云助力众安保险用科技温暖每一张保单

云布道师 前言&#xff1a;应云而生的众安保险&#xff0c;其 IT 架构都搭建在阿里云上&#xff0c;云服务器 ECS 关键应用上的数据需要保护&#xff0c;需要简单易用、稳定性高的方案&#xff0c;助力保险业务的快速开发和上线。在经过全面充分地沟通评估后&#xff0c;众安保…

凌晨!腾讯云终于发布了2023年度双十一优惠活动!

2023腾讯云双11优惠价格表终于来了&#xff0c;轻量2核2G3M云服务器88元一年、轻量2核4G5M服务器166.6元一年、3年轻量2核2G4M带宽优惠价366.6元、3年轻量2核4G5M配置566.6元&#xff0c;CVM云服务器2核2G配置SA2实例172.3元一年、标准型S5服务器2核2G配置280.8元一年&#xff…

个人微信管理系统都有些什么功能呢?

个人微信管理系统是一项高效的工具&#xff0c;可协助企业有效管理多个微信账号&#xff0c;从而提升工作效率。该系统允许企业在电脑上集中管理所有微信账号&#xff0c;省去了频繁切换设备的繁琐&#xff0c;同时还可以将微信账号分派给员工以进行更高效的微信管理。 来看看微…

融合通信系统在大型运动会中的应用

随着经济社会的发展&#xff0c;大型体育运动会的规模不断扩大&#xff0c;融合通信设备及指挥调度系统的应用逐渐成为不可或缺的一部分。通过融合通信设备的产品保障以及指挥调度系统的技术保障&#xff0c;可以对比赛进行高效、准确和实时的指挥和调度&#xff0c;确保比赛的…

安防视频监控平台EasyCVR新版(V.3.4)平台界面更新2.0

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

软考系统架构师知识点集锦一:系统工程与信息系统基础

一、考情分析 二、考点精讲 2.1 软件开发方法 &#xff08;1&#xff09;结构化开发方法 用户至上&#xff0c;自顶向下,逐步分解(求解)&#xff0c;严格区分工作阶段&#xff0c;每阶段有任务与成果&#xff0c;强调系统开发过程的整体性和全局性&#xff0c;系统开发过程工…

自动驾驶的未来展望和挑战

自动驾驶技术是一项引人瞩目的创新&#xff0c;将在未来交通领域产生深远影响。然而&#xff0c;随着技术的不断演进&#xff0c;自动驾驶也面临着一系列挑战和障碍。本文将探讨自动驾驶的未来发展方向、技术面临的挑战&#xff0c;以及自动驾驶对社会和环境的潜在影响。 自动驾…

基于springboot实现车辆充电桩平台管理系统项目【项目源码+论文说明】

基于sprinboot实现车辆充电桩管理平台系统演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;车辆充电桩管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#…

【算法挨揍日记】day17——1137. 第 N 个泰波那契数、面试题 08.01. 三步问题

1137. 第 N 个泰波那契数 1137. 第 N 个泰波那契数 题目描述&#xff1a; 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 解题思路&#xff1a; 本题很…