AnimationPath路径动画实现详解

article/2025/10/24 13:41:30

AnimationPath路径动画实现详解:

一、关联类图展示

image

二、实现详解

  • 首先我们通过调用createAnimationPath方法来创建动画路径,即:通过起点、终点以及之间的时间步长来进行插值来保证动画的一个流畅度,然后将这些时间和点保存到一个map容器中(_timeControlPointMap)。

osg::AnimationPath* createAnimationPath(const osg::Vec3& center,float radius,double looptime)
{// set up the animation path osg::AnimationPath* animationPath = new osg::AnimationPath;animationPath->setLoopMode(osg::AnimationPath::LOOP);int numSamples = 40;float yaw = 0.0f;float yaw_delta = 2.0f*osg::PI/((float)numSamples-1.0f);float roll = osg::inDegrees(30.0f);double time=0.0f;double time_delta = looptime/(double)numSamples;for(int i=0;i<numSamples;++i){osg::Vec3 position(center+osg::Vec3(sinf(yaw)*radius,cosf(yaw)*radius,0.0f));osg::Quat rotation(osg::Quat(roll,osg::Vec3(0.0,1.0,0.0))*osg::Quat(-(yaw+osg::inDegrees(90.0f)),osg::Vec3(0.0,0.0,1.0)));animationPath->insert(time,osg::AnimationPath::ControlPoint(position,rotation));yaw += yaw_delta;time += time_delta;}return animationPath;    
}
  • 然后创建一个模型节点,即:要让它跟着我们指定的路径变化的节点。学过opengl或者游戏开发的都清楚,要想让一个点从一个位置变化到另一个位置,最好是通过矩阵来改变它的位置,所以我们需要把这个模型节点添加到矩阵中来动态更新它的位置,这样才能有一个连续的动画效果。

osg::Node* createMovingModel(const osg::Vec3& center, float radius)
{float animationLength = 10.0f;osg::AnimationPath* animationPath = createAnimationPath(center,radius,animationLength);osg::Group* model = new osg::Group;/// 通过读取模型来创建节点osg::Node* glider = osgDB::readNodeFile("glider.osgt");if (glider){const osg::BoundingSphere& bs = glider->getBound();float size = radius/bs.radius()*0.3f;osg::MatrixTransform* positioned = new osg::MatrixTransform;positioned->setDataVariance(osg::Object::STATIC);positioned->setMatrix(osg::Matrix::translate(-bs.center())*osg::Matrix::scale(size,size,size)*osg::Matrix::rotate(osg::inDegrees(-90.0f),0.0f,0.0f,1.0f));positioned->addChild(glider);osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;    xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0,1.0));xform->addChild(positioned);model->addChild(xform);}/// 通过读取模型来创建节点osg::Node* cessna = osgDB::readNodeFile("cessna.osgt");if (cessna){const osg::BoundingSphere& bs = cessna->getBound();float size = radius/bs.radius()*0.3f;osg::MatrixTransform* positioned = new osg::MatrixTransform;positioned->setDataVariance(osg::Object::STATIC);positioned->setMatrix(osg::Matrix::translate(-bs.center())*osg::Matrix::scale(size,size,size)*osg::Matrix::rotate(osg::inDegrees(180.0f),0.0f,0.0f,1.0f));positioned->addChild(cessna);osg::MatrixTransform* xform = new osg::MatrixTransform;xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0f,2.0));xform->addChild(positioned);model->addChild(xform);}return model;
}
  • 其次创建矩阵来改变模型节点的位置、旋转角度和缩放比。即:可以创建用于给变位置和旋转角的PositionAttitudeTransform对象,也可以创建MatrixTransform对象来对模型节点做更多的变换操作,最后将这些矩阵都添加到Group中来统一管理。

/// 创建位置属性变换对象,通过设置更新回调来动态改变节点的位置和旋转角osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;    xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0,1.0));xform->addChild(positioned);model->addChild(xform);/// 创建变换矩阵对象,通过设置更新回调来动态改变节点的位置和旋转角osg::MatrixTransform* xform = new osg::MatrixTransform;xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0f,2.0));xform->addChild(positioned);model->addChild(xform);}
  • 最后创建更新回调(AnimationPathCallback),通过为矩阵设置更新回调来动态更新节点变化,至于更新回调怎么调用这就需要大家看看渲染一帧到底做了什么操作,推介大家看(OSG_王锐《最长的一帧》)。AnimationPathCallback类中有两个方法需要注意:operator()和update(in node:Node&)方法,在updata方法中通过AnimationPathCallbackVisitor访问器来改变节点的矩阵。

    /// 创建位置属性变换对象,通过设置更新回调来动态改变节点的位置和旋转角osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;  /// 设置路径动画更新回调xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0,1.0));xform->addChild(positioned);model->addChild(xform);/// 创建变换矩阵对象,通过设置更新回调来动态改变节点的位置和旋转角osg::MatrixTransform* xform = new osg::MatrixTransform;/// 设置路径动画更新回调xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0f,2.0));xform->addChild(positioned);model->addChild(xform);

三、效果图展示

image


http://chatgpt.dhexx.cn/article/fErQliSs.shtml

相关文章

Dotween Path 路径动画使用方法详解

Dotween对于路径动画部分的api我觉得注释的过少了&#xff0c;很多用法没有写清楚&#xff0c;这里我就对Dotween Path做一下详细说明 1、API Dotween对于路径动画就只提供了两个方法&#xff0c;一个是针对于世界坐标的&#xff0c;一个是针对于局部坐标的&#xff0c;本质上…

WPF路径动画

特此声明&#xff1a;本文为CSDN博主「田野上的风筝」&#xff0c;原文地址&#xff1a;https://blog.csdn.net/weixin_43100896/article/details/87899883。感谢大佬的总结&#xff0c; 下文为转载内容。 在WPF中实现动画并不是什么困难的事&#xff0c;因为WPF提供了动画模型…

10路径动画

using System.Collections; using System.Collections.Generic; using System.Linq; using DG.Tweening; using UnityEngine;public class PathMove : MonoBehaviour {public Transform[] pointList;void Start(){//select方法,直接得到值,查询要返回的目标数据 int[] numm {…

服务器连接超时是怎么回事呢?

服务器连接超时就是在程序默认的等待时间内没有得到服务器的响应。 网络连接超时可能的原因有那些呢&#xff1f; 1、网络断开&#xff0c;不过经常显示无法连接。网络阻塞&#xff0c;导致你不能在程序默认等待时间内得到回复数据包。 2、网络不稳定&#xff0c;网络无法完整…

服务器时间修改连接超时时间,服务器设置网络连接超时时间设置

服务器设置网络连接超时时间设置 内容精选 换一换 有以下几种现象:将制作好的SD卡插入开发者板并上电后,开发者板LED1与LED2灯状态信息异常。将制作好的SD卡插入开发者板,并通过USB方式连接Ubuntu服务器,上电、开发者板启动完成后,Ubuntu服务器无虚拟网卡信息。将制作好的…

修改服务器超时时间,服务器超时时间设置

服务器超时时间设置 内容精选 换一换 在压测过程中能够提供自身性能数据的施压目标机器。管理执行机的节点。CPTS为用户的测试工程提供管理能力,事务、压测任务、测试报告的内容在同一个测试工程内共享复用,您可以为不同的测试项目创建不同的测试工程。事务是指用户自定义的操…

FinalShell连接超时解决方法

输入ipconfig查看是否自动更改了ip地址 如果ip地址有变动&#xff0c;在shell中更改 查看是否打开了vm服务 快捷键&#xff1a;win X 选择“计算机管理&#xff08;G&#xff09;” 下滑找到vm服务&#xff0c;如若关闭打开即可 查看是否打开vm网络连接 右键点击属性,勾选所示…

finalshell连接超时怎么办

错误提示&#xff1a;java.net.ConnectException: Connection timed out: connect 在Linux中输入ip addr 来查看ip地址是否还在 如果没有的话重启虚拟机&#xff0c;出现ip地址再进行ssh连接

光猫显示连接isp服务器超时,光猫链接isp服务器超时

光猫链接isp服务器超时 内容精选 换一换 若已有连接后端服务器超过请求超时时间没有请求传输后,ELB会将其断开。根据负载均衡器与后端服务器链接的协议不同,系统默认超时时间也不同,系统默认的超时时间如下。TCP协议:默认超时时间为300s。UDP协议:默认超时时间为10s。HTTP…

服务器时间修改连接超时时间设置,云服务器连接超时时间设置

云服务器连接超时时间设置 内容精选 换一换 配置高防IP服务后,网站执行某些POST请求时,长时间等待后返回504错误,执行不成功。此问题是由于请求处理时间过长,已超过高防IP服务的连接阈值,高防IP服务主动断开连接。TCP默认连接超时时间为900s。HTTP/WebSocket、HTTPS/WebSo…

putty连接服务器显示连接超时,putty连接云服务器超时连接

putty连接云服务器超时连接 内容精选 换一换 文档数据库服务提供使用数据管理服务(Data Admin Service,简称DAS)、内网和公网的连接方式。文档数据库服务默认为您开通了远程主机登录权限,推荐您使用更安全便捷的数据管理服务连接实例,具体请参见通过数据管理服务连接集群实例…

apex显示服务器连接超时,apex与服务器链接超时

apex与服务器链接超时 内容精选 换一换 使用mount命令挂载文件系统到云服务器,云服务器系统提示timed out。原因1:网络状态不稳定。原因2:网络连接异常。原因3:云服务器DNS配置错误,导致解析不到文件系统的域名,挂载失败。SFS Turbo文件系统不存在此问题。原因4:挂载的是…

光猫显示isp服务器断开,光猫连接isp服务器超时

光猫连接isp服务器超时 内容精选 换一换 在使用负载均衡服务时,确保至少有一台后端服务器在正常运行,可以接收负载均衡转发的客户端请求。如果请求的需求流量上升,用户需要向负载均衡器添加更多后端服务器处理需求。移除负载均衡器绑定的后端服务器,后端服务器将不再收到负…

网页 游戏服务器连接超时,连接游戏服务器超时怎么解决

连接游戏服务器超时怎么解决 内容精选 换一换 调用API出错后,将不会返回结果数据。调用方可根据每个API对应的错误码来定位错误原因。当调用出错时,HTTP请求返回一个4xx或5xx的HTTP状态码。返回的消息体中是具体的错误代码及错误信息。在调用方找不到错误原因时,可以联系客服…

【uniapp/hBuilder】使用部分插件(如uni-file-picker)后出现连接服务器超时的解决方法

在uniapp项目中&#xff0c;导入uni-file-picker等一些组件可能会使相关页面变成&#xff08;但是其他页面正常运行&#xff09;&#xff1a; 这是由于该组件需要你绑定uniapp的服务空间运行。&#xff08;当然也可以不绑定&#xff0c;你可以选择手动上传的方式&#xff09;…

uni-app 编译成H5页面运行,提示“连接服务器超时,请点击屏幕重试”

现象 参考文档&#xff1a; uni-app H5端 “网络不给力” 排查日记 备注&#xff1a; 不一定是网络问题&#xff0c;有可能是代码问题&#xff0c;不要被提示忽悠了&#xff0c;记得看控制台代码&#xff0c;代码报错解决了&#xff0c;报错也就解决了 history 模式。跳转页…

uniapp 发布h5后报错,连接服务器超时,点击屏幕重试

更新文件到linux 也更新不上去 解决方法&#xff1a; 文件目录层级太深了&#xff0c;直接把项目文件放到D盘

金蝶显示服务器连接超时,金蝶连接云服务器超时

金蝶连接云服务器超时 内容精选 换一换 当云服务器网络异常、防火墙未放行本地远程桌面端口、云服务器CPU负载过高等场景均可能导致云服务器无法正常登录。当您的云服务器无法远程登录时,我们建议您首先检查是否可以通过控制台远程登录。再参考排查思路检查登录异常的原因。远…

ios系统连接服务器超时时间,正则零宽导致iOS端uni-app报错:连接服务器超时,点击重试...

一个 H5 项目中使用安卓设备一切正常,用 iOS 就显示 连接服务器超时,点击屏幕重试。 排查了半天,原来是正则引起的。 可能会报以下错误: Invalid regular expression: invalid group specifier name [system] SyntaxError{} Info Warn Error SyntaxError: Invalid regular …

vmware虚拟机连接服务器超时,vmware连接远程服务器超时

vmware连接远程服务器超时 内容精选 换一换 已成功添加Guardian。如果Guardian处于在线状态,只允许修改Guardian名称。如果Guardian处于连接超时状态,可以输入登录远程服务器的用户名和密码重新部署Guardian。如果Guardian处于在线状态,只允许修改Guardian名称。如果Guardia…